1 | /* onsenui v2.12.2 - 2022-07-25 */
|
2 |
|
3 | (function (global, factory) {
|
4 | typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
5 | typeof define === 'function' && define.amd ? define(factory) :
|
6 | (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.ons = factory());
|
7 | })(this, (function () { 'use strict';
|
8 |
|
9 | function ownKeys(object, enumerableOnly) {
|
10 | var keys = Object.keys(object);
|
11 |
|
12 | if (Object.getOwnPropertySymbols) {
|
13 | var symbols = Object.getOwnPropertySymbols(object);
|
14 | enumerableOnly && (symbols = symbols.filter(function (sym) {
|
15 | return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
16 | })), keys.push.apply(keys, symbols);
|
17 | }
|
18 |
|
19 | return keys;
|
20 | }
|
21 |
|
22 | function _objectSpread2(target) {
|
23 | for (var i = 1; i < arguments.length; i++) {
|
24 | var source = null != arguments[i] ? arguments[i] : {};
|
25 | i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
|
26 | _defineProperty(target, key, source[key]);
|
27 | }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
|
28 | Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
29 | });
|
30 | }
|
31 |
|
32 | return target;
|
33 | }
|
34 |
|
35 | function _typeof(obj) {
|
36 | "@babel/helpers - typeof";
|
37 |
|
38 | return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
|
39 | return typeof obj;
|
40 | } : function (obj) {
|
41 | return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
42 | }, _typeof(obj);
|
43 | }
|
44 |
|
45 | function _classCallCheck(instance, Constructor) {
|
46 | if (!(instance instanceof Constructor)) {
|
47 | throw new TypeError("Cannot call a class as a function");
|
48 | }
|
49 | }
|
50 |
|
51 | function _defineProperties(target, props) {
|
52 | for (var i = 0; i < props.length; i++) {
|
53 | var descriptor = props[i];
|
54 | descriptor.enumerable = descriptor.enumerable || false;
|
55 | descriptor.configurable = true;
|
56 | if ("value" in descriptor) descriptor.writable = true;
|
57 | Object.defineProperty(target, descriptor.key, descriptor);
|
58 | }
|
59 | }
|
60 |
|
61 | function _createClass(Constructor, protoProps, staticProps) {
|
62 | if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
63 | if (staticProps) _defineProperties(Constructor, staticProps);
|
64 | Object.defineProperty(Constructor, "prototype", {
|
65 | writable: false
|
66 | });
|
67 | return Constructor;
|
68 | }
|
69 |
|
70 | function _defineProperty(obj, key, value) {
|
71 | if (key in obj) {
|
72 | Object.defineProperty(obj, key, {
|
73 | value: value,
|
74 | enumerable: true,
|
75 | configurable: true,
|
76 | writable: true
|
77 | });
|
78 | } else {
|
79 | obj[key] = value;
|
80 | }
|
81 |
|
82 | return obj;
|
83 | }
|
84 |
|
85 | function _inherits(subClass, superClass) {
|
86 | if (typeof superClass !== "function" && superClass !== null) {
|
87 | throw new TypeError("Super expression must either be null or a function");
|
88 | }
|
89 |
|
90 | subClass.prototype = Object.create(superClass && superClass.prototype, {
|
91 | constructor: {
|
92 | value: subClass,
|
93 | writable: true,
|
94 | configurable: true
|
95 | }
|
96 | });
|
97 | Object.defineProperty(subClass, "prototype", {
|
98 | writable: false
|
99 | });
|
100 | if (superClass) _setPrototypeOf(subClass, superClass);
|
101 | }
|
102 |
|
103 | function _getPrototypeOf(o) {
|
104 | _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {
|
105 | return o.__proto__ || Object.getPrototypeOf(o);
|
106 | };
|
107 | return _getPrototypeOf(o);
|
108 | }
|
109 |
|
110 | function _setPrototypeOf(o, p) {
|
111 | _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
|
112 | o.__proto__ = p;
|
113 | return o;
|
114 | };
|
115 | return _setPrototypeOf(o, p);
|
116 | }
|
117 |
|
118 | function _isNativeReflectConstruct() {
|
119 | if (typeof Reflect === "undefined" || !Reflect.construct) return false;
|
120 | if (Reflect.construct.sham) return false;
|
121 | if (typeof Proxy === "function") return true;
|
122 |
|
123 | try {
|
124 | Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
|
125 | return true;
|
126 | } catch (e) {
|
127 | return false;
|
128 | }
|
129 | }
|
130 |
|
131 | function _objectWithoutPropertiesLoose(source, excluded) {
|
132 | if (source == null) return {};
|
133 | var target = {};
|
134 | var sourceKeys = Object.keys(source);
|
135 | var key, i;
|
136 |
|
137 | for (i = 0; i < sourceKeys.length; i++) {
|
138 | key = sourceKeys[i];
|
139 | if (excluded.indexOf(key) >= 0) continue;
|
140 | target[key] = source[key];
|
141 | }
|
142 |
|
143 | return target;
|
144 | }
|
145 |
|
146 | function _objectWithoutProperties(source, excluded) {
|
147 | if (source == null) return {};
|
148 |
|
149 | var target = _objectWithoutPropertiesLoose(source, excluded);
|
150 |
|
151 | var key, i;
|
152 |
|
153 | if (Object.getOwnPropertySymbols) {
|
154 | var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
|
155 |
|
156 | for (i = 0; i < sourceSymbolKeys.length; i++) {
|
157 | key = sourceSymbolKeys[i];
|
158 | if (excluded.indexOf(key) >= 0) continue;
|
159 | if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
160 | target[key] = source[key];
|
161 | }
|
162 | }
|
163 |
|
164 | return target;
|
165 | }
|
166 |
|
167 | function _assertThisInitialized(self) {
|
168 | if (self === void 0) {
|
169 | throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
170 | }
|
171 |
|
172 | return self;
|
173 | }
|
174 |
|
175 | function _possibleConstructorReturn(self, call) {
|
176 | if (call && (typeof call === "object" || typeof call === "function")) {
|
177 | return call;
|
178 | } else if (call !== void 0) {
|
179 | throw new TypeError("Derived constructors may only return object or undefined");
|
180 | }
|
181 |
|
182 | return _assertThisInitialized(self);
|
183 | }
|
184 |
|
185 | function _createSuper(Derived) {
|
186 | var hasNativeReflectConstruct = _isNativeReflectConstruct();
|
187 |
|
188 | return function _createSuperInternal() {
|
189 | var Super = _getPrototypeOf(Derived),
|
190 | result;
|
191 |
|
192 | if (hasNativeReflectConstruct) {
|
193 | var NewTarget = _getPrototypeOf(this).constructor;
|
194 |
|
195 | result = Reflect.construct(Super, arguments, NewTarget);
|
196 | } else {
|
197 | result = Super.apply(this, arguments);
|
198 | }
|
199 |
|
200 | return _possibleConstructorReturn(this, result);
|
201 | };
|
202 | }
|
203 |
|
204 | function _superPropBase(object, property) {
|
205 | while (!Object.prototype.hasOwnProperty.call(object, property)) {
|
206 | object = _getPrototypeOf(object);
|
207 | if (object === null) break;
|
208 | }
|
209 |
|
210 | return object;
|
211 | }
|
212 |
|
213 | function _get() {
|
214 | if (typeof Reflect !== "undefined" && Reflect.get) {
|
215 | _get = Reflect.get.bind();
|
216 | } else {
|
217 | _get = function _get(target, property, receiver) {
|
218 | var base = _superPropBase(target, property);
|
219 |
|
220 | if (!base) return;
|
221 | var desc = Object.getOwnPropertyDescriptor(base, property);
|
222 |
|
223 | if (desc.get) {
|
224 | return desc.get.call(arguments.length < 3 ? target : receiver);
|
225 | }
|
226 |
|
227 | return desc.value;
|
228 | };
|
229 | }
|
230 |
|
231 | return _get.apply(this, arguments);
|
232 | }
|
233 |
|
234 | function _toConsumableArray(arr) {
|
235 | return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
|
236 | }
|
237 |
|
238 | function _arrayWithoutHoles(arr) {
|
239 | if (Array.isArray(arr)) return _arrayLikeToArray(arr);
|
240 | }
|
241 |
|
242 | function _iterableToArray(iter) {
|
243 | if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
244 | }
|
245 |
|
246 | function _unsupportedIterableToArray(o, minLen) {
|
247 | if (!o) return;
|
248 | if (typeof o === "string") return _arrayLikeToArray(o, minLen);
|
249 | var n = Object.prototype.toString.call(o).slice(8, -1);
|
250 | if (n === "Object" && o.constructor) n = o.constructor.name;
|
251 | if (n === "Map" || n === "Set") return Array.from(o);
|
252 | if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
253 | }
|
254 |
|
255 | function _arrayLikeToArray(arr, len) {
|
256 | if (len == null || len > arr.length) len = arr.length;
|
257 |
|
258 | for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
|
259 |
|
260 | return arr2;
|
261 | }
|
262 |
|
263 | function _nonIterableSpread() {
|
264 | throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
265 | }
|
266 |
|
267 | /*
|
268 | Copyright 2013-2015 ASIAL CORPORATION
|
269 |
|
270 | Licensed under the Apache License, Version 2.0 (the "License");
|
271 | you may not use this file except in compliance with the License.
|
272 | You may obtain a copy of the License at
|
273 |
|
274 | http://www.apache.org/licenses/LICENSE-2.0
|
275 |
|
276 | Unless required by applicable law or agreed to in writing, software
|
277 | distributed under the License is distributed on an "AS IS" BASIS,
|
278 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
279 | See the License for the specific language governing permissions and
|
280 | limitations under the License.
|
281 |
|
282 | */
|
283 | // Save HTMLElement object before Custom Elements polyfill patch global HTMLElement.
|
284 | var NativeHTMLElement = window.HTMLElement;
|
285 | /**
|
286 | * @object ons.platform
|
287 | * @category util
|
288 | * @description
|
289 | * [en]Utility methods to detect current platform.[/en]
|
290 | * [ja]現在実行されているプラットフォームを検知するためのユーティリティメソッドを収めたオブジェクトです。[/ja]
|
291 | */
|
292 |
|
293 | var Platform = /*#__PURE__*/function () {
|
294 | /**
|
295 | * All elements will be rendered as if the app was running on this platform.
|
296 | * @type {String}
|
297 | */
|
298 | function Platform() {
|
299 | _classCallCheck(this, Platform);
|
300 |
|
301 | this._selectedPlatform = null;
|
302 | this._ignorePlatformSelect = false;
|
303 | }
|
304 | /**
|
305 | * @method select
|
306 | * @signature select(platform)
|
307 | * @param {string} platform Name of the platform.
|
308 | * [en]Possible values are: "opera", "firefox", "safari", "chrome", "ie", "android", "blackberry", "ios" or "wp".[/en]
|
309 | * [ja]"opera", "firefox", "safari", "chrome", "ie", "android", "blackberry", "ios", "wp"のいずれかを指定します。[/ja]
|
310 | * @description
|
311 | * [en]Sets the platform used to render the elements. Useful for testing.[/en]
|
312 | * [ja]要素を描画するために利用するプラットフォーム名を設定します。テストに便利です。[/ja]
|
313 | */
|
314 |
|
315 |
|
316 | _createClass(Platform, [{
|
317 | key: "select",
|
318 | value: function select(platform) {
|
319 | if (typeof platform === 'string') {
|
320 | this._selectedPlatform = platform.trim().toLowerCase();
|
321 | }
|
322 | }
|
323 | }, {
|
324 | key: "_getSelectedPlatform",
|
325 | value: function _getSelectedPlatform() {
|
326 | return this._ignorePlatformSelect ? null : this._selectedPlatform;
|
327 | }
|
328 | }, {
|
329 | key: "_runOnActualPlatform",
|
330 | value: function _runOnActualPlatform(fn) {
|
331 | this._ignorePlatformSelect = true;
|
332 | var result = fn();
|
333 | this._ignorePlatformSelect = false;
|
334 | return result;
|
335 | } //----------------
|
336 | // General
|
337 | //----------------
|
338 |
|
339 | /**
|
340 | * @method isWebView
|
341 | * @signature isWebView()
|
342 | * @description
|
343 | * [en]Returns whether app is running in Cordova.[/en]
|
344 | * [ja]Cordova内で実行されているかどうかを返します。[/ja]
|
345 | * @return {Boolean}
|
346 | */
|
347 |
|
348 | }, {
|
349 | key: "isWebView",
|
350 | value: function isWebView() {
|
351 | if (document.readyState === 'loading' || document.readyState == 'uninitialized') {
|
352 | throw new Error('isWebView() method is available after dom contents loaded.');
|
353 | }
|
354 |
|
355 | return !!(window.cordova || window.phonegap || window.PhoneGap);
|
356 | } //----------------
|
357 | // iOS devices
|
358 | //----------------
|
359 |
|
360 | /**
|
361 | * @method isIPhone
|
362 | * @signature isIPhone()
|
363 | * @description
|
364 | * [en]Returns whether the device is iPhone.[/en]
|
365 | * [ja]iPhone上で実行されているかどうかを返します。[/ja]
|
366 | * @return {Boolean}
|
367 | */
|
368 |
|
369 | }, {
|
370 | key: "isIPhone",
|
371 | value: function isIPhone() {
|
372 | return /iPhone/i.test(navigator.userAgent);
|
373 | }
|
374 | /**
|
375 | * @method isIPhoneX
|
376 | * @signature isIPhoneX()
|
377 | * @description
|
378 | * [en]Returns whether the device is iPhone X, XS, XS Max, XR, 11, 11 Pro, 11 Pro Max, 12 Mini, 12, 12 Pro or 12 Pro Max.[/en]
|
379 | * [ja]iPhone X や XS、XS Max、XR、11、11 Pro、11 Pro Max、12 Mini、12、12 Pro、または12 Pro Max上で実行されているかどうかを返します。[/ja]
|
380 | * @return {Boolean}
|
381 | */
|
382 |
|
383 | }, {
|
384 | key: "isIPhoneX",
|
385 | value: function isIPhoneX() {
|
386 | // iOS WebViews on the same iOS version have the same user agent.
|
387 | // We cannot avoid using window.screen.
|
388 | // We also cannot use cordova-plugin-device since its behavior is different between simulators and real devices.
|
389 | // This works well both in iOS Safari and (UI|WK)WebView of iPhone X.
|
390 | return this.isIPhone() && ( // X, XS, 11 Pro, 12 Mini
|
391 | window.screen.width === 375 && window.screen.height === 812 || // portrait
|
392 | window.screen.width === 812 && window.screen.height === 375 || // landscape
|
393 | // XS Max, XR, 11, 11 Pro Max
|
394 | window.screen.width === 414 && window.screen.height === 896 || // portrait
|
395 | window.screen.width === 896 && window.screen.height === 414 || // landscape
|
396 | // 12, 12 Pro
|
397 | window.screen.width === 390 && window.screen.height === 844 || // portrait
|
398 | window.screen.width === 844 && window.screen.height === 390 || // landscape
|
399 | // 12 Pro Max
|
400 | window.screen.width === 428 && window.screen.height === 926 || // portrait
|
401 | window.screen.width === 926 && window.screen.height === 428 // landscape
|
402 | );
|
403 | }
|
404 | /**
|
405 | * @method isIPad
|
406 | * @signature isIPad()
|
407 | * @description
|
408 | * [en]Returns whether the device is iPad.[/en]
|
409 | * [ja]iPad上で実行されているかどうかを返します。[/ja]
|
410 | * @return {Boolean}
|
411 | */
|
412 |
|
413 | }, {
|
414 | key: "isIPad",
|
415 | value: function isIPad() {
|
416 | return /iPad/i.test(navigator.userAgent) || this.isIPadOS();
|
417 | }
|
418 | /**
|
419 | * @return {Boolean}
|
420 | */
|
421 |
|
422 | }, {
|
423 | key: "isIPod",
|
424 | value: function isIPod() {
|
425 | return /iPod/i.test(navigator.userAgent);
|
426 | } //----------------
|
427 | // iOS versions
|
428 | //----------------
|
429 |
|
430 | /**
|
431 | * @method isIOS
|
432 | * @signature isIOS([forceActualPlatform])
|
433 | * @param {Boolean} forceActualPlatform
|
434 | * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
|
435 | * [ja][/ja]
|
436 | * @description
|
437 | * [en]Returns whether the OS is iOS. By default will return manually selected platform if it is set.[/en]
|
438 | * [ja]iOS上で実行されているかどうかを返します。[/ja]
|
439 | * @return {Boolean}
|
440 | */
|
441 |
|
442 | }, {
|
443 | key: "isIOS",
|
444 | value: function isIOS(forceActualPlatform) {
|
445 | if (!forceActualPlatform && this._getSelectedPlatform()) {
|
446 | return this._getSelectedPlatform() === 'ios';
|
447 | }
|
448 |
|
449 | if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object' && !/browser/i.test(device.platform)) {
|
450 | return /iOS/i.test(device.platform);
|
451 | } else {
|
452 | return /iPhone|iPad|iPod/i.test(navigator.userAgent) || this.isIPadOS();
|
453 | }
|
454 | }
|
455 | /**
|
456 | * @method isIOS7above
|
457 | * @signature isIOS7above()
|
458 | * @description
|
459 | * [en]Returns whether the iOS version is 7 or above.[/en]
|
460 | * [ja]iOS7以上で実行されているかどうかを返します。[/ja]
|
461 | * @return {Boolean}
|
462 | */
|
463 |
|
464 | }, {
|
465 | key: "isIOS7above",
|
466 | value: function isIOS7above() {
|
467 | if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object' && !/browser/i.test(device.platform)) {
|
468 | return /iOS/i.test(device.platform) && parseInt(device.version.split('.')[0]) >= 7;
|
469 | } else if (/iPhone|iPad|iPod/i.test(navigator.userAgent)) {
|
470 | var ver = (navigator.userAgent.match(/\b[0-9]+_[0-9]+(?:_[0-9]+)?\b/) || [''])[0].replace(/_/g, '.');
|
471 | return parseInt(ver.split('.')[0]) >= 7;
|
472 | }
|
473 |
|
474 | return false;
|
475 | }
|
476 | /**
|
477 | * @method isIPadOS
|
478 | * @signature isIPadOS()
|
479 | * @description
|
480 | * [en]Returns whether the OS is iPadOS.[/en]
|
481 | * [ja][/ja]
|
482 | * @return {Boolean}
|
483 | */
|
484 |
|
485 | }, {
|
486 | key: "isIPadOS",
|
487 | value: function isIPadOS() {
|
488 | // The iPadOS User Agent string is the same as MacOS so as a
|
489 | // workaround we test the max touch points, which is 5 for
|
490 | // iPads and 0 for desktop browsers.
|
491 | return !!(/Macintosh/i.test(navigator.userAgent) && navigator.maxTouchPoints && navigator.maxTouchPoints === 5);
|
492 | } //----------------
|
493 | // iOS browsers
|
494 | //----------------
|
495 |
|
496 | /**
|
497 | * @method isIOSSafari
|
498 | * @signature isIOSSafari()
|
499 | * @description
|
500 | * [en]Returns whether app is running in iOS Safari.[/en]
|
501 | * [ja]iOS Safariで実行されているかどうかを返します。[/ja]
|
502 | * @return {Boolean}
|
503 | */
|
504 |
|
505 | }, {
|
506 | key: "isIOSSafari",
|
507 | value: function isIOSSafari() {
|
508 | var navigator = window.navigator;
|
509 | var ua = navigator.userAgent;
|
510 | return !!(this.isIOS() && ua.indexOf('Safari') !== -1 && ua.indexOf('Version') !== -1 && !navigator.standalone);
|
511 | }
|
512 | /**
|
513 | * @method isWKWebView
|
514 | * @signature isWKWebView()
|
515 | * @description
|
516 | * [en]Returns whether app is running in WKWebView.[/en]
|
517 | * [ja]WKWebViewで実行されているかどうかを返します。[/ja]
|
518 | * @return {Boolean}
|
519 | */
|
520 |
|
521 | }, {
|
522 | key: "isWKWebView",
|
523 | value: function isWKWebView() {
|
524 | var lte9 = /constructor/i.test(NativeHTMLElement);
|
525 | return !!(this.isIOS() && window.webkit && window.webkit.messageHandlers && window.indexedDB && !lte9);
|
526 | } //----------------
|
527 | // Android devices
|
528 | //----------------
|
529 |
|
530 | /**
|
531 | * @method isAndroidPhone
|
532 | * @signature isAndroidPhone()
|
533 | * @description
|
534 | * [en]Returns whether the device is Android phone.[/en]
|
535 | * [ja]Android携帯上で実行されているかどうかを返します。[/ja]
|
536 | * @return {Boolean}
|
537 | */
|
538 |
|
539 | }, {
|
540 | key: "isAndroidPhone",
|
541 | value: function isAndroidPhone() {
|
542 | return /Android/i.test(navigator.userAgent) && /Mobile/i.test(navigator.userAgent);
|
543 | }
|
544 | /**
|
545 | * @method isAndroidTablet
|
546 | * @signature isAndroidTablet()
|
547 | * @description
|
548 | * [en]Returns whether the device is Android tablet.[/en]
|
549 | * [ja]Androidタブレット上で実行されているかどうかを返します。[/ja]
|
550 | * @return {Boolean}
|
551 | */
|
552 |
|
553 | }, {
|
554 | key: "isAndroidTablet",
|
555 | value: function isAndroidTablet() {
|
556 | return /Android/i.test(navigator.userAgent) && !/Mobile/i.test(navigator.userAgent);
|
557 | } //----------------
|
558 | // Android versions
|
559 | //----------------
|
560 |
|
561 | /**
|
562 | * @method isAndroid
|
563 | * @signature isAndroid([forceActualPlatform])
|
564 | * @param {Boolean} forceActualPlatform
|
565 | * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
|
566 | * [ja][/ja]
|
567 | * @description
|
568 | * [en]Returns whether the OS is Android. By default will return manually selected platform if it is set.[/en]
|
569 | * [ja]Android上で実行されているかどうかを返します。[/ja]
|
570 | * @return {Boolean}
|
571 | */
|
572 |
|
573 | }, {
|
574 | key: "isAndroid",
|
575 | value: function isAndroid(forceActualPlatform) {
|
576 | if (!forceActualPlatform && this._getSelectedPlatform()) {
|
577 | return this._getSelectedPlatform() === 'android';
|
578 | }
|
579 |
|
580 | if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object' && !/browser/i.test(device.platform)) {
|
581 | return /Android/i.test(device.platform);
|
582 | } else {
|
583 | return /Android/i.test(navigator.userAgent);
|
584 | }
|
585 | } //----------------
|
586 | // Other devices
|
587 | //----------------
|
588 |
|
589 | /**
|
590 | * @method isWP
|
591 | * @signature isWP([forceActualPlatform])
|
592 | * @param {Boolean} forceActualPlatform
|
593 | * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
|
594 | * [ja][/ja]
|
595 | * @description
|
596 | * [en]Returns whether the OS is Windows phone. By default will return manually selected platform if it is set.[/en]
|
597 | * [ja][/ja]
|
598 | * @return {Boolean}
|
599 | */
|
600 |
|
601 | }, {
|
602 | key: "isWP",
|
603 | value: function isWP(forceActualPlatform) {
|
604 | if (!forceActualPlatform && this._getSelectedPlatform()) {
|
605 | return this._getSelectedPlatform() === 'wp';
|
606 | }
|
607 |
|
608 | if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object' && !/browser/i.test(device.platform)) {
|
609 | return /Win32NT|WinCE/i.test(device.platform);
|
610 | } else {
|
611 | return /Windows Phone|IEMobile|WPDesktop/i.test(navigator.userAgent);
|
612 | }
|
613 | }
|
614 | /**
|
615 | * @method isBlackBerry
|
616 | * @signature isBlackBerry([forceActualPlatform])
|
617 | * @param {Boolean} forceActualPlatform
|
618 | * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
|
619 | * [ja][/ja]
|
620 | * @description
|
621 | * [en]Returns whether the device is BlackBerry. By default will return manually selected platform if it is set.[/en]
|
622 | * [ja]BlackBerry上で実行されているかどうかを返します。[/ja]
|
623 | * @return {Boolean}
|
624 | */
|
625 |
|
626 | }, {
|
627 | key: "isBlackBerry",
|
628 | value: function isBlackBerry(forceActualPlatform) {
|
629 | if (!forceActualPlatform && this._getSelectedPlatform()) {
|
630 | return this._getSelectedPlatform() === 'blackberry';
|
631 | }
|
632 |
|
633 | if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object' && !/browser/i.test(device.platform)) {
|
634 | return /BlackBerry/i.test(device.platform);
|
635 | } else {
|
636 | return /BlackBerry|RIM Tablet OS|BB10/i.test(navigator.userAgent);
|
637 | }
|
638 | } //----------------
|
639 | // Other browsers
|
640 | //----------------
|
641 |
|
642 | /**
|
643 | * @method isOpera
|
644 | * @signature isOpera([forceActualPlatform])
|
645 | * @param {Boolean} forceActualPlatform
|
646 | * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
|
647 | * [ja][/ja]
|
648 | * @description
|
649 | * [en]Returns whether the browser is Opera. By default will return manually selected platform if it is set.[/en]
|
650 | * [ja]Opera上で実行されているかどうかを返します。[/ja]
|
651 | * @return {Boolean}
|
652 | */
|
653 |
|
654 | }, {
|
655 | key: "isOpera",
|
656 | value: function isOpera(forceActualPlatform) {
|
657 | if (!forceActualPlatform && this._getSelectedPlatform()) {
|
658 | return this._getSelectedPlatform() === 'opera';
|
659 | }
|
660 |
|
661 | return !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
|
662 | }
|
663 | /**
|
664 | * @method isFirefox
|
665 | * @signature isFirefox([forceActualPlatform])
|
666 | * @param {Boolean} forceActualPlatform
|
667 | * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
|
668 | * [ja][/ja]
|
669 | * @description
|
670 | * [en]Returns whether the browser is Firefox. By default will return manually selected platform if it is set.[/en]
|
671 | * [ja]Firefox上で実行されているかどうかを返します。[/ja]
|
672 | * @return {Boolean}
|
673 | */
|
674 |
|
675 | }, {
|
676 | key: "isFirefox",
|
677 | value: function isFirefox(forceActualPlatform) {
|
678 | if (!forceActualPlatform && this._getSelectedPlatform()) {
|
679 | return this._getSelectedPlatform() === 'firefox';
|
680 | }
|
681 |
|
682 | return typeof InstallTrigger !== 'undefined';
|
683 | }
|
684 | /**
|
685 | * @method isSafari
|
686 | * @signature isSafari([forceActualPlatform])
|
687 | * @param {Boolean} forceActualPlatform
|
688 | * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
|
689 | * [ja][/ja]
|
690 | * @description
|
691 | * [en]Returns whether the browser is Safari. By default will return manually selected platform if it is set.[/en]
|
692 | * [ja]Safari上で実行されているかどうかを返します。[/ja]
|
693 | * @return {Boolean}
|
694 | */
|
695 |
|
696 | }, {
|
697 | key: "isSafari",
|
698 | value: function isSafari(forceActualPlatform) {
|
699 | if (!forceActualPlatform && this._getSelectedPlatform()) {
|
700 | return this._getSelectedPlatform() === 'safari';
|
701 | }
|
702 |
|
703 | return Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0 || function (p) {
|
704 | return p.toString() === '[object SafariRemoteNotification]';
|
705 | }(!window['safari'] || safari.pushNotification);
|
706 | }
|
707 | /**
|
708 | * @method isChrome
|
709 | * @signature isChrome([forceActualPlatform])
|
710 | * @param {Boolean} forceActualPlatform
|
711 | * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
|
712 | * [ja][/ja]
|
713 | * @description
|
714 | * [en]Returns whether the browser is Chrome. By default will return manually selected platform if it is set.[/en]
|
715 | * [ja]Chrome上で実行されているかどうかを返します。[/ja]
|
716 | * @return {Boolean}
|
717 | */
|
718 |
|
719 | }, {
|
720 | key: "isChrome",
|
721 | value: function isChrome(forceActualPlatform) {
|
722 | if (!forceActualPlatform && this._getSelectedPlatform()) {
|
723 | return this._getSelectedPlatform() === 'chrome';
|
724 | }
|
725 |
|
726 | return !!window.chrome && !(!!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0) && !(navigator.userAgent.indexOf(' Edge/') >= 0);
|
727 | }
|
728 | /**
|
729 | * @method isIE
|
730 | * @signature isIE([forceActualPlatform])
|
731 | * @param {Boolean} forceActualPlatform
|
732 | * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
|
733 | * [ja][/ja]
|
734 | * @description
|
735 | * [en]Returns whether the browser is Internet Explorer. By default will return manually selected platform if it is set.[/en]
|
736 | * [ja]Internet Explorer上で実行されているかどうかを返します。[/ja]
|
737 | * @return {Boolean}
|
738 | */
|
739 |
|
740 | }, {
|
741 | key: "isIE",
|
742 | value: function isIE(forceActualPlatform) {
|
743 | if (!forceActualPlatform && this._getSelectedPlatform()) {
|
744 | return this._getSelectedPlatform() === 'ie';
|
745 | }
|
746 |
|
747 | return !!document.documentMode;
|
748 | }
|
749 | /**
|
750 | * @method isEdge
|
751 | * @signature isEdge([forceActualPlatform])
|
752 | * @param {Boolean} forceActualPlatform
|
753 | * [en]If true, selected platform is ignored and the actual platform is returned.[/en]
|
754 | * [ja][/ja]
|
755 | * @description
|
756 | * [en]Returns whether the browser is Edge. By default will return manually selected platform if it is set.[/en]
|
757 | * [ja]Edge上で実行されているかどうかを返します。[/ja]
|
758 | * @return {Boolean}
|
759 | */
|
760 |
|
761 | }, {
|
762 | key: "isEdge",
|
763 | value: function isEdge(forceActualPlatform) {
|
764 | if (!forceActualPlatform && this._getSelectedPlatform()) {
|
765 | return this._getSelectedPlatform() === 'edge';
|
766 | }
|
767 |
|
768 | return navigator.userAgent.indexOf(' Edge/') >= 0;
|
769 | } //----------------
|
770 | // Utility functions
|
771 | //----------------
|
772 |
|
773 | /**
|
774 | * @return {String}
|
775 | */
|
776 |
|
777 | }, {
|
778 | key: "getMobileOS",
|
779 | value: function getMobileOS() {
|
780 | if (this.isAndroid()) {
|
781 | return 'android';
|
782 | } else if (this.isIOS()) {
|
783 | return 'ios';
|
784 | } else if (this.isWP()) {
|
785 | return 'wp';
|
786 | } else {
|
787 | return 'other';
|
788 | }
|
789 | }
|
790 | /**
|
791 | * @return {String}
|
792 | */
|
793 |
|
794 | }, {
|
795 | key: "getIOSDevice",
|
796 | value: function getIOSDevice() {
|
797 | if (this.isIPhone()) {
|
798 | return 'iphone';
|
799 | } else if (this.isIPad()) {
|
800 | return 'ipad';
|
801 | } else if (this.isIPod()) {
|
802 | return 'ipod';
|
803 | } else {
|
804 | return 'na';
|
805 | }
|
806 | }
|
807 | }]);
|
808 |
|
809 | return Platform;
|
810 | }();
|
811 |
|
812 | var platform = new Platform();
|
813 |
|
814 | // For @onsenui/custom-elements
|
815 | if (window.customElements) {
|
816 | // even if native CE1 impl exists, use polyfill
|
817 | window.customElements.forcePolyfill = true;
|
818 | }
|
819 |
|
820 | (function () {
|
821 |
|
822 | var g = new function () {}();
|
823 | var aa = new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));
|
824 |
|
825 | function k(b) {
|
826 | var a = aa.has(b);
|
827 | b = /^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(b);
|
828 | return !a && b;
|
829 | }
|
830 |
|
831 | function l(b) {
|
832 | var a = b.isConnected;
|
833 | if (void 0 !== a) return a;
|
834 |
|
835 | for (; b && !(b.__CE_isImportDocument || b instanceof Document);) {
|
836 | b = b.parentNode || (window.ShadowRoot && b instanceof ShadowRoot ? b.host : void 0);
|
837 | }
|
838 |
|
839 | return !(!b || !(b.__CE_isImportDocument || b instanceof Document));
|
840 | }
|
841 |
|
842 | function m(b, a) {
|
843 | for (; a && a !== b && !a.nextSibling;) {
|
844 | a = a.parentNode;
|
845 | }
|
846 |
|
847 | return a && a !== b ? a.nextSibling : null;
|
848 | }
|
849 |
|
850 | function n(b, a, e) {
|
851 | e = e ? e : new Set();
|
852 |
|
853 | for (var c = b; c;) {
|
854 | if (c.nodeType === Node.ELEMENT_NODE) {
|
855 | var d = c;
|
856 | a(d);
|
857 | var h = d.localName;
|
858 |
|
859 | if ("link" === h && "import" === d.getAttribute("rel")) {
|
860 | c = d.import;
|
861 | if (c instanceof Node && !e.has(c)) for (e.add(c), c = c.firstChild; c; c = c.nextSibling) {
|
862 | n(c, a, e);
|
863 | }
|
864 | c = m(b, d);
|
865 | continue;
|
866 | } else if ("template" === h) {
|
867 | c = m(b, d);
|
868 | continue;
|
869 | }
|
870 |
|
871 | if (d = d.__CE_shadowRoot) for (d = d.firstChild; d; d = d.nextSibling) {
|
872 | n(d, a, e);
|
873 | }
|
874 | }
|
875 |
|
876 | c = c.firstChild ? c.firstChild : m(b, c);
|
877 | }
|
878 | }
|
879 |
|
880 | function q(b, a, e) {
|
881 | b[a] = e;
|
882 | }
|
883 |
|
884 | function r() {
|
885 | this.a = new Map();
|
886 | this.f = new Map();
|
887 | this.c = [];
|
888 | this.b = !1;
|
889 | }
|
890 |
|
891 | function ba(b, a, e) {
|
892 | b.a.set(a, e);
|
893 | b.f.set(e.constructor, e);
|
894 | }
|
895 |
|
896 | function t(b, a) {
|
897 | b.b = !0;
|
898 | b.c.push(a);
|
899 | }
|
900 |
|
901 | function v(b, a) {
|
902 | b.b && n(a, function (a) {
|
903 | return w(b, a);
|
904 | });
|
905 | }
|
906 |
|
907 | function w(b, a) {
|
908 | if (b.b && !a.__CE_patched) {
|
909 | a.__CE_patched = !0;
|
910 |
|
911 | for (var e = 0; e < b.c.length; e++) {
|
912 | b.c[e](a);
|
913 | }
|
914 | }
|
915 | }
|
916 |
|
917 | function x(b, a) {
|
918 | var e = [];
|
919 | n(a, function (b) {
|
920 | return e.push(b);
|
921 | });
|
922 |
|
923 | for (a = 0; a < e.length; a++) {
|
924 | var c = e[a];
|
925 | 1 === c.__CE_state ? l(c) && b.connectedCallback(c) : y(b, c);
|
926 | }
|
927 | }
|
928 |
|
929 | function z(b, a) {
|
930 | var e = [];
|
931 | n(a, function (b) {
|
932 | return e.push(b);
|
933 | });
|
934 |
|
935 | for (a = 0; a < e.length; a++) {
|
936 | var c = e[a];
|
937 | 1 === c.__CE_state && b.disconnectedCallback(c);
|
938 | }
|
939 | }
|
940 |
|
941 | function A(b, a, e) {
|
942 | e = e ? e : new Set();
|
943 | var c = [];
|
944 | n(a, function (d) {
|
945 | if ("link" === d.localName && "import" === d.getAttribute("rel")) {
|
946 | var a = d.import;
|
947 | a instanceof Node && "complete" === a.readyState ? (a.__CE_isImportDocument = !0, a.__CE_hasRegistry = !0) : d.addEventListener("load", function () {
|
948 | var a = d.import;
|
949 | a.__CE_documentLoadHandled || (a.__CE_documentLoadHandled = !0, a.__CE_isImportDocument = !0, a.__CE_hasRegistry = !0, e.delete(a), A(b, a, e));
|
950 | });
|
951 | } else c.push(d);
|
952 | }, e);
|
953 | if (b.b) for (a = 0; a < c.length; a++) {
|
954 | w(b, c[a]);
|
955 | }
|
956 |
|
957 | for (a = 0; a < c.length; a++) {
|
958 | y(b, c[a]);
|
959 | }
|
960 | }
|
961 |
|
962 | function y(b, a) {
|
963 | if (void 0 === a.__CE_state) {
|
964 | var e = b.a.get(a.localName);
|
965 |
|
966 | if (e) {
|
967 | e.constructionStack.push(a);
|
968 | var c = e.constructor;
|
969 |
|
970 | try {
|
971 | try {
|
972 | if (new c() !== a) throw Error("The custom element constructor did not produce the element being upgraded.");
|
973 | } finally {
|
974 | e.constructionStack.pop();
|
975 | }
|
976 | } catch (f) {
|
977 | throw a.__CE_state = 2, f;
|
978 | }
|
979 |
|
980 | a.__CE_state = 1;
|
981 | a.__CE_definition = e;
|
982 | if (e.attributeChangedCallback) for (e = e.observedAttributes, c = 0; c < e.length; c++) {
|
983 | var d = e[c],
|
984 | h = a.getAttribute(d);
|
985 | null !== h && b.attributeChangedCallback(a, d, null, h, null);
|
986 | }
|
987 | l(a) && b.connectedCallback(a);
|
988 | }
|
989 | }
|
990 | }
|
991 |
|
992 | r.prototype.connectedCallback = function (b) {
|
993 | var a = b.__CE_definition;
|
994 | a.connectedCallback && a.connectedCallback.call(b);
|
995 | b.i = !0;
|
996 | };
|
997 |
|
998 | r.prototype.disconnectedCallback = function (b) {
|
999 | b.i || this.connectedCallback(b);
|
1000 | var a = b.__CE_definition;
|
1001 | a.disconnectedCallback && a.disconnectedCallback.call(b);
|
1002 | b.i = void 0;
|
1003 | };
|
1004 |
|
1005 | r.prototype.attributeChangedCallback = function (b, a, e, c, d) {
|
1006 | var h = b.__CE_definition;
|
1007 | h.attributeChangedCallback && -1 < h.observedAttributes.indexOf(a) && h.attributeChangedCallback.call(b, a, e, c, d);
|
1008 | };
|
1009 |
|
1010 | function B(b, a) {
|
1011 | this.c = b;
|
1012 | this.a = a;
|
1013 | this.b = void 0;
|
1014 | A(this.c, this.a);
|
1015 | "loading" === this.a.readyState && (this.b = new MutationObserver(this.f.bind(this)), this.b.observe(this.a, {
|
1016 | childList: !0,
|
1017 | subtree: !0
|
1018 | }));
|
1019 | }
|
1020 |
|
1021 | function C(b) {
|
1022 | b.b && b.b.disconnect();
|
1023 | }
|
1024 |
|
1025 | B.prototype.f = function (b) {
|
1026 | var a = this.a.readyState;
|
1027 | "interactive" !== a && "complete" !== a || C(this);
|
1028 |
|
1029 | for (a = 0; a < b.length; a++) {
|
1030 | for (var e = b[a].addedNodes, c = 0; c < e.length; c++) {
|
1031 | A(this.c, e[c]);
|
1032 | }
|
1033 | }
|
1034 | };
|
1035 |
|
1036 | function ca() {
|
1037 | var b = this;
|
1038 | this.b = this.a = void 0;
|
1039 | this.c = new Promise(function (a) {
|
1040 | b.b = a;
|
1041 | b.a && a(b.a);
|
1042 | });
|
1043 | }
|
1044 |
|
1045 | function D(b) {
|
1046 | if (b.a) throw Error("Already resolved.");
|
1047 | b.a = void 0;
|
1048 | b.b && b.b(void 0);
|
1049 | }
|
1050 |
|
1051 | function E(b) {
|
1052 | this.f = !1;
|
1053 | this.a = b;
|
1054 | this.h = new Map();
|
1055 |
|
1056 | this.g = function (b) {
|
1057 | return b();
|
1058 | };
|
1059 |
|
1060 | this.b = !1;
|
1061 | this.c = [];
|
1062 | this.l = new B(b, document);
|
1063 | }
|
1064 |
|
1065 | E.prototype.m = function (b, a) {
|
1066 | var e = this;
|
1067 | if (!(a instanceof Function)) throw new TypeError("Custom element constructors must be functions.");
|
1068 | if (!k(b)) throw new SyntaxError("The element name '" + b + "' is not valid.");
|
1069 | if (this.a.a.get(b)) throw Error("A custom element with name '" + b + "' has already been defined.");
|
1070 | if (this.f) throw Error("A custom element is already being defined.");
|
1071 | this.f = !0;
|
1072 | var c, d, h, f, u;
|
1073 |
|
1074 | try {
|
1075 | var p = function p(b) {
|
1076 | var a = P[b];
|
1077 | if (void 0 !== a && !(a instanceof Function)) throw Error("The '" + b + "' callback must be a function.");
|
1078 | return a;
|
1079 | },
|
1080 | P = a.prototype;
|
1081 |
|
1082 | if (!(P instanceof Object)) throw new TypeError("The custom element constructor's prototype is not an object.");
|
1083 | c = p("connectedCallback");
|
1084 | d = p("disconnectedCallback");
|
1085 | h = p("adoptedCallback");
|
1086 | f = p("attributeChangedCallback");
|
1087 | u = a.observedAttributes || [];
|
1088 | } catch (va) {
|
1089 | return;
|
1090 | } finally {
|
1091 | this.f = !1;
|
1092 | }
|
1093 |
|
1094 | ba(this.a, b, {
|
1095 | localName: b,
|
1096 | constructor: a,
|
1097 | connectedCallback: c,
|
1098 | disconnectedCallback: d,
|
1099 | adoptedCallback: h,
|
1100 | attributeChangedCallback: f,
|
1101 | observedAttributes: u,
|
1102 | constructionStack: []
|
1103 | });
|
1104 | this.c.push(b);
|
1105 | this.b || (this.b = !0, this.g(function () {
|
1106 | if (!1 !== e.b) for (e.b = !1, A(e.a, document); 0 < e.c.length;) {
|
1107 | var b = e.c.shift();
|
1108 | (b = e.h.get(b)) && D(b);
|
1109 | }
|
1110 | }));
|
1111 | };
|
1112 |
|
1113 | E.prototype.get = function (b) {
|
1114 | if (b = this.a.a.get(b)) return b.constructor;
|
1115 | };
|
1116 |
|
1117 | E.prototype.s = function (b) {
|
1118 | if (!k(b)) return Promise.reject(new SyntaxError("'" + b + "' is not a valid custom element name."));
|
1119 | var a = this.h.get(b);
|
1120 | if (a) return a.c;
|
1121 | a = new ca();
|
1122 | this.h.set(b, a);
|
1123 | this.a.a.get(b) && -1 === this.c.indexOf(b) && D(a);
|
1124 | return a.c;
|
1125 | };
|
1126 |
|
1127 | E.prototype.o = function (b) {
|
1128 | C(this.l);
|
1129 | var a = this.g;
|
1130 |
|
1131 | this.g = function (e) {
|
1132 | return b(function () {
|
1133 | return a(e);
|
1134 | });
|
1135 | };
|
1136 | };
|
1137 |
|
1138 | window.CustomElementRegistry = E;
|
1139 | E.prototype.define = E.prototype.m;
|
1140 | E.prototype.get = E.prototype.get;
|
1141 | E.prototype.whenDefined = E.prototype.s;
|
1142 | E.prototype.polyfillWrapFlushCallback = E.prototype.o;
|
1143 | var F = window.Document.prototype.createElement,
|
1144 | da = window.Document.prototype.createElementNS,
|
1145 | ea = window.Document.prototype.importNode,
|
1146 | fa = window.Document.prototype.prepend,
|
1147 | ga = window.Document.prototype.append,
|
1148 | G = window.Node.prototype.cloneNode,
|
1149 | H = window.Node.prototype.appendChild,
|
1150 | I = window.Node.prototype.insertBefore,
|
1151 | J = window.Node.prototype.removeChild,
|
1152 | K = window.Node.prototype.replaceChild,
|
1153 | L = Object.getOwnPropertyDescriptor(window.Node.prototype, "textContent"),
|
1154 | M = window.Element.prototype.attachShadow,
|
1155 | N = Object.getOwnPropertyDescriptor(window.Element.prototype, "innerHTML"),
|
1156 | O = window.Element.prototype.getAttribute,
|
1157 | Q = window.Element.prototype.setAttribute,
|
1158 | R = window.Element.prototype.removeAttribute,
|
1159 | S = window.Element.prototype.getAttributeNS,
|
1160 | T = window.Element.prototype.setAttributeNS,
|
1161 | U = window.Element.prototype.removeAttributeNS,
|
1162 | V = window.Element.prototype.insertAdjacentElement,
|
1163 | ha = window.Element.prototype.prepend,
|
1164 | ia = window.Element.prototype.append,
|
1165 | ja = window.Element.prototype.before,
|
1166 | ka = window.Element.prototype.after,
|
1167 | la = window.Element.prototype.replaceWith,
|
1168 | ma = window.Element.prototype.remove,
|
1169 | na = window.HTMLElement,
|
1170 | W = Object.getOwnPropertyDescriptor(window.HTMLElement.prototype, "innerHTML"),
|
1171 | X = window.HTMLElement.prototype.insertAdjacentElement;
|
1172 |
|
1173 | function oa() {
|
1174 | var b = Y;
|
1175 |
|
1176 | window.HTMLElement = function () {
|
1177 | function a() {
|
1178 | var a = this.constructor,
|
1179 | c = b.f.get(a);
|
1180 | if (!c) throw Error("The custom element being constructed was not registered with `customElements`.");
|
1181 | var d = c.constructionStack;
|
1182 | if (!d.length) return d = F.call(document, c.localName), Object.setPrototypeOf(d, a.prototype), d.__CE_state = 1, d.__CE_definition = c, w(b, d), d;
|
1183 | var c = d.length - 1,
|
1184 | h = d[c];
|
1185 | if (h === g) throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.");
|
1186 | d[c] = g;
|
1187 | Object.setPrototypeOf(h, a.prototype);
|
1188 | w(b, h);
|
1189 | return h;
|
1190 | }
|
1191 |
|
1192 | a.prototype = na.prototype;
|
1193 | return a;
|
1194 | }();
|
1195 | }
|
1196 |
|
1197 | function pa(b, a, e) {
|
1198 | a.prepend = function (a) {
|
1199 | for (var d = [], c = 0; c < arguments.length; ++c) {
|
1200 | d[c - 0] = arguments[c];
|
1201 | }
|
1202 |
|
1203 | c = d.filter(function (b) {
|
1204 | return b instanceof Node && l(b);
|
1205 | });
|
1206 | e.j.apply(this, d);
|
1207 |
|
1208 | for (var f = 0; f < c.length; f++) {
|
1209 | z(b, c[f]);
|
1210 | }
|
1211 |
|
1212 | if (l(this)) for (c = 0; c < d.length; c++) {
|
1213 | f = d[c], f instanceof Element && x(b, f);
|
1214 | }
|
1215 | };
|
1216 |
|
1217 | a.append = function (a) {
|
1218 | for (var d = [], c = 0; c < arguments.length; ++c) {
|
1219 | d[c - 0] = arguments[c];
|
1220 | }
|
1221 |
|
1222 | c = d.filter(function (b) {
|
1223 | return b instanceof Node && l(b);
|
1224 | });
|
1225 | e.append.apply(this, d);
|
1226 |
|
1227 | for (var f = 0; f < c.length; f++) {
|
1228 | z(b, c[f]);
|
1229 | }
|
1230 |
|
1231 | if (l(this)) for (c = 0; c < d.length; c++) {
|
1232 | f = d[c], f instanceof Element && x(b, f);
|
1233 | }
|
1234 | };
|
1235 | }
|
1236 |
|
1237 | function qa() {
|
1238 | var b = Y;
|
1239 | q(Document.prototype, "createElement", function (a) {
|
1240 | if (this.__CE_hasRegistry) {
|
1241 | var e = b.a.get(a);
|
1242 | if (e) return new e.constructor();
|
1243 | }
|
1244 |
|
1245 | a = F.call(this, a);
|
1246 | w(b, a);
|
1247 | return a;
|
1248 | });
|
1249 | q(Document.prototype, "importNode", function (a, e) {
|
1250 | a = ea.call(this, a, e);
|
1251 | this.__CE_hasRegistry ? A(b, a) : v(b, a);
|
1252 | return a;
|
1253 | });
|
1254 | q(Document.prototype, "createElementNS", function (a, e) {
|
1255 | if (this.__CE_hasRegistry && (null === a || "http://www.w3.org/1999/xhtml" === a)) {
|
1256 | var c = b.a.get(e);
|
1257 | if (c) return new c.constructor();
|
1258 | }
|
1259 |
|
1260 | a = da.call(this, a, e);
|
1261 | w(b, a);
|
1262 | return a;
|
1263 | });
|
1264 | pa(b, Document.prototype, {
|
1265 | j: fa,
|
1266 | append: ga
|
1267 | });
|
1268 | }
|
1269 |
|
1270 | function ra() {
|
1271 | var b = Y;
|
1272 |
|
1273 | function a(a, c) {
|
1274 | Object.defineProperty(a, "textContent", {
|
1275 | enumerable: c.enumerable,
|
1276 | configurable: !0,
|
1277 | get: c.get,
|
1278 | set: function set(a) {
|
1279 | if (this.nodeType === Node.TEXT_NODE) c.set.call(this, a);else {
|
1280 | var d = void 0;
|
1281 |
|
1282 | if (this.firstChild) {
|
1283 | var e = this.childNodes,
|
1284 | u = e.length;
|
1285 | if (0 < u && l(this)) for (var d = Array(u), p = 0; p < u; p++) {
|
1286 | d[p] = e[p];
|
1287 | }
|
1288 | }
|
1289 |
|
1290 | c.set.call(this, a);
|
1291 | if (d) for (a = 0; a < d.length; a++) {
|
1292 | z(b, d[a]);
|
1293 | }
|
1294 | }
|
1295 | }
|
1296 | });
|
1297 | }
|
1298 |
|
1299 | q(Node.prototype, "insertBefore", function (a, c) {
|
1300 | if (a instanceof DocumentFragment) {
|
1301 | var d = Array.prototype.slice.apply(a.childNodes);
|
1302 | a = I.call(this, a, c);
|
1303 | if (l(this)) for (c = 0; c < d.length; c++) {
|
1304 | x(b, d[c]);
|
1305 | }
|
1306 | return a;
|
1307 | }
|
1308 |
|
1309 | d = l(a);
|
1310 | c = I.call(this, a, c);
|
1311 | d && z(b, a);
|
1312 | l(this) && x(b, a);
|
1313 | return c;
|
1314 | });
|
1315 | q(Node.prototype, "appendChild", function (a) {
|
1316 | if (a instanceof DocumentFragment) {
|
1317 | var c = Array.prototype.slice.apply(a.childNodes);
|
1318 | a = H.call(this, a);
|
1319 | if (l(this)) for (var d = 0; d < c.length; d++) {
|
1320 | x(b, c[d]);
|
1321 | }
|
1322 | return a;
|
1323 | }
|
1324 |
|
1325 | c = l(a);
|
1326 | d = H.call(this, a);
|
1327 | c && z(b, a);
|
1328 | l(this) && x(b, a);
|
1329 | return d;
|
1330 | });
|
1331 | q(Node.prototype, "cloneNode", function (a) {
|
1332 | a = G.call(this, a);
|
1333 | this.ownerDocument.__CE_hasRegistry ? A(b, a) : v(b, a);
|
1334 | return a;
|
1335 | });
|
1336 | q(Node.prototype, "removeChild", function (a) {
|
1337 | var c = l(a),
|
1338 | d = J.call(this, a);
|
1339 | c && z(b, a);
|
1340 | return d;
|
1341 | });
|
1342 | q(Node.prototype, "replaceChild", function (a, c) {
|
1343 | if (a instanceof DocumentFragment) {
|
1344 | var d = Array.prototype.slice.apply(a.childNodes);
|
1345 | a = K.call(this, a, c);
|
1346 | if (l(this)) for (z(b, c), c = 0; c < d.length; c++) {
|
1347 | x(b, d[c]);
|
1348 | }
|
1349 | return a;
|
1350 | }
|
1351 |
|
1352 | var d = l(a),
|
1353 | e = K.call(this, a, c),
|
1354 | f = l(this);
|
1355 | f && z(b, c);
|
1356 | d && z(b, a);
|
1357 | f && x(b, a);
|
1358 | return e;
|
1359 | });
|
1360 | L && L.get ? a(Node.prototype, L) : t(b, function (b) {
|
1361 | a(b, {
|
1362 | enumerable: !0,
|
1363 | configurable: !0,
|
1364 | get: function get() {
|
1365 | for (var a = [], b = 0; b < this.childNodes.length; b++) {
|
1366 | a.push(this.childNodes[b].textContent);
|
1367 | }
|
1368 |
|
1369 | return a.join("");
|
1370 | },
|
1371 | set: function set(a) {
|
1372 | for (; this.firstChild;) {
|
1373 | J.call(this, this.firstChild);
|
1374 | }
|
1375 |
|
1376 | H.call(this, document.createTextNode(a));
|
1377 | }
|
1378 | });
|
1379 | });
|
1380 | }
|
1381 |
|
1382 | function sa(b) {
|
1383 | var a = Element.prototype;
|
1384 |
|
1385 | a.before = function (a) {
|
1386 | for (var c = [], d = 0; d < arguments.length; ++d) {
|
1387 | c[d - 0] = arguments[d];
|
1388 | }
|
1389 |
|
1390 | d = c.filter(function (a) {
|
1391 | return a instanceof Node && l(a);
|
1392 | });
|
1393 | ja.apply(this, c);
|
1394 |
|
1395 | for (var e = 0; e < d.length; e++) {
|
1396 | z(b, d[e]);
|
1397 | }
|
1398 |
|
1399 | if (l(this)) for (d = 0; d < c.length; d++) {
|
1400 | e = c[d], e instanceof Element && x(b, e);
|
1401 | }
|
1402 | };
|
1403 |
|
1404 | a.after = function (a) {
|
1405 | for (var c = [], d = 0; d < arguments.length; ++d) {
|
1406 | c[d - 0] = arguments[d];
|
1407 | }
|
1408 |
|
1409 | d = c.filter(function (a) {
|
1410 | return a instanceof Node && l(a);
|
1411 | });
|
1412 | ka.apply(this, c);
|
1413 |
|
1414 | for (var e = 0; e < d.length; e++) {
|
1415 | z(b, d[e]);
|
1416 | }
|
1417 |
|
1418 | if (l(this)) for (d = 0; d < c.length; d++) {
|
1419 | e = c[d], e instanceof Element && x(b, e);
|
1420 | }
|
1421 | };
|
1422 |
|
1423 | a.replaceWith = function (a) {
|
1424 | for (var c = [], d = 0; d < arguments.length; ++d) {
|
1425 | c[d - 0] = arguments[d];
|
1426 | }
|
1427 |
|
1428 | var d = c.filter(function (a) {
|
1429 | return a instanceof Node && l(a);
|
1430 | }),
|
1431 | e = l(this);
|
1432 | la.apply(this, c);
|
1433 |
|
1434 | for (var f = 0; f < d.length; f++) {
|
1435 | z(b, d[f]);
|
1436 | }
|
1437 |
|
1438 | if (e) for (z(b, this), d = 0; d < c.length; d++) {
|
1439 | e = c[d], e instanceof Element && x(b, e);
|
1440 | }
|
1441 | };
|
1442 |
|
1443 | a.remove = function () {
|
1444 | var a = l(this);
|
1445 | ma.call(this);
|
1446 | a && z(b, this);
|
1447 | };
|
1448 | }
|
1449 |
|
1450 | function ta() {
|
1451 | var b = Y;
|
1452 |
|
1453 | function a(a, c) {
|
1454 | Object.defineProperty(a, "innerHTML", {
|
1455 | enumerable: c.enumerable,
|
1456 | configurable: !0,
|
1457 | get: c.get,
|
1458 | set: function set(a) {
|
1459 | var d = this,
|
1460 | e = void 0;
|
1461 | l(this) && (e = [], n(this, function (a) {
|
1462 | a !== d && e.push(a);
|
1463 | }));
|
1464 | c.set.call(this, a);
|
1465 | if (e) for (var f = 0; f < e.length; f++) {
|
1466 | var h = e[f];
|
1467 | 1 === h.__CE_state && b.disconnectedCallback(h);
|
1468 | }
|
1469 | this.ownerDocument.__CE_hasRegistry ? A(b, this) : v(b, this);
|
1470 | return a;
|
1471 | }
|
1472 | });
|
1473 | }
|
1474 |
|
1475 | function e(a, c) {
|
1476 | q(a, "insertAdjacentElement", function (a, d) {
|
1477 | var e = l(d);
|
1478 | a = c.call(this, a, d);
|
1479 | e && z(b, d);
|
1480 | l(a) && x(b, d);
|
1481 | return a;
|
1482 | });
|
1483 | }
|
1484 |
|
1485 | M ? q(Element.prototype, "attachShadow", function (a) {
|
1486 | return this.__CE_shadowRoot = a = M.call(this, a);
|
1487 | }) : console.warn("Custom Elements: `Element#attachShadow` was not patched.");
|
1488 | if (N && N.get) a(Element.prototype, N);else if (W && W.get) a(HTMLElement.prototype, W);else {
|
1489 | var c = F.call(document, "div");
|
1490 | t(b, function (b) {
|
1491 | a(b, {
|
1492 | enumerable: !0,
|
1493 | configurable: !0,
|
1494 | get: function get() {
|
1495 | return G.call(this, !0).innerHTML;
|
1496 | },
|
1497 | set: function set(a) {
|
1498 | var b = "template" === this.localName ? this.content : this;
|
1499 |
|
1500 | for (c.innerHTML = a; 0 < b.childNodes.length;) {
|
1501 | J.call(b, b.childNodes[0]);
|
1502 | }
|
1503 |
|
1504 | for (; 0 < c.childNodes.length;) {
|
1505 | H.call(b, c.childNodes[0]);
|
1506 | }
|
1507 | }
|
1508 | });
|
1509 | });
|
1510 | }
|
1511 | q(Element.prototype, "setAttribute", function (a, c) {
|
1512 | if (1 !== this.__CE_state) return Q.call(this, a, c);
|
1513 | var d = O.call(this, a);
|
1514 | Q.call(this, a, c);
|
1515 | c = O.call(this, a);
|
1516 | b.attributeChangedCallback(this, a, d, c, null);
|
1517 | });
|
1518 | q(Element.prototype, "setAttributeNS", function (a, c, e) {
|
1519 | if (1 !== this.__CE_state) return T.call(this, a, c, e);
|
1520 | var d = S.call(this, a, c);
|
1521 | T.call(this, a, c, e);
|
1522 | e = S.call(this, a, c);
|
1523 | b.attributeChangedCallback(this, c, d, e, a);
|
1524 | });
|
1525 | q(Element.prototype, "removeAttribute", function (a) {
|
1526 | if (1 !== this.__CE_state) return R.call(this, a);
|
1527 | var c = O.call(this, a);
|
1528 | R.call(this, a);
|
1529 | null !== c && b.attributeChangedCallback(this, a, c, null, null);
|
1530 | });
|
1531 | q(Element.prototype, "removeAttributeNS", function (a, c) {
|
1532 | if (1 !== this.__CE_state) return U.call(this, a, c);
|
1533 | var d = S.call(this, a, c);
|
1534 | U.call(this, a, c);
|
1535 | var e = S.call(this, a, c);
|
1536 | d !== e && b.attributeChangedCallback(this, c, d, e, a);
|
1537 | });
|
1538 | X ? e(HTMLElement.prototype, X) : V ? e(Element.prototype, V) : console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");
|
1539 | pa(b, Element.prototype, {
|
1540 | j: ha,
|
1541 | append: ia
|
1542 | });
|
1543 | sa(b);
|
1544 | }
|
1545 | /*
|
1546 | Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
|
1547 | This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
1548 | The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
1549 | The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
1550 | Code distributed by Google as part of the polymer project is also
|
1551 | subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
1552 | */
|
1553 |
|
1554 | var Z = window.customElements;
|
1555 |
|
1556 | if (!Z || Z.forcePolyfill || "function" != typeof Z.define || "function" != typeof Z.get) {
|
1557 | var Y = new r();
|
1558 | oa();
|
1559 | qa();
|
1560 | ra();
|
1561 | ta();
|
1562 | document.__CE_hasRegistry = !0;
|
1563 | var ua = new E(Y);
|
1564 | Object.defineProperty(window, "customElements", {
|
1565 | configurable: !0,
|
1566 | enumerable: !0,
|
1567 | value: ua
|
1568 | });
|
1569 | }
|
1570 | }).call(self);
|
1571 |
|
1572 | /**
|
1573 | * @license
|
1574 | * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
|
1575 | * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
|
1576 | * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
|
1577 | * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
|
1578 | * Code distributed by Google as part of the polymer project is also
|
1579 | * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
1580 | */
|
1581 | // @version 0.7.22
|
1582 | (function (global) {
|
1583 | if (global.JsMutationObserver) {
|
1584 | return;
|
1585 | }
|
1586 |
|
1587 | var registrationsTable = new WeakMap();
|
1588 | var setImmediate;
|
1589 |
|
1590 | if (/Trident|Edge/.test(navigator.userAgent)) {
|
1591 | setImmediate = setTimeout;
|
1592 | } else if (window.setImmediate) {
|
1593 | setImmediate = window.setImmediate;
|
1594 | } else {
|
1595 | var setImmediateQueue = [];
|
1596 | var sentinel = String(Math.random());
|
1597 | window.addEventListener("message", function (e) {
|
1598 | if (e.data === sentinel) {
|
1599 | var queue = setImmediateQueue;
|
1600 | setImmediateQueue = [];
|
1601 | queue.forEach(function (func) {
|
1602 | func();
|
1603 | });
|
1604 | }
|
1605 | });
|
1606 |
|
1607 | setImmediate = function setImmediate(func) {
|
1608 | setImmediateQueue.push(func);
|
1609 | window.postMessage(sentinel, "*");
|
1610 | };
|
1611 | }
|
1612 |
|
1613 | var isScheduled = false;
|
1614 | var scheduledObservers = [];
|
1615 |
|
1616 | function scheduleCallback(observer) {
|
1617 | scheduledObservers.push(observer);
|
1618 |
|
1619 | if (!isScheduled) {
|
1620 | isScheduled = true;
|
1621 | setImmediate(dispatchCallbacks);
|
1622 | }
|
1623 | }
|
1624 |
|
1625 | function wrapIfNeeded(node) {
|
1626 | return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;
|
1627 | }
|
1628 |
|
1629 | function dispatchCallbacks() {
|
1630 | isScheduled = false;
|
1631 | var observers = scheduledObservers;
|
1632 | scheduledObservers = [];
|
1633 | observers.sort(function (o1, o2) {
|
1634 | return o1.uid_ - o2.uid_;
|
1635 | });
|
1636 | var anyNonEmpty = false;
|
1637 | observers.forEach(function (observer) {
|
1638 | var queue = observer.takeRecords();
|
1639 | removeTransientObserversFor(observer);
|
1640 |
|
1641 | if (queue.length) {
|
1642 | observer.callback_(queue, observer);
|
1643 | anyNonEmpty = true;
|
1644 | }
|
1645 | });
|
1646 | if (anyNonEmpty) dispatchCallbacks();
|
1647 | }
|
1648 |
|
1649 | function removeTransientObserversFor(observer) {
|
1650 | observer.nodes_.forEach(function (node) {
|
1651 | var registrations = registrationsTable.get(node);
|
1652 | if (!registrations) return;
|
1653 | registrations.forEach(function (registration) {
|
1654 | if (registration.observer === observer) registration.removeTransientObservers();
|
1655 | });
|
1656 | });
|
1657 | }
|
1658 |
|
1659 | function forEachAncestorAndObserverEnqueueRecord(target, callback) {
|
1660 | for (var node = target; node; node = node.parentNode) {
|
1661 | var registrations = registrationsTable.get(node);
|
1662 |
|
1663 | if (registrations) {
|
1664 | for (var j = 0; j < registrations.length; j++) {
|
1665 | var registration = registrations[j];
|
1666 | var options = registration.options;
|
1667 | if (node !== target && !options.subtree) continue;
|
1668 | var record = callback(options);
|
1669 | if (record) registration.enqueue(record);
|
1670 | }
|
1671 | }
|
1672 | }
|
1673 | }
|
1674 |
|
1675 | var uidCounter = 0;
|
1676 |
|
1677 | function JsMutationObserver(callback) {
|
1678 | this.callback_ = callback;
|
1679 | this.nodes_ = [];
|
1680 | this.records_ = [];
|
1681 | this.uid_ = ++uidCounter;
|
1682 | }
|
1683 |
|
1684 | JsMutationObserver.prototype = {
|
1685 | observe: function observe(target, options) {
|
1686 | target = wrapIfNeeded(target);
|
1687 |
|
1688 | if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {
|
1689 | throw new SyntaxError();
|
1690 | }
|
1691 |
|
1692 | var registrations = registrationsTable.get(target);
|
1693 | if (!registrations) registrationsTable.set(target, registrations = []);
|
1694 | var registration;
|
1695 |
|
1696 | for (var i = 0; i < registrations.length; i++) {
|
1697 | if (registrations[i].observer === this) {
|
1698 | registration = registrations[i];
|
1699 | registration.removeListeners();
|
1700 | registration.options = options;
|
1701 | break;
|
1702 | }
|
1703 | }
|
1704 |
|
1705 | if (!registration) {
|
1706 | registration = new Registration(this, target, options);
|
1707 | registrations.push(registration);
|
1708 | this.nodes_.push(target);
|
1709 | }
|
1710 |
|
1711 | registration.addListeners();
|
1712 | },
|
1713 | disconnect: function disconnect() {
|
1714 | this.nodes_.forEach(function (node) {
|
1715 | var registrations = registrationsTable.get(node);
|
1716 |
|
1717 | for (var i = 0; i < registrations.length; i++) {
|
1718 | var registration = registrations[i];
|
1719 |
|
1720 | if (registration.observer === this) {
|
1721 | registration.removeListeners();
|
1722 | registrations.splice(i, 1);
|
1723 | break;
|
1724 | }
|
1725 | }
|
1726 | }, this);
|
1727 | this.records_ = [];
|
1728 | },
|
1729 | takeRecords: function takeRecords() {
|
1730 | var copyOfRecords = this.records_;
|
1731 | this.records_ = [];
|
1732 | return copyOfRecords;
|
1733 | }
|
1734 | };
|
1735 |
|
1736 | function MutationRecord(type, target) {
|
1737 | this.type = type;
|
1738 | this.target = target;
|
1739 | this.addedNodes = [];
|
1740 | this.removedNodes = [];
|
1741 | this.previousSibling = null;
|
1742 | this.nextSibling = null;
|
1743 | this.attributeName = null;
|
1744 | this.attributeNamespace = null;
|
1745 | this.oldValue = null;
|
1746 | }
|
1747 |
|
1748 | function copyMutationRecord(original) {
|
1749 | var record = new MutationRecord(original.type, original.target);
|
1750 | record.addedNodes = original.addedNodes.slice();
|
1751 | record.removedNodes = original.removedNodes.slice();
|
1752 | record.previousSibling = original.previousSibling;
|
1753 | record.nextSibling = original.nextSibling;
|
1754 | record.attributeName = original.attributeName;
|
1755 | record.attributeNamespace = original.attributeNamespace;
|
1756 | record.oldValue = original.oldValue;
|
1757 | return record;
|
1758 | }
|
1759 |
|
1760 | var currentRecord, recordWithOldValue;
|
1761 |
|
1762 | function getRecord(type, target) {
|
1763 | return currentRecord = new MutationRecord(type, target);
|
1764 | }
|
1765 |
|
1766 | function getRecordWithOldValue(oldValue) {
|
1767 | if (recordWithOldValue) return recordWithOldValue;
|
1768 | recordWithOldValue = copyMutationRecord(currentRecord);
|
1769 | recordWithOldValue.oldValue = oldValue;
|
1770 | return recordWithOldValue;
|
1771 | }
|
1772 |
|
1773 | function clearRecords() {
|
1774 | currentRecord = recordWithOldValue = undefined;
|
1775 | }
|
1776 |
|
1777 | function recordRepresentsCurrentMutation(record) {
|
1778 | return record === recordWithOldValue || record === currentRecord;
|
1779 | }
|
1780 |
|
1781 | function selectRecord(lastRecord, newRecord) {
|
1782 | if (lastRecord === newRecord) return lastRecord;
|
1783 | if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) return recordWithOldValue;
|
1784 | return null;
|
1785 | }
|
1786 |
|
1787 | function Registration(observer, target, options) {
|
1788 | this.observer = observer;
|
1789 | this.target = target;
|
1790 | this.options = options;
|
1791 | this.transientObservedNodes = [];
|
1792 | }
|
1793 |
|
1794 | Registration.prototype = {
|
1795 | enqueue: function enqueue(record) {
|
1796 | var records = this.observer.records_;
|
1797 | var length = records.length;
|
1798 |
|
1799 | if (records.length > 0) {
|
1800 | var lastRecord = records[length - 1];
|
1801 | var recordToReplaceLast = selectRecord(lastRecord, record);
|
1802 |
|
1803 | if (recordToReplaceLast) {
|
1804 | records[length - 1] = recordToReplaceLast;
|
1805 | return;
|
1806 | }
|
1807 | } else {
|
1808 | scheduleCallback(this.observer);
|
1809 | }
|
1810 |
|
1811 | records[length] = record;
|
1812 | },
|
1813 | addListeners: function addListeners() {
|
1814 | this.addListeners_(this.target);
|
1815 | },
|
1816 | addListeners_: function addListeners_(node) {
|
1817 | var options = this.options;
|
1818 | if (options.attributes) node.addEventListener("DOMAttrModified", this, true);
|
1819 | if (options.characterData) node.addEventListener("DOMCharacterDataModified", this, true);
|
1820 | if (options.childList) node.addEventListener("DOMNodeInserted", this, true);
|
1821 | if (options.childList || options.subtree) node.addEventListener("DOMNodeRemoved", this, true);
|
1822 | },
|
1823 | removeListeners: function removeListeners() {
|
1824 | this.removeListeners_(this.target);
|
1825 | },
|
1826 | removeListeners_: function removeListeners_(node) {
|
1827 | var options = this.options;
|
1828 | if (options.attributes) node.removeEventListener("DOMAttrModified", this, true);
|
1829 | if (options.characterData) node.removeEventListener("DOMCharacterDataModified", this, true);
|
1830 | if (options.childList) node.removeEventListener("DOMNodeInserted", this, true);
|
1831 | if (options.childList || options.subtree) node.removeEventListener("DOMNodeRemoved", this, true);
|
1832 | },
|
1833 | addTransientObserver: function addTransientObserver(node) {
|
1834 | if (node === this.target) return;
|
1835 | this.addListeners_(node);
|
1836 | this.transientObservedNodes.push(node);
|
1837 | var registrations = registrationsTable.get(node);
|
1838 | if (!registrations) registrationsTable.set(node, registrations = []);
|
1839 | registrations.push(this);
|
1840 | },
|
1841 | removeTransientObservers: function removeTransientObservers() {
|
1842 | var transientObservedNodes = this.transientObservedNodes;
|
1843 | this.transientObservedNodes = [];
|
1844 | transientObservedNodes.forEach(function (node) {
|
1845 | this.removeListeners_(node);
|
1846 | var registrations = registrationsTable.get(node);
|
1847 |
|
1848 | for (var i = 0; i < registrations.length; i++) {
|
1849 | if (registrations[i] === this) {
|
1850 | registrations.splice(i, 1);
|
1851 | break;
|
1852 | }
|
1853 | }
|
1854 | }, this);
|
1855 | },
|
1856 | handleEvent: function handleEvent(e) {
|
1857 | e.stopImmediatePropagation();
|
1858 |
|
1859 | switch (e.type) {
|
1860 | case "DOMAttrModified":
|
1861 | var name = e.attrName;
|
1862 | var namespace = e.relatedNode.namespaceURI;
|
1863 | var target = e.target;
|
1864 | var record = new getRecord("attributes", target);
|
1865 | record.attributeName = name;
|
1866 | record.attributeNamespace = namespace;
|
1867 | var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;
|
1868 | forEachAncestorAndObserverEnqueueRecord(target, function (options) {
|
1869 | if (!options.attributes) return;
|
1870 |
|
1871 | if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {
|
1872 | return;
|
1873 | }
|
1874 |
|
1875 | if (options.attributeOldValue) return getRecordWithOldValue(oldValue);
|
1876 | return record;
|
1877 | });
|
1878 | break;
|
1879 |
|
1880 | case "DOMCharacterDataModified":
|
1881 | var target = e.target;
|
1882 | var record = getRecord("characterData", target);
|
1883 | var oldValue = e.prevValue;
|
1884 | forEachAncestorAndObserverEnqueueRecord(target, function (options) {
|
1885 | if (!options.characterData) return;
|
1886 | if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);
|
1887 | return record;
|
1888 | });
|
1889 | break;
|
1890 |
|
1891 | case "DOMNodeRemoved":
|
1892 | this.addTransientObserver(e.target);
|
1893 |
|
1894 | case "DOMNodeInserted":
|
1895 | var changedNode = e.target;
|
1896 | var addedNodes, removedNodes;
|
1897 |
|
1898 | if (e.type === "DOMNodeInserted") {
|
1899 | addedNodes = [changedNode];
|
1900 | removedNodes = [];
|
1901 | } else {
|
1902 | addedNodes = [];
|
1903 | removedNodes = [changedNode];
|
1904 | }
|
1905 |
|
1906 | var previousSibling = changedNode.previousSibling;
|
1907 | var nextSibling = changedNode.nextSibling;
|
1908 | var record = getRecord("childList", e.target.parentNode);
|
1909 | record.addedNodes = addedNodes;
|
1910 | record.removedNodes = removedNodes;
|
1911 | record.previousSibling = previousSibling;
|
1912 | record.nextSibling = nextSibling;
|
1913 | forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function (options) {
|
1914 | if (!options.childList) return;
|
1915 | return record;
|
1916 | });
|
1917 | }
|
1918 |
|
1919 | clearRecords();
|
1920 | }
|
1921 | };
|
1922 | global.JsMutationObserver = JsMutationObserver;
|
1923 |
|
1924 | if (!global.MutationObserver) {
|
1925 | global.MutationObserver = JsMutationObserver;
|
1926 | JsMutationObserver._isPolyfilled = true;
|
1927 | }
|
1928 | })(self);
|
1929 |
|
1930 | /*
|
1931 | Copyright (c) 2012 Barnesandnoble.com, llc, Donavon West, and Domenic Denicola
|
1932 |
|
1933 | Permission is hereby granted, free of charge, to any person obtaining
|
1934 | a copy of this software and associated documentation files (the
|
1935 | "Software"), to deal in the Software without restriction, including
|
1936 | without limitation the rights to use, copy, modify, merge, publish,
|
1937 | distribute, sublicense, and/or sell copies of the Software, and to
|
1938 | permit persons to whom the Software is furnished to do so, subject to
|
1939 | the following conditions:
|
1940 |
|
1941 | The above copyright notice and this permission notice shall be
|
1942 | included in all copies or substantial portions of the Software.
|
1943 |
|
1944 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
1945 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
1946 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
1947 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
1948 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
1949 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
1950 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
1951 |
|
1952 | */
|
1953 | (function (global, undefined$1) {
|
1954 |
|
1955 | if (global.setImmediate) {
|
1956 | return;
|
1957 | }
|
1958 |
|
1959 | var nextHandle = 1; // Spec says greater than zero
|
1960 |
|
1961 | var tasksByHandle = {};
|
1962 | var currentlyRunningATask = false;
|
1963 | var doc = global.document;
|
1964 | var setImmediate;
|
1965 |
|
1966 | function addFromSetImmediateArguments(args) {
|
1967 | tasksByHandle[nextHandle] = partiallyApplied.apply(undefined$1, args);
|
1968 | return nextHandle++;
|
1969 | } // This function accepts the same arguments as setImmediate, but
|
1970 | // returns a function that requires no arguments.
|
1971 |
|
1972 |
|
1973 | function partiallyApplied(handler) {
|
1974 | var args = [].slice.call(arguments, 1);
|
1975 | return function () {
|
1976 | if (typeof handler === "function") {
|
1977 | handler.apply(undefined$1, args);
|
1978 | } else {
|
1979 | new Function("" + handler)();
|
1980 | }
|
1981 | };
|
1982 | }
|
1983 |
|
1984 | function runIfPresent(handle) {
|
1985 | // From the spec: "Wait until any invocations of this algorithm started before this one have completed."
|
1986 | // So if we're currently running a task, we'll need to delay this invocation.
|
1987 | if (currentlyRunningATask) {
|
1988 | // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a
|
1989 | // "too much recursion" error.
|
1990 | setTimeout(partiallyApplied(runIfPresent, handle), 0);
|
1991 | } else {
|
1992 | var task = tasksByHandle[handle];
|
1993 |
|
1994 | if (task) {
|
1995 | currentlyRunningATask = true;
|
1996 |
|
1997 | try {
|
1998 | task();
|
1999 | } finally {
|
2000 | clearImmediate(handle);
|
2001 | currentlyRunningATask = false;
|
2002 | }
|
2003 | }
|
2004 | }
|
2005 | }
|
2006 |
|
2007 | function clearImmediate(handle) {
|
2008 | delete tasksByHandle[handle];
|
2009 | }
|
2010 |
|
2011 | function installNextTickImplementation() {
|
2012 | setImmediate = function setImmediate() {
|
2013 | var handle = addFromSetImmediateArguments(arguments);
|
2014 | process.nextTick(partiallyApplied(runIfPresent, handle));
|
2015 | return handle;
|
2016 | };
|
2017 | }
|
2018 |
|
2019 | function canUsePostMessage() {
|
2020 | // The test against `importScripts` prevents this implementation from being installed inside a web worker,
|
2021 | // where `global.postMessage` means something completely different and can't be used for this purpose.
|
2022 | if (global.postMessage && !global.importScripts) {
|
2023 | var postMessageIsAsynchronous = true;
|
2024 | var oldOnMessage = global.onmessage;
|
2025 |
|
2026 | global.onmessage = function () {
|
2027 | postMessageIsAsynchronous = false;
|
2028 | };
|
2029 |
|
2030 | global.postMessage("", "*");
|
2031 | global.onmessage = oldOnMessage;
|
2032 | return postMessageIsAsynchronous;
|
2033 | }
|
2034 | }
|
2035 |
|
2036 | function installPostMessageImplementation() {
|
2037 | // Installs an event handler on `global` for the `message` event: see
|
2038 | // * https://developer.mozilla.org/en/DOM/window.postMessage
|
2039 | // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
|
2040 | var messagePrefix = "setImmediate$" + Math.random() + "$";
|
2041 |
|
2042 | var onGlobalMessage = function onGlobalMessage(event) {
|
2043 | if (event.source === global && typeof event.data === "string" && event.data.indexOf(messagePrefix) === 0) {
|
2044 | runIfPresent(+event.data.slice(messagePrefix.length));
|
2045 | }
|
2046 | };
|
2047 |
|
2048 | if (global.addEventListener) {
|
2049 | global.addEventListener("message", onGlobalMessage, false);
|
2050 | } else {
|
2051 | global.attachEvent("onmessage", onGlobalMessage);
|
2052 | }
|
2053 |
|
2054 | setImmediate = function setImmediate() {
|
2055 | var handle = addFromSetImmediateArguments(arguments);
|
2056 | global.postMessage(messagePrefix + handle, "*");
|
2057 | return handle;
|
2058 | };
|
2059 | }
|
2060 |
|
2061 | function installMessageChannelImplementation() {
|
2062 | var channel = new MessageChannel();
|
2063 |
|
2064 | channel.port1.onmessage = function (event) {
|
2065 | var handle = event.data;
|
2066 | runIfPresent(handle);
|
2067 | };
|
2068 |
|
2069 | setImmediate = function setImmediate() {
|
2070 | var handle = addFromSetImmediateArguments(arguments);
|
2071 | channel.port2.postMessage(handle);
|
2072 | return handle;
|
2073 | };
|
2074 | }
|
2075 |
|
2076 | function installReadyStateChangeImplementation() {
|
2077 | var html = doc.documentElement;
|
2078 |
|
2079 | setImmediate = function setImmediate() {
|
2080 | var handle = addFromSetImmediateArguments(arguments); // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted
|
2081 | // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.
|
2082 |
|
2083 | var script = doc.createElement("script");
|
2084 |
|
2085 | script.onreadystatechange = function () {
|
2086 | runIfPresent(handle);
|
2087 | script.onreadystatechange = null;
|
2088 | html.removeChild(script);
|
2089 | script = null;
|
2090 | };
|
2091 |
|
2092 | html.appendChild(script);
|
2093 | return handle;
|
2094 | };
|
2095 | }
|
2096 |
|
2097 | function installSetTimeoutImplementation() {
|
2098 | setImmediate = function setImmediate() {
|
2099 | var handle = addFromSetImmediateArguments(arguments);
|
2100 | setTimeout(partiallyApplied(runIfPresent, handle), 0);
|
2101 | return handle;
|
2102 | };
|
2103 | } // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.
|
2104 |
|
2105 |
|
2106 | var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);
|
2107 | attachTo = attachTo && attachTo.setTimeout ? attachTo : global; // Don't get fooled by e.g. browserify environments.
|
2108 |
|
2109 | if ({}.toString.call(global.process) === "[object process]") {
|
2110 | // For Node.js before 0.9
|
2111 | installNextTickImplementation();
|
2112 | } else if (canUsePostMessage()) {
|
2113 | // For non-IE10 modern browsers
|
2114 | installPostMessageImplementation();
|
2115 | } else if (global.MessageChannel) {
|
2116 | // For web workers, where supported
|
2117 | installMessageChannelImplementation();
|
2118 | } else if (doc && "onreadystatechange" in doc.createElement("script")) {
|
2119 | // For IE 6–8
|
2120 | installReadyStateChangeImplementation();
|
2121 | } else {
|
2122 | // For older browsers
|
2123 | installSetTimeoutImplementation();
|
2124 | }
|
2125 |
|
2126 | attachTo.setImmediate = setImmediate;
|
2127 | attachTo.clearImmediate = clearImmediate;
|
2128 | })(self);
|
2129 |
|
2130 | (function () {
|
2131 | var DEFAULT_VIEWPORT = 'width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no';
|
2132 | var Viewport = {
|
2133 | ensureViewportElement: function ensureViewportElement() {
|
2134 | var viewportElement = document.querySelector('meta[name=viewport]');
|
2135 |
|
2136 | if (!viewportElement) {
|
2137 | viewportElement = document.createElement('meta');
|
2138 | viewportElement.name = 'viewport';
|
2139 | document.head.appendChild(viewportElement);
|
2140 | }
|
2141 |
|
2142 | return viewportElement;
|
2143 | },
|
2144 | setup: function setup() {
|
2145 | var viewportElement = Viewport.ensureViewportElement();
|
2146 |
|
2147 | if (!viewportElement) {
|
2148 | return;
|
2149 | }
|
2150 |
|
2151 | if (!viewportElement.hasAttribute('content')) {
|
2152 | viewportElement.setAttribute('content', DEFAULT_VIEWPORT);
|
2153 | }
|
2154 | }
|
2155 | };
|
2156 | window.Viewport = Viewport;
|
2157 | })();
|
2158 |
|
2159 | /**
|
2160 | * MicroEvent - to make any js object an event emitter (server or browser)
|
2161 | *
|
2162 | * - pure javascript - server compatible, browser compatible
|
2163 | * - dont rely on the browser doms
|
2164 | * - super simple - you get it immediately, no mystery, no magic involved
|
2165 | *
|
2166 | * - create a MicroEventDebug with goodies to debug
|
2167 | * - make it safer to use
|
2168 | */
|
2169 |
|
2170 | /** NOTE: This library is customized for Onsen UI. */
|
2171 | var MicroEvent = function MicroEvent() {};
|
2172 |
|
2173 | MicroEvent.prototype = {
|
2174 | on: function on(event, fct) {
|
2175 | this._events = this._events || {};
|
2176 | this._events[event] = this._events[event] || [];
|
2177 |
|
2178 | this._events[event].push(fct);
|
2179 | },
|
2180 | once: function once(event, fct) {
|
2181 | var self = this;
|
2182 |
|
2183 | var wrapper = function wrapper() {
|
2184 | self.off(event, wrapper);
|
2185 | return fct.apply(null, arguments);
|
2186 | };
|
2187 |
|
2188 | this.on(event, wrapper);
|
2189 | },
|
2190 | off: function off(event, fct) {
|
2191 | this._events = this._events || {};
|
2192 |
|
2193 | if (event in this._events === false) {
|
2194 | return;
|
2195 | }
|
2196 |
|
2197 | this._events[event] = this._events[event].filter(function (_fct) {
|
2198 | if (fct) {
|
2199 | return fct !== _fct;
|
2200 | } else {
|
2201 | return false;
|
2202 | }
|
2203 | });
|
2204 | },
|
2205 | emit: function emit(event
|
2206 | /* , args... */
|
2207 | ) {
|
2208 | this._events = this._events || {};
|
2209 |
|
2210 | if (event in this._events === false) {
|
2211 | return;
|
2212 | }
|
2213 |
|
2214 | for (var i = 0; i < this._events[event].length; i++) {
|
2215 | this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));
|
2216 | }
|
2217 | }
|
2218 | };
|
2219 | /**
|
2220 | * mixin will delegate all MicroEvent.js function in the destination object
|
2221 | *
|
2222 | * - require('MicroEvent').mixin(Foobar) will make Foobar able to use MicroEvent
|
2223 | *
|
2224 | * @param {Object} the object which will support MicroEvent
|
2225 | */
|
2226 |
|
2227 | MicroEvent.mixin = function (destObject) {
|
2228 | var props = ['on', 'once', 'off', 'emit'];
|
2229 |
|
2230 | for (var i = 0; i < props.length; i++) {
|
2231 | if (typeof destObject === 'function') {
|
2232 | destObject.prototype[props[i]] = MicroEvent.prototype[props[i]];
|
2233 | } else {
|
2234 | destObject[props[i]] = MicroEvent.prototype[props[i]];
|
2235 | }
|
2236 | }
|
2237 | };
|
2238 |
|
2239 | window.MicroEvent = MicroEvent;
|
2240 |
|
2241 | var onsElements = {};
|
2242 |
|
2243 | /*
|
2244 | Copyright 2013-2015 ASIAL CORPORATION
|
2245 |
|
2246 | Licensed under the Apache License, Version 2.0 (the "License");
|
2247 | you may not use this file except in compliance with the License.
|
2248 | You may obtain a copy of the License at
|
2249 |
|
2250 | http://www.apache.org/licenses/LICENSE-2.0
|
2251 |
|
2252 | Unless required by applicable law or agreed to in writing, software
|
2253 | distributed under the License is distributed on an "AS IS" BASIS,
|
2254 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
2255 | See the License for the specific language governing permissions and
|
2256 | limitations under the License.
|
2257 |
|
2258 | */
|
2259 | /**
|
2260 | * Add vendor prefix.
|
2261 | *
|
2262 | * @param {String} name
|
2263 | * @return {String}
|
2264 | */
|
2265 |
|
2266 | var prefix = function () {
|
2267 | var styles = window.getComputedStyle(document.documentElement, '');
|
2268 | var prefix = (Array.prototype.slice.call(styles).join('').match(/-(moz|webkit|ms)-/) || styles.OLink === '' && ['', 'o'])[1];
|
2269 | return function (name) {
|
2270 | return '-' + prefix + '-' + util$4.hyphenate(name);
|
2271 | };
|
2272 | }();
|
2273 | /**
|
2274 | * Minimal utility library for manipulating element's style.
|
2275 | * Set element's style.
|
2276 | *
|
2277 | * @param {Element} element
|
2278 | * @param {Object} styles
|
2279 | * @return {Element}
|
2280 | */
|
2281 |
|
2282 |
|
2283 | var styler = function styler(element, style) {
|
2284 | Object.keys(style).forEach(function (key) {
|
2285 | if (key in element.style) {
|
2286 | element.style[key] = style[key];
|
2287 | } else if (prefix(key) in element.style) {
|
2288 | element.style[prefix(key)] = style[key];
|
2289 | } else {
|
2290 | util$4.warn('No such style property: ' + key);
|
2291 | }
|
2292 | });
|
2293 | return element;
|
2294 | };
|
2295 | /**
|
2296 | * @param {Element} element
|
2297 | * @param {String} styles Space-separated CSS properties to remove
|
2298 | */
|
2299 |
|
2300 |
|
2301 | styler.clear = function (element) {
|
2302 | var styles = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
|
2303 | var clearlist = styles.split(/\s+/).reduce(function (r, s) {
|
2304 | return r.concat([util$4.hyphenate(s), prefix(s)]);
|
2305 | }, []),
|
2306 | keys = [];
|
2307 |
|
2308 | var _loop = function _loop(i) {
|
2309 | var key = element.style[i];
|
2310 |
|
2311 | if (clearlist.length === 0 || clearlist.some(function (s) {
|
2312 | return key.indexOf(s) === 0;
|
2313 | })) {
|
2314 | keys.push(key); // Store the key to fix Safari style indexes
|
2315 | }
|
2316 | };
|
2317 |
|
2318 | for (var i = element.style.length - 1; i >= 0; i--) {
|
2319 | _loop(i);
|
2320 | }
|
2321 |
|
2322 | keys.forEach(function (key) {
|
2323 | return element.style[key] = '';
|
2324 | });
|
2325 | element.getAttribute('style') === '' && element.removeAttribute('style');
|
2326 | };
|
2327 |
|
2328 | /*
|
2329 | Copyright 2013-2015 ASIAL CORPORATION
|
2330 |
|
2331 | Licensed under the Apache License, Version 2.0 (the "License");
|
2332 | you may not use this file except in compliance with the License.
|
2333 | You may obtain a copy of the License at
|
2334 |
|
2335 | http://www.apache.org/licenses/LICENSE-2.0
|
2336 |
|
2337 | Unless required by applicable law or agreed to in writing, software
|
2338 | distributed under the License is distributed on an "AS IS" BASIS,
|
2339 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
2340 | See the License for the specific language governing permissions and
|
2341 | limitations under the License.
|
2342 |
|
2343 | */
|
2344 | var autoStyleEnabled = true; // Modifiers
|
2345 |
|
2346 | var modifiersMap = {
|
2347 | 'quiet': 'material--flat',
|
2348 | 'light': 'material--flat',
|
2349 | 'outline': 'material--flat',
|
2350 | 'cta': '',
|
2351 | 'large--quiet': 'material--flat large',
|
2352 | 'large--cta': 'large',
|
2353 | 'noborder': '',
|
2354 | 'tappable': ''
|
2355 | };
|
2356 | var platforms = {};
|
2357 |
|
2358 | platforms.android = function (element) {
|
2359 | var elementName = element.tagName.toLowerCase();
|
2360 |
|
2361 | if (!util$4.hasModifier(element, 'material')) {
|
2362 | var oldModifier = element.getAttribute('modifier') || '';
|
2363 | var newModifier = oldModifier.trim().split(/\s+/).map(function (e) {
|
2364 | return Object.prototype.hasOwnProperty.call(modifiersMap, e) ? modifiersMap[e] : e;
|
2365 | });
|
2366 | newModifier.unshift('material');
|
2367 | element.setAttribute('modifier', newModifier.join(' ').trim());
|
2368 | }
|
2369 |
|
2370 | var elements = ['ons-alert-dialog-button', 'ons-toolbar-button', 'ons-back-button', 'ons-button', 'ons-list-item', 'ons-fab', 'ons-speed-dial', 'ons-speed-dial-item', 'ons-tab']; // Effects
|
2371 |
|
2372 | if (elements.indexOf(elementName) !== -1 && !element.hasAttribute('ripple') && !element.querySelector('ons-ripple')) {
|
2373 | if (elementName === 'ons-list-item') {
|
2374 | if (element.hasAttribute('tappable')) {
|
2375 | element.setAttribute('ripple', '');
|
2376 | element.removeAttribute('tappable');
|
2377 | }
|
2378 | } else {
|
2379 | element.setAttribute('ripple', '');
|
2380 | }
|
2381 | }
|
2382 | };
|
2383 |
|
2384 | platforms.ios = function (element) {
|
2385 | // Modifiers
|
2386 | if (util$4.removeModifier(element, 'material')) {
|
2387 | if (util$4.removeModifier(element, 'material--flat')) {
|
2388 | util$4.addModifier(element, util$4.removeModifier(element, 'large') ? 'large--quiet' : 'quiet');
|
2389 | }
|
2390 |
|
2391 | if (!element.getAttribute('modifier')) {
|
2392 | element.removeAttribute('modifier');
|
2393 | }
|
2394 | } // Effects
|
2395 |
|
2396 |
|
2397 | if (element.hasAttribute('ripple')) {
|
2398 | if (element.tagName.toLowerCase() === 'ons-list-item') {
|
2399 | element.setAttribute('tappable', '');
|
2400 | }
|
2401 |
|
2402 | element.removeAttribute('ripple');
|
2403 | }
|
2404 | };
|
2405 |
|
2406 | var unlocked = {
|
2407 | android: true
|
2408 | };
|
2409 |
|
2410 | var getPlatform = function getPlatform(element, force) {
|
2411 | if (autoStyleEnabled && !element.hasAttribute('disable-auto-styling')) {
|
2412 | var mobileOS = platform.getMobileOS();
|
2413 |
|
2414 | if (Object.prototype.hasOwnProperty.call(platforms, mobileOS) && (Object.prototype.hasOwnProperty.call(unlocked, mobileOS) || force)) {
|
2415 | return mobileOS;
|
2416 | }
|
2417 | }
|
2418 |
|
2419 | return null;
|
2420 | };
|
2421 |
|
2422 | var prepare = function prepare(element, force) {
|
2423 | var p = getPlatform(element, force);
|
2424 | p && platforms[p](element);
|
2425 | };
|
2426 |
|
2427 | var mapModifier = function mapModifier(modifier, element, force) {
|
2428 | if (getPlatform(element, force)) {
|
2429 | return modifier.split(/\s+/).map(function (m) {
|
2430 | return Object.prototype.hasOwnProperty.call(modifiersMap, m) ? modifiersMap[m] : m;
|
2431 | }).join(' ');
|
2432 | }
|
2433 |
|
2434 | return modifier;
|
2435 | };
|
2436 |
|
2437 | var restoreModifier = function restoreModifier(element) {
|
2438 | if (getPlatform(element) === 'android') {
|
2439 | var modifier = element.getAttribute('modifier') || '';
|
2440 | var newModifier = mapModifier(modifier, element);
|
2441 |
|
2442 | if (!/(^|\s+)material($|\s+)/i.test(modifier)) {
|
2443 | newModifier = 'material ' + newModifier;
|
2444 | }
|
2445 |
|
2446 | if (newModifier !== modifier) {
|
2447 | element.setAttribute('modifier', newModifier.trim());
|
2448 | return true;
|
2449 | }
|
2450 | }
|
2451 |
|
2452 | return false;
|
2453 | };
|
2454 |
|
2455 | var autoStyle = {
|
2456 | isEnabled: function isEnabled() {
|
2457 | return autoStyleEnabled;
|
2458 | },
|
2459 | enable: function enable() {
|
2460 | return autoStyleEnabled = true;
|
2461 | },
|
2462 | disable: function disable() {
|
2463 | return autoStyleEnabled = false;
|
2464 | },
|
2465 | prepare: prepare,
|
2466 | mapModifier: mapModifier,
|
2467 | getPlatform: getPlatform,
|
2468 | restoreModifier: restoreModifier
|
2469 | };
|
2470 |
|
2471 | var ModifierUtil = /*#__PURE__*/function () {
|
2472 | function ModifierUtil() {
|
2473 | _classCallCheck(this, ModifierUtil);
|
2474 | }
|
2475 |
|
2476 | _createClass(ModifierUtil, null, [{
|
2477 | key: "diff",
|
2478 | value:
|
2479 | /**
|
2480 | * @param {String} last
|
2481 | * @param {String} current
|
2482 | */
|
2483 | function diff(last, current) {
|
2484 | last = makeDict(('' + last).trim());
|
2485 | current = makeDict(('' + current).trim());
|
2486 | var removed = Object.keys(last).reduce(function (result, token) {
|
2487 | if (!current[token]) {
|
2488 | result.push(token);
|
2489 | }
|
2490 |
|
2491 | return result;
|
2492 | }, []);
|
2493 | var added = Object.keys(current).reduce(function (result, token) {
|
2494 | if (!last[token]) {
|
2495 | result.push(token);
|
2496 | }
|
2497 |
|
2498 | return result;
|
2499 | }, []);
|
2500 | return {
|
2501 | added: added,
|
2502 | removed: removed
|
2503 | };
|
2504 |
|
2505 | function makeDict(modifier) {
|
2506 | var dict = {};
|
2507 | ModifierUtil.split(modifier).forEach(function (token) {
|
2508 | return dict[token] = token;
|
2509 | });
|
2510 | return dict;
|
2511 | }
|
2512 | }
|
2513 | /**
|
2514 | * @param {Object} diff
|
2515 | * @param {Array} diff.removed
|
2516 | * @param {Array} diff.added
|
2517 | * @param {Object} classList
|
2518 | * @param {String} template
|
2519 | */
|
2520 |
|
2521 | }, {
|
2522 | key: "applyDiffToClassList",
|
2523 | value: function applyDiffToClassList(diff, classList, template) {
|
2524 | diff.added.map(function (modifier) {
|
2525 | return template.replace(/\*/g, modifier);
|
2526 | }).forEach(function (klass) {
|
2527 | return klass.split(/\s+/).forEach(function (k) {
|
2528 | return classList.add(k);
|
2529 | });
|
2530 | });
|
2531 | diff.removed.map(function (modifier) {
|
2532 | return template.replace(/\*/g, modifier);
|
2533 | }).forEach(function (klass) {
|
2534 | return klass.split(/\s+/).forEach(function (k) {
|
2535 | return classList.remove(k);
|
2536 | });
|
2537 | });
|
2538 | }
|
2539 | /**
|
2540 | * @param {Object} diff
|
2541 | * @param {Array} diff.removed
|
2542 | * @param {Array} diff.added
|
2543 | * @param {HTMLElement} element
|
2544 | * @param {Object} scheme
|
2545 | */
|
2546 |
|
2547 | }, {
|
2548 | key: "applyDiffToElement",
|
2549 | value: function applyDiffToElement(diff, element, scheme) {
|
2550 | Object.keys(scheme).forEach(function (selector) {
|
2551 | var targetElements = !selector || util$4.match(element, selector) ? [element] : Array.prototype.filter.call(element.querySelectorAll(selector), function (targetElement) {
|
2552 | return !util$4.findParent(targetElement, element.tagName, function (parent) {
|
2553 | return parent === element;
|
2554 | });
|
2555 | });
|
2556 |
|
2557 | for (var i = 0; i < targetElements.length; i++) {
|
2558 | ModifierUtil.applyDiffToClassList(diff, targetElements[i].classList, scheme[selector]);
|
2559 | }
|
2560 | });
|
2561 | }
|
2562 | /**
|
2563 | * @param {String} last
|
2564 | * @param {String} current
|
2565 | * @param {HTMLElement} element
|
2566 | * @param {Object} scheme
|
2567 | */
|
2568 |
|
2569 | }, {
|
2570 | key: "onModifierChanged",
|
2571 | value: function onModifierChanged(last, current, element, scheme) {
|
2572 | ModifierUtil.applyDiffToElement(ModifierUtil.diff(last, current), element, scheme);
|
2573 | autoStyle.restoreModifier(element);
|
2574 | }
|
2575 | }, {
|
2576 | key: "refresh",
|
2577 | value: function refresh(element, scheme) {
|
2578 | ModifierUtil.applyDiffToElement(ModifierUtil.diff('', element.getAttribute('modifier') || ''), element, scheme);
|
2579 | }
|
2580 | /**
|
2581 | * @param {HTMLElement} element
|
2582 | * @param {Object} scheme
|
2583 | */
|
2584 |
|
2585 | }, {
|
2586 | key: "initModifier",
|
2587 | value: function initModifier(element, scheme) {
|
2588 | var modifier = element.getAttribute('modifier');
|
2589 |
|
2590 | if (typeof modifier !== 'string') {
|
2591 | return;
|
2592 | }
|
2593 |
|
2594 | ModifierUtil.applyDiffToElement({
|
2595 | removed: [],
|
2596 | added: ModifierUtil.split(modifier)
|
2597 | }, element, scheme);
|
2598 | }
|
2599 | }, {
|
2600 | key: "split",
|
2601 | value: function split(modifier) {
|
2602 | if (typeof modifier !== 'string') {
|
2603 | return [];
|
2604 | }
|
2605 |
|
2606 | return modifier.trim().split(/ +/).filter(function (token) {
|
2607 | return token !== '';
|
2608 | });
|
2609 | }
|
2610 | /**
|
2611 | * Add modifier token to an element.
|
2612 | */
|
2613 |
|
2614 | }, {
|
2615 | key: "addModifier",
|
2616 | value: function addModifier(element, modifierToken) {
|
2617 | if (!element.hasAttribute('modifier')) {
|
2618 | element.setAttribute('modifier', modifierToken);
|
2619 | } else {
|
2620 | var tokens = ModifierUtil.split(element.getAttribute('modifier'));
|
2621 |
|
2622 | if (tokens.indexOf(modifierToken) == -1) {
|
2623 | tokens.push(modifierToken);
|
2624 | element.setAttribute('modifier', tokens.join(' '));
|
2625 | }
|
2626 | }
|
2627 | }
|
2628 | /**
|
2629 | * Remove modifier token from an element.
|
2630 | */
|
2631 |
|
2632 | }, {
|
2633 | key: "removeModifier",
|
2634 | value: function removeModifier(element, modifierToken) {
|
2635 | if (element.hasAttribute('modifier')) {
|
2636 | var tokens = ModifierUtil.split(element.getAttribute('modifier'));
|
2637 | var index = tokens.indexOf(modifierToken);
|
2638 |
|
2639 | if (index !== -1) {
|
2640 | tokens.splice(index, 1);
|
2641 | element.setAttribute('modifier', tokens.join(' '));
|
2642 | }
|
2643 | }
|
2644 | }
|
2645 | }]);
|
2646 |
|
2647 | return ModifierUtil;
|
2648 | }();
|
2649 |
|
2650 | /*
|
2651 | Copyright 2013-2015 ASIAL CORPORATION
|
2652 |
|
2653 | Licensed under the Apache License, Version 2.0 (the "License");
|
2654 | you may not use this file except in compliance with the License.
|
2655 | You may obtain a copy of the License at
|
2656 |
|
2657 | http://www.apache.org/licenses/LICENSE-2.0
|
2658 |
|
2659 | Unless required by applicable law or agreed to in writing, software
|
2660 | distributed under the License is distributed on an "AS IS" BASIS,
|
2661 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
2662 | See the License for the specific language governing permissions and
|
2663 | limitations under the License.
|
2664 |
|
2665 | */
|
2666 |
|
2667 | var startsWith = function startsWith(s, c) {
|
2668 | return s.substr(0, c.length) === c;
|
2669 | };
|
2670 |
|
2671 | var endsWith = function endsWith(s, c) {
|
2672 | return s.substr(s.length - c.length, c.length) === c;
|
2673 | };
|
2674 |
|
2675 | var unwrap = function unwrap(s) {
|
2676 | return s.slice(1, -1);
|
2677 | };
|
2678 |
|
2679 | var isObjectString = function isObjectString(s) {
|
2680 | return startsWith(s, '{') && endsWith(s, '}');
|
2681 | };
|
2682 |
|
2683 | var isArrayString = function isArrayString(s) {
|
2684 | return startsWith(s, '[') && endsWith(s, ']');
|
2685 | };
|
2686 |
|
2687 | var isQuotedString = function isQuotedString(s) {
|
2688 | return startsWith(s, '\'') && endsWith(s, '\'') || startsWith(s, '"') && endsWith(s, '"');
|
2689 | };
|
2690 |
|
2691 | var error$1 = function error(token, string, originalString) {
|
2692 | throw new Error('Unexpected token \'' + token + '\' at position ' + (originalString.length - string.length - 1) + ' in string: \'' + originalString + '\'');
|
2693 | };
|
2694 |
|
2695 | var processToken = function processToken(token, string, originalString) {
|
2696 | if (token === 'true' || token === 'false') {
|
2697 | return token === 'true';
|
2698 | } else if (isQuotedString(token)) {
|
2699 | return unwrap(token);
|
2700 | } else if (!isNaN(token)) {
|
2701 | return +token;
|
2702 | } else if (isObjectString(token)) {
|
2703 | return parseObject(unwrap(token));
|
2704 | } else if (isArrayString(token)) {
|
2705 | return parseArray(unwrap(token));
|
2706 | } else {
|
2707 | error$1(token, string, originalString);
|
2708 | }
|
2709 | };
|
2710 |
|
2711 | var nextToken = function nextToken(string) {
|
2712 | string = string.trim();
|
2713 | var limit = string.length;
|
2714 |
|
2715 | if (string[0] === ':' || string[0] === ',') {
|
2716 | limit = 1;
|
2717 | } else if (string[0] === '{' || string[0] === '[') {
|
2718 | var c = string.charCodeAt(0);
|
2719 | var nestedObject = 1;
|
2720 |
|
2721 | for (var i = 1; i < string.length; i++) {
|
2722 | if (string.charCodeAt(i) === c) {
|
2723 | nestedObject++;
|
2724 | } else if (string.charCodeAt(i) === c + 2) {
|
2725 | nestedObject--;
|
2726 |
|
2727 | if (nestedObject === 0) {
|
2728 | limit = i + 1;
|
2729 | break;
|
2730 | }
|
2731 | }
|
2732 | }
|
2733 | } else if (string[0] === '\'' || string[0] === '"') {
|
2734 | for (var _i = 1; _i < string.length; _i++) {
|
2735 | if (string[_i] === string[0]) {
|
2736 | limit = _i + 1;
|
2737 | break;
|
2738 | }
|
2739 | }
|
2740 | } else {
|
2741 | for (var _i2 = 1; _i2 < string.length; _i2++) {
|
2742 | if ([' ', ',', ':'].indexOf(string[_i2]) !== -1) {
|
2743 | limit = _i2;
|
2744 | break;
|
2745 | }
|
2746 | }
|
2747 | }
|
2748 |
|
2749 | return string.slice(0, limit);
|
2750 | };
|
2751 |
|
2752 | var parseObject = function parseObject(string) {
|
2753 | var isValidKey = function isValidKey(key) {
|
2754 | return /^[A-Z_$][A-Z0-9_$]*$/i.test(key);
|
2755 | };
|
2756 |
|
2757 | string = string.trim();
|
2758 | var originalString = string;
|
2759 | var object = {};
|
2760 | var readingKey = true,
|
2761 | key,
|
2762 | previousToken,
|
2763 | token;
|
2764 |
|
2765 | while (string.length > 0) {
|
2766 | previousToken = token;
|
2767 | token = nextToken(string);
|
2768 | string = string.slice(token.length, string.length).trim();
|
2769 |
|
2770 | if (token === ':' && (!readingKey || !previousToken || previousToken === ',') || token === ',' && readingKey || token !== ':' && token !== ',' && previousToken && previousToken !== ',' && previousToken !== ':') {
|
2771 | error$1(token, string, originalString);
|
2772 | } else if (token === ':' && readingKey && previousToken) {
|
2773 | previousToken = isQuotedString(previousToken) ? unwrap(previousToken) : previousToken;
|
2774 |
|
2775 | if (isValidKey(previousToken)) {
|
2776 | key = previousToken;
|
2777 | readingKey = false;
|
2778 | } else {
|
2779 | throw new Error('Invalid key token \'' + previousToken + '\' at position 0 in string: \'' + originalString + '\'');
|
2780 | }
|
2781 | } else if (token === ',' && !readingKey && previousToken) {
|
2782 | object[key] = processToken(previousToken, string, originalString);
|
2783 | readingKey = true;
|
2784 | }
|
2785 | }
|
2786 |
|
2787 | if (token) {
|
2788 | object[key] = processToken(token, string, originalString);
|
2789 | }
|
2790 |
|
2791 | return object;
|
2792 | };
|
2793 |
|
2794 | var parseArray = function parseArray(string) {
|
2795 | string = string.trim();
|
2796 | var originalString = string;
|
2797 | var array = [];
|
2798 | var previousToken, token;
|
2799 |
|
2800 | while (string.length > 0) {
|
2801 | previousToken = token;
|
2802 | token = nextToken(string);
|
2803 | string = string.slice(token.length, string.length).trim();
|
2804 |
|
2805 | if (token === ',' && (!previousToken || previousToken === ',')) {
|
2806 | error$1(token, string, originalString);
|
2807 | } else if (token === ',') {
|
2808 | array.push(processToken(previousToken, string, originalString));
|
2809 | }
|
2810 | }
|
2811 |
|
2812 | if (token) {
|
2813 | if (token !== ',') {
|
2814 | array.push(processToken(token, string, originalString));
|
2815 | } else {
|
2816 | error$1(token, string, originalString);
|
2817 | }
|
2818 | }
|
2819 |
|
2820 | return array;
|
2821 | };
|
2822 |
|
2823 | var parse = function parse(string) {
|
2824 | string = string.trim();
|
2825 |
|
2826 | if (isObjectString(string)) {
|
2827 | return parseObject(unwrap(string));
|
2828 | } else if (isArrayString(string)) {
|
2829 | return parseArray(unwrap(string));
|
2830 | } else {
|
2831 | throw new Error('Provided string must be object or array like: ' + string);
|
2832 | }
|
2833 | };
|
2834 |
|
2835 | var util$3 = {};
|
2836 | var errorPrefix = '[Onsen UI]';
|
2837 | util$3.globals = {
|
2838 | fabOffset: 0,
|
2839 | errorPrefix: errorPrefix,
|
2840 | supportsPassive: false
|
2841 | };
|
2842 |
|
2843 | platform._runOnActualPlatform(function () {
|
2844 | util$3.globals.actualMobileOS = platform.getMobileOS();
|
2845 | util$3.globals.isWKWebView = platform.isWKWebView();
|
2846 | });
|
2847 |
|
2848 | try {
|
2849 | var opts = Object.defineProperty({}, 'passive', {
|
2850 | get: function get() {
|
2851 | util$3.globals.supportsPassive = true;
|
2852 | } // eslint-disable-line getter-return
|
2853 |
|
2854 | });
|
2855 | window.addEventListener('testPassive', null, opts);
|
2856 | window.removeEventListener('testPassive', null, opts);
|
2857 | } catch (e) {
|
2858 | }
|
2859 | /**
|
2860 | * @param {Element} el Target
|
2861 | * @param {String} name Event name
|
2862 | * @param {Function} handler Event handler
|
2863 | * @param {Object} [opt] Event options (passive, capture...)
|
2864 | * @param {Boolean} [isGD] If comes from GestureDetector. Just for testing.
|
2865 | */
|
2866 |
|
2867 |
|
2868 | util$3.addEventListener = function (el, name, handler, opt, isGD) {
|
2869 | el.addEventListener(name, handler, util$3.globals.supportsPassive ? opt : (opt || {}).capture);
|
2870 | };
|
2871 |
|
2872 | util$3.removeEventListener = function (el, name, handler, opt, isGD) {
|
2873 | el.removeEventListener(name, handler, util$3.globals.supportsPassive ? opt : (opt || {}).capture);
|
2874 | };
|
2875 | /**
|
2876 | * @param {String/Function} query dot class name or node name or matcher function.
|
2877 | * @return {Function}
|
2878 | */
|
2879 |
|
2880 |
|
2881 | util$3.prepareQuery = function (query) {
|
2882 | return query instanceof Function ? query : function (element) {
|
2883 | return util$3.match(element, query);
|
2884 | };
|
2885 | };
|
2886 | /**
|
2887 | * @param {Element} e
|
2888 | * @param {String/Function} s CSS Selector.
|
2889 | * @return {Boolean}
|
2890 | */
|
2891 |
|
2892 |
|
2893 | util$3.match = function (e, s) {
|
2894 | return (e.matches || e.webkitMatchesSelector || e.mozMatchesSelector || e.msMatchesSelector).call(e, s);
|
2895 | };
|
2896 | /**
|
2897 | * @param {Element} element
|
2898 | * @param {String/Function} query dot class name or node name or matcher function.
|
2899 | * @return {HTMLElement/null}
|
2900 | */
|
2901 |
|
2902 |
|
2903 | util$3.findChild = function (element, query) {
|
2904 | var match = util$3.prepareQuery(query); // Caution: `element.children` is `undefined` in some environments if `element` is `svg`
|
2905 |
|
2906 | for (var i = 0; i < element.childNodes.length; i++) {
|
2907 | var node = element.childNodes[i];
|
2908 |
|
2909 | if (node.nodeType !== Node.ELEMENT_NODE) {
|
2910 | // process only element nodes
|
2911 | continue;
|
2912 | }
|
2913 |
|
2914 | if (match(node)) {
|
2915 | return node;
|
2916 | }
|
2917 | }
|
2918 |
|
2919 | return null;
|
2920 | };
|
2921 | /**
|
2922 | * @param {Element} element
|
2923 | * @param {String/Function} query dot class name or node name or matcher function.
|
2924 | * @return {HTMLElement/null}
|
2925 | */
|
2926 |
|
2927 |
|
2928 | util$3.findParent = function (element, query, until) {
|
2929 | var match = util$3.prepareQuery(query);
|
2930 | var parent = element.parentNode;
|
2931 |
|
2932 | for (;;) {
|
2933 | if (!parent || parent === document || parent instanceof DocumentFragment || until && until(parent)) {
|
2934 | return null;
|
2935 | } else if (match(parent)) {
|
2936 | return parent;
|
2937 | }
|
2938 |
|
2939 | parent = parent.parentNode;
|
2940 | }
|
2941 | };
|
2942 | /**
|
2943 | * @param {Element} element
|
2944 | * @return {boolean}
|
2945 | */
|
2946 |
|
2947 |
|
2948 | util$3.isAttached = function (element) {
|
2949 | return document.body.contains(element);
|
2950 | };
|
2951 | /**
|
2952 | * @param {Element} element
|
2953 | * @return {boolean}
|
2954 | */
|
2955 |
|
2956 |
|
2957 | util$3.hasAnyComponentAsParent = function (element) {
|
2958 | while (element && document.documentElement !== element) {
|
2959 | element = element.parentNode;
|
2960 |
|
2961 | if (element && element.nodeName.toLowerCase().match(/(ons-navigator|ons-tabbar|ons-modal)/)) {
|
2962 | return true;
|
2963 | }
|
2964 | }
|
2965 |
|
2966 | return false;
|
2967 | };
|
2968 | /**
|
2969 | * @param {Object} element
|
2970 | * @return {Array}
|
2971 | */
|
2972 |
|
2973 |
|
2974 | util$3.getAllChildNodes = function (element) {
|
2975 | var _ref;
|
2976 |
|
2977 | return (_ref = [element]).concat.apply(_ref, _toConsumableArray(Array.from(element.children).map(function (childEl) {
|
2978 | return util$3.getAllChildNodes(childEl);
|
2979 | })));
|
2980 | };
|
2981 | /**
|
2982 | * @param {Element} element
|
2983 | * @return {boolean}
|
2984 | */
|
2985 |
|
2986 |
|
2987 | util$3.isPageControl = function (element) {
|
2988 | return element.nodeName.match(/^ons-(navigator|splitter|tabbar|page)$/i);
|
2989 | };
|
2990 | /**
|
2991 | * @param {Element} element
|
2992 | * @param {String} action to propagate
|
2993 | */
|
2994 |
|
2995 |
|
2996 | util$3.propagateAction = function (element, action) {
|
2997 | for (var i = 0; i < element.childNodes.length; i++) {
|
2998 | var child = element.childNodes[i];
|
2999 |
|
3000 | if (child[action] instanceof Function) {
|
3001 | child[action]();
|
3002 | } else {
|
3003 | util$3.propagateAction(child, action);
|
3004 | }
|
3005 | }
|
3006 | };
|
3007 | /**
|
3008 | * @param {String} string - string to be camelized
|
3009 | * @return {String} Camelized string
|
3010 | */
|
3011 |
|
3012 |
|
3013 | util$3.camelize = function (string) {
|
3014 | return string.toLowerCase().replace(/-([a-z])/g, function (m, l) {
|
3015 | return l.toUpperCase();
|
3016 | });
|
3017 | };
|
3018 | /**
|
3019 | * @param {String} string - string to be hyphenated
|
3020 | * @return {String} Hyphenated string
|
3021 | */
|
3022 |
|
3023 |
|
3024 | util$3.hyphenate = function (string) {
|
3025 | return string.replace(/([a-zA-Z])([A-Z])/g, '$1-$2').toLowerCase();
|
3026 | };
|
3027 | /**
|
3028 | * @param {String} selector - tag and class only
|
3029 | * @param {Object} style
|
3030 | * @param {Element}
|
3031 | */
|
3032 |
|
3033 |
|
3034 | util$3.create = function () {
|
3035 | var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
3036 | var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
3037 | var classList = selector.split('.');
|
3038 | var element = document.createElement(classList.shift() || 'div');
|
3039 |
|
3040 | if (classList.length) {
|
3041 | element.className = classList.join(' ');
|
3042 | }
|
3043 |
|
3044 | styler(element, style);
|
3045 | return element;
|
3046 | };
|
3047 | /**
|
3048 | * @param {String} html
|
3049 | * @return {Element}
|
3050 | */
|
3051 |
|
3052 |
|
3053 | util$3.createElement = function (html) {
|
3054 | var wrapper = document.createElement('div');
|
3055 |
|
3056 | if (html instanceof DocumentFragment) {
|
3057 | wrapper.appendChild(document.importNode(html, true));
|
3058 | } else {
|
3059 | wrapper.innerHTML = html.trim();
|
3060 | }
|
3061 |
|
3062 | if (wrapper.children.length > 1) {
|
3063 | util$3.throw('HTML template must contain a single root element');
|
3064 | }
|
3065 |
|
3066 | var element = wrapper.children[0];
|
3067 | wrapper.children[0].remove();
|
3068 | return element;
|
3069 | };
|
3070 | /**
|
3071 | * @param {String} html
|
3072 | * @return {HTMLFragment}
|
3073 | */
|
3074 |
|
3075 |
|
3076 | util$3.createFragment = function (html) {
|
3077 | var template = document.createElement('template');
|
3078 | template.innerHTML = html;
|
3079 | return document.importNode(template.content, true);
|
3080 | };
|
3081 | /*
|
3082 | * @param {Object} dst Destination object.
|
3083 | * @param {...Object} src Source object(s).
|
3084 | * @returns {Object} Reference to `dst`.
|
3085 | */
|
3086 |
|
3087 |
|
3088 | util$3.extend = function (dst) {
|
3089 | for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
3090 | args[_key - 1] = arguments[_key];
|
3091 | }
|
3092 |
|
3093 | for (var i = 0; i < args.length; i++) {
|
3094 | if (args[i]) {
|
3095 | var keys = Object.keys(args[i]);
|
3096 |
|
3097 | for (var j = 0; j < keys.length; j++) {
|
3098 | var key = keys[j];
|
3099 | dst[key] = args[i][key];
|
3100 | }
|
3101 | }
|
3102 | }
|
3103 |
|
3104 | return dst;
|
3105 | };
|
3106 | /**
|
3107 | * @param {Object} arrayLike
|
3108 | * @return {Array}
|
3109 | */
|
3110 |
|
3111 |
|
3112 | util$3.arrayFrom = function (arrayLike) {
|
3113 | return Array.prototype.slice.apply(arrayLike);
|
3114 | };
|
3115 | /**
|
3116 | * @param {String} jsonString
|
3117 | * @param {Object} [failSafe]
|
3118 | * @return {Object}
|
3119 | */
|
3120 |
|
3121 |
|
3122 | util$3.parseJSONObjectSafely = function (jsonString) {
|
3123 | var failSafe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
3124 |
|
3125 | try {
|
3126 | var result = JSON.parse('' + jsonString);
|
3127 |
|
3128 | if (_typeof(result) === 'object' && result !== null) {
|
3129 | return result;
|
3130 | }
|
3131 | } catch (e) {
|
3132 | return failSafe;
|
3133 | }
|
3134 |
|
3135 | return failSafe;
|
3136 | };
|
3137 | /**
|
3138 | * @param {String} path - path such as 'myApp.controllers.data.loadData'
|
3139 | * @return {Any} - whatever is located at that path
|
3140 | */
|
3141 |
|
3142 |
|
3143 | util$3.findFromPath = function (path) {
|
3144 | path = path.split('.');
|
3145 | var el = window,
|
3146 | key;
|
3147 |
|
3148 | while (key = path.shift()) {
|
3149 | // eslint-disable-line no-cond-assign
|
3150 | el = el[key];
|
3151 | }
|
3152 |
|
3153 | return el;
|
3154 | };
|
3155 | /**
|
3156 | * @param {HTMLElement} container - Page or page-container that implements 'topPage'
|
3157 | * @return {HTMLElement|null} - Visible page element or null if not found.
|
3158 | */
|
3159 |
|
3160 |
|
3161 | util$3.getTopPage = function (container) {
|
3162 | return container && (container.tagName.toLowerCase() === 'ons-page' ? container : container.topPage) || null;
|
3163 | };
|
3164 | /**
|
3165 | * @param {HTMLElement} container - Element where the search begins
|
3166 | * @return {HTMLElement|null} - Page element that contains the visible toolbar or null.
|
3167 | */
|
3168 |
|
3169 |
|
3170 | util$3.findToolbarPage = function (container) {
|
3171 | var page = util$3.getTopPage(container);
|
3172 |
|
3173 | if (page) {
|
3174 | if (page._canAnimateToolbar()) {
|
3175 | return page;
|
3176 | }
|
3177 |
|
3178 | for (var i = 0; i < page._contentElement.children.length; i++) {
|
3179 | var nextPage = util$3.getTopPage(page._contentElement.children[i]);
|
3180 |
|
3181 | if (nextPage && !/ons-tabbar/i.test(page._contentElement.children[i].tagName)) {
|
3182 | return util$3.findToolbarPage(nextPage);
|
3183 | }
|
3184 | }
|
3185 | }
|
3186 |
|
3187 | return null;
|
3188 | };
|
3189 | /**
|
3190 | * @param {Element} element
|
3191 | * @param {String} eventName
|
3192 | * @param {Object} [detail]
|
3193 | * @return {CustomEvent}
|
3194 | */
|
3195 |
|
3196 |
|
3197 | util$3.triggerElementEvent = function (target, eventName) {
|
3198 | var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
3199 | var event = new CustomEvent(eventName, {
|
3200 | bubbles: true,
|
3201 | cancelable: true,
|
3202 | detail: detail
|
3203 | });
|
3204 | Object.keys(detail).forEach(function (key) {
|
3205 | event[key] = detail[key];
|
3206 | });
|
3207 | target.dispatchEvent(event);
|
3208 | return event;
|
3209 | };
|
3210 | /**
|
3211 | * @param {Element} target
|
3212 | * @param {String} modifierName
|
3213 | * @return {Boolean}
|
3214 | */
|
3215 |
|
3216 |
|
3217 | util$3.hasModifier = function (target, modifierName) {
|
3218 | if (!target.hasAttribute('modifier')) {
|
3219 | return false;
|
3220 | }
|
3221 |
|
3222 | return RegExp("(^|\\s+)".concat(modifierName, "($|\\s+)"), 'i').test(target.getAttribute('modifier'));
|
3223 | };
|
3224 | /**
|
3225 | * @param {Element} target
|
3226 | * @param {String} modifierName
|
3227 | * @param {Object} options.autoStyle Maps the modifierName to the corresponding styled modifier.
|
3228 | * @param {Object} options.forceAutoStyle Ignores platform limitation.
|
3229 | * @return {Boolean} Whether it was added or not.
|
3230 | */
|
3231 |
|
3232 |
|
3233 | util$3.addModifier = function (target, modifierName) {
|
3234 | var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
3235 |
|
3236 | if (options.autoStyle) {
|
3237 | modifierName = autoStyle.mapModifier(modifierName, target, options.forceAutoStyle);
|
3238 | }
|
3239 |
|
3240 | if (util$3.hasModifier(target, modifierName)) {
|
3241 | return false;
|
3242 | }
|
3243 |
|
3244 | target.setAttribute('modifier', ((target.getAttribute('modifier') || '') + ' ' + modifierName).trim());
|
3245 | return true;
|
3246 | };
|
3247 | /**
|
3248 | * @param {Element} target
|
3249 | * @param {String} modifierName
|
3250 | * @param {Object} options.autoStyle Maps the modifierName to the corresponding styled modifier.
|
3251 | * @param {Object} options.forceAutoStyle Ignores platform limitation.
|
3252 | * @return {Boolean} Whether it was found or not.
|
3253 | */
|
3254 |
|
3255 |
|
3256 | util$3.removeModifier = function (target, modifierName) {
|
3257 | var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
3258 |
|
3259 | if (options.autoStyle) {
|
3260 | modifierName = autoStyle.mapModifier(modifierName, target, options.forceAutoStyle);
|
3261 | }
|
3262 |
|
3263 | if (!target.getAttribute('modifier') || !util$3.hasModifier(target, modifierName)) {
|
3264 | return false;
|
3265 | }
|
3266 |
|
3267 | var newModifiers = target.getAttribute('modifier').split(/\s+/).filter(function (m) {
|
3268 | return m && m !== modifierName;
|
3269 | });
|
3270 | newModifiers.length ? target.setAttribute('modifier', newModifiers.join(' ')) : target.removeAttribute('modifier');
|
3271 | return true;
|
3272 | };
|
3273 | /**
|
3274 | * @param {Element} target
|
3275 | * @param {String} modifierName
|
3276 | * @param {Boolean} options.force Forces modifier to be added or removed.
|
3277 | * @param {Object} options.autoStyle Maps the modifierName to the corresponding styled modifier.
|
3278 | * @param {Boolean} options.forceAutoStyle Ignores platform limitation.
|
3279 | * @return {Boolean} Whether it was found or not.
|
3280 | */
|
3281 |
|
3282 |
|
3283 | util$3.toggleModifier = function () {
|
3284 | var options = arguments.length > 2 ? arguments.length <= 2 ? undefined : arguments[2] : {};
|
3285 | var force = typeof options === 'boolean' ? options : options.force;
|
3286 | var toggle = typeof force === 'boolean' ? force : !util$3.hasModifier.apply(util$3, arguments);
|
3287 | toggle ? util$3.addModifier.apply(util$3, arguments) : util$3.removeModifier.apply(util$3, arguments);
|
3288 | };
|
3289 | /**
|
3290 | * @param {Element} el
|
3291 | * @param {String} defaultClass
|
3292 | * @param {Object} scheme
|
3293 | */
|
3294 |
|
3295 |
|
3296 | util$3.restoreClass = function (el, defaultClass, scheme) {
|
3297 | defaultClass.split(/\s+/).forEach(function (c) {
|
3298 | return c !== '' && !el.classList.contains(c) && el.classList.add(c);
|
3299 | });
|
3300 | el.hasAttribute('modifier') && ModifierUtil.refresh(el, scheme);
|
3301 | }; // TODO: FIX
|
3302 |
|
3303 |
|
3304 | util$3.updateParentPosition = function (el) {
|
3305 | if (!el._parentUpdated && el.parentElement) {
|
3306 | if (window.getComputedStyle(el.parentElement).getPropertyValue('position') === 'static') {
|
3307 | el.parentElement.style.position = 'relative';
|
3308 | }
|
3309 |
|
3310 | el._parentUpdated = true;
|
3311 | }
|
3312 | };
|
3313 |
|
3314 | util$3.toggleAttribute = function (element, name, value) {
|
3315 | if (value) {
|
3316 | element.setAttribute(name, typeof value === 'boolean' ? '' : value);
|
3317 | } else {
|
3318 | element.removeAttribute(name);
|
3319 | }
|
3320 | };
|
3321 |
|
3322 | util$3.bindListeners = function (element, listenerNames) {
|
3323 | listenerNames.forEach(function (name) {
|
3324 | var boundName = name.replace(/^_[a-z]/, '_bound' + name[1].toUpperCase());
|
3325 | element[boundName] = element[boundName] || element[name].bind(element);
|
3326 | });
|
3327 | };
|
3328 |
|
3329 | util$3.each = function (obj, f) {
|
3330 | return Object.keys(obj).forEach(function (key) {
|
3331 | return f(key, obj[key]);
|
3332 | });
|
3333 | };
|
3334 | /**
|
3335 | * @param {Element} target
|
3336 | * @param {boolean} hasRipple
|
3337 | * @param {Object} attrs
|
3338 | */
|
3339 |
|
3340 |
|
3341 | util$3.updateRipple = function (target, hasRipple) {
|
3342 | var attrs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
3343 |
|
3344 | if (hasRipple === undefined) {
|
3345 | hasRipple = target.hasAttribute('ripple');
|
3346 | }
|
3347 |
|
3348 | var rippleElement = util$3.findChild(target, 'ons-ripple');
|
3349 |
|
3350 | if (hasRipple) {
|
3351 | if (!rippleElement) {
|
3352 | var element = document.createElement('ons-ripple');
|
3353 | Object.keys(attrs).forEach(function (key) {
|
3354 | return element.setAttribute(key, attrs[key]);
|
3355 | });
|
3356 | target.insertBefore(element, target.firstChild);
|
3357 | }
|
3358 | } else if (rippleElement) {
|
3359 | rippleElement.remove();
|
3360 | }
|
3361 | };
|
3362 | /**
|
3363 | * @param {String}
|
3364 | * @return {Object}
|
3365 | */
|
3366 |
|
3367 |
|
3368 | util$3.animationOptionsParse = parse;
|
3369 | /**
|
3370 | * @param {*} value
|
3371 | */
|
3372 |
|
3373 | util$3.isInteger = function (value) {
|
3374 | return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
|
3375 | };
|
3376 | /**
|
3377 | * @return {Object} Deferred promise.
|
3378 | */
|
3379 |
|
3380 |
|
3381 | util$3.defer = function () {
|
3382 | var deferred = {};
|
3383 | deferred.promise = new Promise(function (resolve, reject) {
|
3384 | deferred.resolve = resolve;
|
3385 | deferred.reject = reject;
|
3386 | });
|
3387 | return deferred;
|
3388 | };
|
3389 | /**
|
3390 | * Show warnings when they are enabled.
|
3391 | *
|
3392 | * @param {*} arguments to console.warn
|
3393 | */
|
3394 |
|
3395 |
|
3396 | util$3.warn = function () {
|
3397 | if (!internal$1.config.warningsDisabled) {
|
3398 | var _console;
|
3399 |
|
3400 | for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
3401 | args[_key2] = arguments[_key2];
|
3402 | }
|
3403 |
|
3404 | (_console = console).warn.apply(_console, [errorPrefix].concat(args));
|
3405 | }
|
3406 | };
|
3407 |
|
3408 | util$3.throw = function (message) {
|
3409 | throw new Error("".concat(errorPrefix, " ").concat(message));
|
3410 | };
|
3411 |
|
3412 | util$3.throwAbstract = function () {
|
3413 | return util$3.throw('Cannot instantiate abstract class');
|
3414 | };
|
3415 |
|
3416 | util$3.throwMember = function () {
|
3417 | return util$3.throw('Class member must be implemented');
|
3418 | };
|
3419 |
|
3420 | util$3.throwPageLoader = function () {
|
3421 | return util$3.throw('First parameter should be an instance of PageLoader');
|
3422 | };
|
3423 |
|
3424 | util$3.throwAnimator = function (el) {
|
3425 | return util$3.throw("\"Animator\" param must inherit ".concat(el, "Animator"));
|
3426 | };
|
3427 |
|
3428 | var prevent = function prevent(e) {
|
3429 | return e.cancelable && e.preventDefault();
|
3430 | };
|
3431 | /**
|
3432 | * Prevent scrolling while draging horizontally on iOS.
|
3433 | *
|
3434 | * @param {gd} GestureDetector instance
|
3435 | */
|
3436 |
|
3437 |
|
3438 | util$3.iosPreventScroll = function (gd) {
|
3439 | if (util$3.globals.actualMobileOS === 'ios') {
|
3440 | var clean = function clean(e) {
|
3441 | gd.off('touchmove', prevent);
|
3442 | gd.off('dragend', clean);
|
3443 | };
|
3444 |
|
3445 | gd.on('touchmove', prevent);
|
3446 | gd.on('dragend', clean);
|
3447 | }
|
3448 | };
|
3449 | /**
|
3450 | * Prevents scroll in underlying pages on iOS. See #2220 #2274 #1949
|
3451 | *
|
3452 | * @param {el} HTMLElement that prevents the events
|
3453 | * @param {add} Boolean Add or remove event listeners
|
3454 | */
|
3455 |
|
3456 |
|
3457 | util$3.iosPageScrollFix = function (add) {
|
3458 | // Full fix - May cause issues with UIWebView's momentum scroll
|
3459 | if (util$3.globals.actualMobileOS === 'ios') {
|
3460 | document.body.classList.toggle('ons-ios-scroll', add); // Allows custom and localized fixes (#2274)
|
3461 |
|
3462 | document.body.classList.toggle('ons-ios-scroll-fix', add);
|
3463 | }
|
3464 | };
|
3465 | /**
|
3466 | * Distance and deltaTime filter some weird dragstart events that are not fired immediately.
|
3467 | *
|
3468 | * @param {event}
|
3469 | */
|
3470 |
|
3471 |
|
3472 | util$3.isValidGesture = function (event) {
|
3473 | return event.gesture !== undefined && (event.gesture.distance <= 15 || event.gesture.deltaTime <= 100);
|
3474 | };
|
3475 |
|
3476 | util$3.checkMissingImport = function () {
|
3477 | for (var _len3 = arguments.length, elementNames = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
3478 | elementNames[_key3] = arguments[_key3];
|
3479 | }
|
3480 |
|
3481 | elementNames.forEach(function (name) {
|
3482 | if (!onsElements[name]) {
|
3483 | util$3.throw("Ons".concat(name, " is required but was not imported (Custom Elements)"));
|
3484 | }
|
3485 | });
|
3486 | };
|
3487 | /**
|
3488 | * Defines a boolean property that reflects an attribute of the same name for a
|
3489 | * given list of attributes.
|
3490 | */
|
3491 |
|
3492 |
|
3493 | util$3.defineBooleanProperties = function (object, attributeList) {
|
3494 | attributeList.forEach(function (attributeName) {
|
3495 | var propertyName = util$3.camelize(attributeName);
|
3496 | Object.defineProperty(object.prototype, propertyName, {
|
3497 | get: function get() {
|
3498 | return this.hasAttribute(attributeName);
|
3499 | },
|
3500 | set: function set(value) {
|
3501 | if (value) {
|
3502 | this.setAttribute(attributeName, '');
|
3503 | } else {
|
3504 | this.removeAttribute(attributeName);
|
3505 | }
|
3506 | },
|
3507 | configurable: true
|
3508 | });
|
3509 | });
|
3510 | };
|
3511 | /**
|
3512 | * Defines a string property that reflects an attribute of the same name for a
|
3513 | * given list of attributes.
|
3514 | */
|
3515 |
|
3516 |
|
3517 | util$3.defineStringProperties = function (object, attributeList) {
|
3518 | attributeList.forEach(function (attributeName) {
|
3519 | var propertyName = util$3.camelize(attributeName);
|
3520 | Object.defineProperty(object.prototype, propertyName, {
|
3521 | get: function get() {
|
3522 | return this.getAttribute(attributeName);
|
3523 | },
|
3524 | set: function set(value) {
|
3525 | if (value === null || value === undefined) {
|
3526 | this.removeAttribute(attributeName);
|
3527 | } else {
|
3528 | this.setAttribute(attributeName, value);
|
3529 | }
|
3530 | },
|
3531 | configurable: true
|
3532 | });
|
3533 | });
|
3534 | };
|
3535 | /**
|
3536 | * Makes a property for a listener e.g. onClick.
|
3537 | *
|
3538 | * Returns `onConnected` function which should be called in the element's
|
3539 | * connectedCallback, and `onDisconnected` function which should be called in
|
3540 | * the element's disconnectedCallback.
|
3541 | */
|
3542 |
|
3543 |
|
3544 | util$3.defineListenerProperty = function (element, eventName) {
|
3545 | var camelized = util$3.camelize(eventName);
|
3546 | var propertyName = 'on' + camelized.charAt(0).toUpperCase() + camelized.slice(1);
|
3547 | var handler;
|
3548 | Object.defineProperty(element, propertyName, {
|
3549 | get: function get() {
|
3550 | return handler;
|
3551 | },
|
3552 | set: function set(newHandler) {
|
3553 | if (element.isConnected) {
|
3554 | if (handler) {
|
3555 | element.removeEventListener(eventName, handler);
|
3556 | }
|
3557 |
|
3558 | element.addEventListener(eventName, newHandler);
|
3559 | }
|
3560 |
|
3561 | handler = newHandler;
|
3562 | },
|
3563 | configurable: true
|
3564 | });
|
3565 | return {
|
3566 | onConnected: function onConnected() {
|
3567 | if (element[propertyName]) {
|
3568 | element.addEventListener(eventName, element[propertyName]);
|
3569 | }
|
3570 | },
|
3571 | onDisconnected: function onDisconnected() {
|
3572 | if (element[propertyName]) {
|
3573 | element.removeEventListener(eventName, element[propertyName]);
|
3574 | }
|
3575 | }
|
3576 | };
|
3577 | };
|
3578 |
|
3579 | var util$4 = util$3;
|
3580 |
|
3581 | /*
|
3582 | Copyright 2013-2015 ASIAL CORPORATION
|
3583 |
|
3584 | Licensed under the Apache License, Version 2.0 (the "License");
|
3585 | you may not use this file except in compliance with the License.
|
3586 | You may obtain a copy of the License at
|
3587 |
|
3588 | http://www.apache.org/licenses/LICENSE-2.0
|
3589 |
|
3590 | Unless required by applicable law or agreed to in writing, software
|
3591 | distributed under the License is distributed on an "AS IS" BASIS,
|
3592 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
3593 | See the License for the specific language governing permissions and
|
3594 | limitations under the License.
|
3595 |
|
3596 | */
|
3597 |
|
3598 | var error = function error(message) {
|
3599 | return util$4.throw("In PageAttributeExpression: ".concat(message));
|
3600 | };
|
3601 |
|
3602 | var pageAttributeExpression = {
|
3603 | _variables: {},
|
3604 |
|
3605 | /**
|
3606 | * Define a variable.
|
3607 | *
|
3608 | * @param {String} name Name of the variable
|
3609 | * @param {String|Function} value Value of the variable. Can be a string or a function. The function must return a string.
|
3610 | * @param {Boolean} overwrite If this value is false, an error will be thrown when trying to define a variable that has already been defined.
|
3611 | */
|
3612 | defineVariable: function defineVariable(name, value) {
|
3613 | var overwrite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
3614 |
|
3615 | if (typeof name !== 'string') {
|
3616 | error('Variable name must be a string');
|
3617 | } else if (typeof value !== 'string' && typeof value !== 'function') {
|
3618 | error('Variable value must be a string or a function');
|
3619 | } else if (Object.prototype.hasOwnProperty.call(this._variables, name) && !overwrite) {
|
3620 | error("\"".concat(name, "\" is already defined"));
|
3621 | }
|
3622 |
|
3623 | this._variables[name] = value;
|
3624 | },
|
3625 |
|
3626 | /**
|
3627 | * Get a variable.
|
3628 | *
|
3629 | * @param {String} name Name of the variable.
|
3630 | * @return {String|Function|null}
|
3631 | */
|
3632 | getVariable: function getVariable(name) {
|
3633 | if (!Object.prototype.hasOwnProperty.call(this._variables, name)) {
|
3634 | return null;
|
3635 | }
|
3636 |
|
3637 | return this._variables[name];
|
3638 | },
|
3639 |
|
3640 | /**
|
3641 | * Remove a variable.
|
3642 | *
|
3643 | * @param {String} name Name of the varaible.
|
3644 | */
|
3645 | removeVariable: function removeVariable(name) {
|
3646 | delete this._variables[name];
|
3647 | },
|
3648 |
|
3649 | /**
|
3650 | * Get all variables.
|
3651 | *
|
3652 | * @return {Object}
|
3653 | */
|
3654 | getAllVariables: function getAllVariables() {
|
3655 | return this._variables;
|
3656 | },
|
3657 | _parsePart: function _parsePart(part) {
|
3658 | var c,
|
3659 | inInterpolation = false,
|
3660 | currentIndex = 0;
|
3661 | var tokens = [];
|
3662 |
|
3663 | if (part.length === 0) {
|
3664 | error('Unable to parse empty string');
|
3665 | }
|
3666 |
|
3667 | for (var i = 0; i < part.length; i++) {
|
3668 | c = part.charAt(i);
|
3669 |
|
3670 | if (c === '$' && part.charAt(i + 1) === '{') {
|
3671 | if (inInterpolation) {
|
3672 | error('Nested interpolation not supported');
|
3673 | }
|
3674 |
|
3675 | var token = part.substring(currentIndex, i);
|
3676 |
|
3677 | if (token.length > 0) {
|
3678 | tokens.push(part.substring(currentIndex, i));
|
3679 | }
|
3680 |
|
3681 | currentIndex = i;
|
3682 | inInterpolation = true;
|
3683 | } else if (c === '}') {
|
3684 | if (!inInterpolation) {
|
3685 | error('} must be preceeded by ${');
|
3686 | }
|
3687 |
|
3688 | var _token = part.substring(currentIndex, i + 1);
|
3689 |
|
3690 | if (_token.length > 0) {
|
3691 | tokens.push(part.substring(currentIndex, i + 1));
|
3692 | }
|
3693 |
|
3694 | currentIndex = i + 1;
|
3695 | inInterpolation = false;
|
3696 | }
|
3697 | }
|
3698 |
|
3699 | if (inInterpolation) {
|
3700 | error('Unterminated interpolation');
|
3701 | }
|
3702 |
|
3703 | tokens.push(part.substring(currentIndex, part.length));
|
3704 | return tokens;
|
3705 | },
|
3706 | _replaceToken: function _replaceToken(token) {
|
3707 | var re = /^\${(.*?)}$/,
|
3708 | match = token.match(re);
|
3709 |
|
3710 | if (match) {
|
3711 | var name = match[1].trim();
|
3712 | var variable = this.getVariable(name);
|
3713 |
|
3714 | if (variable === null) {
|
3715 | error("Variable \"".concat(name, "\" does not exist"));
|
3716 | } else if (typeof variable === 'string') {
|
3717 | return variable;
|
3718 | } else {
|
3719 | var rv = variable();
|
3720 |
|
3721 | if (typeof rv !== 'string') {
|
3722 | error('Must return a string');
|
3723 | }
|
3724 |
|
3725 | return rv;
|
3726 | }
|
3727 | } else {
|
3728 | return token;
|
3729 | }
|
3730 | },
|
3731 | _replaceTokens: function _replaceTokens(tokens) {
|
3732 | return tokens.map(this._replaceToken.bind(this));
|
3733 | },
|
3734 | _parseExpression: function _parseExpression(expression) {
|
3735 | return expression.split(',').map(function (part) {
|
3736 | return part.trim();
|
3737 | }).map(this._parsePart.bind(this)).map(this._replaceTokens.bind(this)).map(function (part) {
|
3738 | return part.join('');
|
3739 | });
|
3740 | },
|
3741 |
|
3742 | /**
|
3743 | * Evaluate an expression.
|
3744 | *
|
3745 | * @param {String} expression An page attribute expression.
|
3746 | * @return {Array}
|
3747 | */
|
3748 | evaluate: function evaluate(expression) {
|
3749 | if (!expression) {
|
3750 | return [];
|
3751 | }
|
3752 |
|
3753 | return this._parseExpression(expression);
|
3754 | }
|
3755 | }; // Define default variables.
|
3756 |
|
3757 | pageAttributeExpression.defineVariable('mobileOS', platform.getMobileOS());
|
3758 | pageAttributeExpression.defineVariable('iOSDevice', platform.getIOSDevice());
|
3759 | pageAttributeExpression.defineVariable('runtime', function () {
|
3760 | return platform.isWebView() ? 'cordova' : 'browser';
|
3761 | });
|
3762 |
|
3763 | var internal = {};
|
3764 | internal.config = {
|
3765 | autoStatusBarFill: true,
|
3766 | animationsDisabled: false,
|
3767 | warningsDisabled: false
|
3768 | };
|
3769 | internal.nullElement = window.document.createElement('div');
|
3770 | /**
|
3771 | * @return {Boolean}
|
3772 | */
|
3773 |
|
3774 | internal.isEnabledAutoStatusBarFill = function () {
|
3775 | return !!internal.config.autoStatusBarFill;
|
3776 | };
|
3777 | /**
|
3778 | * @param {String} html
|
3779 | * @return {String}
|
3780 | */
|
3781 |
|
3782 |
|
3783 | internal.normalizePageHTML = function (html) {
|
3784 | return ('' + html).trim();
|
3785 | };
|
3786 |
|
3787 | internal.waitDOMContentLoaded = function (callback) {
|
3788 | if (window.document.readyState === 'loading' || window.document.readyState == 'uninitialized') {
|
3789 | var wrappedCallback = function wrappedCallback() {
|
3790 | callback();
|
3791 | window.document.removeEventListener('DOMContentLoaded', wrappedCallback);
|
3792 | };
|
3793 |
|
3794 | window.document.addEventListener('DOMContentLoaded', wrappedCallback);
|
3795 | } else {
|
3796 | setImmediate(callback);
|
3797 | }
|
3798 | };
|
3799 |
|
3800 | internal.autoStatusBarFill = function (action) {
|
3801 | var onReady = function onReady() {
|
3802 | if (internal.shouldFillStatusBar()) {
|
3803 | action();
|
3804 | }
|
3805 |
|
3806 | document.removeEventListener('deviceready', onReady);
|
3807 | };
|
3808 |
|
3809 | if ((typeof device === "undefined" ? "undefined" : _typeof(device)) === 'object') {
|
3810 | document.addEventListener('deviceready', onReady);
|
3811 | } else if (['complete', 'interactive'].indexOf(document.readyState) === -1) {
|
3812 | internal.waitDOMContentLoaded(onReady);
|
3813 | } else {
|
3814 | onReady();
|
3815 | }
|
3816 | };
|
3817 |
|
3818 | internal.shouldFillStatusBar = function () {
|
3819 | return internal.isEnabledAutoStatusBarFill() && (platform.isWebView() && (platform.isIOS7above() || platform.isIPadOS()) && !platform.isIPhoneX() || document.body.querySelector('.ons-status-bar-mock.ios'));
|
3820 | };
|
3821 |
|
3822 | internal.templateStore = {
|
3823 | _storage: {},
|
3824 |
|
3825 | /**
|
3826 | * @param {String} key
|
3827 | * @return {String/null} template
|
3828 | */
|
3829 | get: function get(key) {
|
3830 | return internal.templateStore._storage[key] || null;
|
3831 | },
|
3832 |
|
3833 | /**
|
3834 | * @param {String} key
|
3835 | * @param {String} template
|
3836 | */
|
3837 | set: function set(key, template) {
|
3838 | internal.templateStore._storage[key] = template;
|
3839 | }
|
3840 | };
|
3841 | /**
|
3842 | * @param {String} page
|
3843 | * @return {Promise}
|
3844 | */
|
3845 |
|
3846 | internal.getTemplateHTMLAsync = function (page) {
|
3847 | return new Promise(function (resolve, reject) {
|
3848 | internal.waitDOMContentLoaded(function () {
|
3849 | var cache = internal.templateStore.get(page);
|
3850 |
|
3851 | if (cache) {
|
3852 | if (cache instanceof DocumentFragment) {
|
3853 | return resolve(cache);
|
3854 | }
|
3855 |
|
3856 | var html = typeof cache === 'string' ? cache : cache[1];
|
3857 | return resolve(internal.normalizePageHTML(html));
|
3858 | }
|
3859 |
|
3860 | var local = window.document.getElementById(page);
|
3861 |
|
3862 | if (local) {
|
3863 | var _html = local.textContent || local.content;
|
3864 |
|
3865 | return resolve(_html);
|
3866 | }
|
3867 |
|
3868 | var xhr = new XMLHttpRequest();
|
3869 | xhr.open('GET', page, true);
|
3870 |
|
3871 | xhr.onload = function () {
|
3872 | var html = xhr.responseText;
|
3873 |
|
3874 | if (xhr.status >= 400 && xhr.status < 600) {
|
3875 | reject(html);
|
3876 | } else {
|
3877 | // Refresh script tags
|
3878 | var fragment = util$4.createFragment(html);
|
3879 | util$4.arrayFrom(fragment.querySelectorAll('script')).forEach(function (el) {
|
3880 | var script = document.createElement('script');
|
3881 | script.type = el.type || 'text/javascript';
|
3882 | script.appendChild(document.createTextNode(el.text || el.textContent || el.innerHTML));
|
3883 | el.parentNode.replaceChild(script, el);
|
3884 | });
|
3885 | internal.templateStore.set(page, fragment);
|
3886 | resolve(fragment);
|
3887 | }
|
3888 | };
|
3889 |
|
3890 | xhr.onerror = function () {
|
3891 | util$4.throw("Page template not found: ".concat(page));
|
3892 | };
|
3893 |
|
3894 | xhr.send(null);
|
3895 | });
|
3896 | });
|
3897 | };
|
3898 | /**
|
3899 | * @param {String} page
|
3900 | * @return {Promise}
|
3901 | */
|
3902 |
|
3903 |
|
3904 | internal.getPageHTMLAsync = function (page) {
|
3905 | var pages = pageAttributeExpression.evaluate(page);
|
3906 |
|
3907 | var getPage = function getPage(page) {
|
3908 | if (typeof page !== 'string') {
|
3909 | return Promise.reject('Must specify a page.');
|
3910 | }
|
3911 |
|
3912 | return internal.getTemplateHTMLAsync(page).catch(function (error) {
|
3913 | if (pages.length === 0) {
|
3914 | return Promise.reject(error);
|
3915 | }
|
3916 |
|
3917 | return getPage(pages.shift());
|
3918 | });
|
3919 | };
|
3920 |
|
3921 | return getPage(pages.shift());
|
3922 | };
|
3923 |
|
3924 | var internal$1 = internal;
|
3925 |
|
3926 | var AnimatorFactory = /*#__PURE__*/function () {
|
3927 | /**
|
3928 | * @param {Object} opts
|
3929 | * @param {Object} opts.animators The dictionary for animator classes
|
3930 | * @param {Function} opts.baseClass The base class of animators
|
3931 | * @param {String} [opts.baseClassName] The name of the base class of animators
|
3932 | * @param {String} [opts.defaultAnimation] The default animation name
|
3933 | * @param {Object} [opts.defaultAnimationOptions] The default animation options
|
3934 | */
|
3935 | function AnimatorFactory(opts) {
|
3936 | _classCallCheck(this, AnimatorFactory);
|
3937 |
|
3938 | this._animators = opts.animators;
|
3939 | this._baseClass = opts.baseClass;
|
3940 | this._baseClassName = opts.baseClassName || opts.baseClass.name;
|
3941 | this._animation = opts.defaultAnimation || 'default';
|
3942 | this._animationOptions = opts.defaultAnimationOptions || {};
|
3943 |
|
3944 | if (!this._animators[this._animation]) {
|
3945 | util$4.throw('No such animation: ' + this._animation);
|
3946 | }
|
3947 | }
|
3948 | /**
|
3949 | * @param {String} jsonString
|
3950 | * @return {Object/null}
|
3951 | */
|
3952 |
|
3953 |
|
3954 | _createClass(AnimatorFactory, [{
|
3955 | key: "setAnimationOptions",
|
3956 | value:
|
3957 | /**
|
3958 | * @param {Object} options
|
3959 | */
|
3960 | function setAnimationOptions(options) {
|
3961 | this._animationOptions = options;
|
3962 | }
|
3963 | /**
|
3964 | * @param {Object} options
|
3965 | * @param {String} [options.animation] The animation name
|
3966 | * @param {Object} [options.animationOptions] The animation options
|
3967 | * @param {Object} defaultAnimator The default animator instance
|
3968 | * @return {Object} An animator instance
|
3969 | */
|
3970 |
|
3971 | }, {
|
3972 | key: "newAnimator",
|
3973 | value: function newAnimator() {
|
3974 | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
3975 | var defaultAnimator = arguments.length > 1 ? arguments[1] : undefined;
|
3976 | var animator = null;
|
3977 |
|
3978 | if (options.animation instanceof this._baseClass) {
|
3979 | return options.animation;
|
3980 | }
|
3981 |
|
3982 | var Animator = null;
|
3983 |
|
3984 | if (typeof options.animation === 'string') {
|
3985 | Animator = this._animators[options.animation];
|
3986 | }
|
3987 |
|
3988 | if (!Animator && defaultAnimator) {
|
3989 | animator = defaultAnimator;
|
3990 | } else {
|
3991 | Animator = Animator || this._animators[this._animation];
|
3992 | var animationOpts = util$4.extend({}, this._animationOptions, options.animationOptions || {}, internal$1.config.animationsDisabled ? {
|
3993 | duration: 0,
|
3994 | delay: 0
|
3995 | } : {});
|
3996 | animator = new Animator(animationOpts);
|
3997 |
|
3998 | if (typeof animator === 'function') {
|
3999 | animator = new animator(animationOpts); // eslint-disable-line new-cap
|
4000 | }
|
4001 | }
|
4002 |
|
4003 | if (!(animator instanceof this._baseClass)) {
|
4004 | util$4.throw("\"animator\" is not an instance of ".concat(this._baseClassName));
|
4005 | }
|
4006 |
|
4007 | return animator;
|
4008 | }
|
4009 | }], [{
|
4010 | key: "parseAnimationOptionsString",
|
4011 | value: function parseAnimationOptionsString(jsonString) {
|
4012 | try {
|
4013 | if (typeof jsonString === 'string') {
|
4014 | var result = util$4.animationOptionsParse(jsonString);
|
4015 |
|
4016 | if (_typeof(result) === 'object' && result !== null) {
|
4017 | return result;
|
4018 | } else {
|
4019 | console.error('"animation-options" attribute must be a JSON object string: ' + jsonString);
|
4020 | }
|
4021 | }
|
4022 |
|
4023 | return {};
|
4024 | } catch (e) {
|
4025 | console.error('"animation-options" attribute must be a JSON object string: ' + jsonString);
|
4026 | return {};
|
4027 | }
|
4028 | }
|
4029 | }]);
|
4030 |
|
4031 | return AnimatorFactory;
|
4032 | }();
|
4033 |
|
4034 | var util$2 = {
|
4035 | _ready: false,
|
4036 | _domContentLoaded: false,
|
4037 | _onDOMContentLoaded: function _onDOMContentLoaded() {
|
4038 | util$2._domContentLoaded = true;
|
4039 |
|
4040 | if (platform.isWebView()) {
|
4041 | window.document.addEventListener('deviceready', function () {
|
4042 | util$2._ready = true;
|
4043 | }, false);
|
4044 | } else {
|
4045 | util$2._ready = true;
|
4046 | }
|
4047 | },
|
4048 | addBackButtonListener: function addBackButtonListener(fn) {
|
4049 | if (!this._domContentLoaded) {
|
4050 | throw new Error('This method is available after DOMContentLoaded');
|
4051 | }
|
4052 |
|
4053 | if (this._ready) {
|
4054 | window.document.addEventListener('backbutton', fn, false);
|
4055 | } else {
|
4056 | window.document.addEventListener('deviceready', function () {
|
4057 | window.document.addEventListener('backbutton', fn, false);
|
4058 | });
|
4059 | }
|
4060 | },
|
4061 | removeBackButtonListener: function removeBackButtonListener(fn) {
|
4062 | if (!this._domContentLoaded) {
|
4063 | throw new Error('This method is available after DOMContentLoaded');
|
4064 | }
|
4065 |
|
4066 | if (this._ready) {
|
4067 | window.document.removeEventListener('backbutton', fn, false);
|
4068 | } else {
|
4069 | window.document.addEventListener('deviceready', function () {
|
4070 | window.document.removeEventListener('backbutton', fn, false);
|
4071 | });
|
4072 | }
|
4073 | }
|
4074 | };
|
4075 | window.addEventListener('DOMContentLoaded', function () {
|
4076 | return util$2._onDOMContentLoaded();
|
4077 | }, false);
|
4078 | var HandlerRepository = {
|
4079 | _store: {},
|
4080 | _genId: function () {
|
4081 | var i = 0;
|
4082 | return function () {
|
4083 | return i++;
|
4084 | };
|
4085 | }(),
|
4086 | set: function set(element, handler) {
|
4087 | if (element.dataset.deviceBackButtonHandlerId) {
|
4088 | this.remove(element);
|
4089 | }
|
4090 |
|
4091 | var id = element.dataset.deviceBackButtonHandlerId = HandlerRepository._genId();
|
4092 |
|
4093 | this._store[id] = handler;
|
4094 | },
|
4095 | remove: function remove(element) {
|
4096 | if (element.dataset.deviceBackButtonHandlerId) {
|
4097 | delete this._store[element.dataset.deviceBackButtonHandlerId];
|
4098 | delete element.dataset.deviceBackButtonHandlerId;
|
4099 | }
|
4100 | },
|
4101 | get: function get(element) {
|
4102 | if (!element.dataset.deviceBackButtonHandlerId) {
|
4103 | return undefined;
|
4104 | }
|
4105 |
|
4106 | var id = element.dataset.deviceBackButtonHandlerId;
|
4107 |
|
4108 | if (!this._store[id]) {
|
4109 | throw new Error();
|
4110 | }
|
4111 |
|
4112 | return this._store[id];
|
4113 | },
|
4114 | has: function has(element) {
|
4115 | if (!element.dataset) {
|
4116 | return false;
|
4117 | }
|
4118 |
|
4119 | var id = element.dataset.deviceBackButtonHandlerId;
|
4120 | return !!this._store[id];
|
4121 | }
|
4122 | };
|
4123 |
|
4124 | var DeviceBackButtonDispatcher = /*#__PURE__*/function () {
|
4125 | function DeviceBackButtonDispatcher() {
|
4126 | _classCallCheck(this, DeviceBackButtonDispatcher);
|
4127 |
|
4128 | this._isEnabled = false;
|
4129 | this._boundCallback = this._callback.bind(this);
|
4130 | }
|
4131 | /**
|
4132 | * Enable to handle 'backbutton' events.
|
4133 | */
|
4134 |
|
4135 |
|
4136 | _createClass(DeviceBackButtonDispatcher, [{
|
4137 | key: "enable",
|
4138 | value: function enable() {
|
4139 | if (!this._isEnabled) {
|
4140 | util$2.addBackButtonListener(this._boundCallback);
|
4141 | this._isEnabled = true;
|
4142 | }
|
4143 | }
|
4144 | /**
|
4145 | * Disable to handle 'backbutton' events.
|
4146 | */
|
4147 |
|
4148 | }, {
|
4149 | key: "disable",
|
4150 | value: function disable() {
|
4151 | if (this._isEnabled) {
|
4152 | util$2.removeBackButtonListener(this._boundCallback);
|
4153 | this._isEnabled = false;
|
4154 | }
|
4155 | }
|
4156 | /**
|
4157 | * Fire a 'backbutton' event manually.
|
4158 | */
|
4159 |
|
4160 | }, {
|
4161 | key: "fireDeviceBackButtonEvent",
|
4162 | value: function fireDeviceBackButtonEvent() {
|
4163 | var event = document.createEvent('Event');
|
4164 | event.initEvent('backbutton', true, true);
|
4165 | document.dispatchEvent(event);
|
4166 | }
|
4167 | }, {
|
4168 | key: "_callback",
|
4169 | value: function _callback() {
|
4170 | this._dispatchDeviceBackButtonEvent();
|
4171 | }
|
4172 | /**
|
4173 | * @param {HTMLElement} element
|
4174 | * @param {Function} callback
|
4175 | */
|
4176 |
|
4177 | }, {
|
4178 | key: "createHandler",
|
4179 | value: function createHandler(element, callback) {
|
4180 | if (!(element instanceof HTMLElement)) {
|
4181 | throw new Error('element must be an instance of HTMLElement');
|
4182 | }
|
4183 |
|
4184 | if (!(callback instanceof Function)) {
|
4185 | throw new Error('callback must be an instance of Function');
|
4186 | }
|
4187 |
|
4188 | var handler = {
|
4189 | _callback: callback,
|
4190 | _element: element,
|
4191 | disable: function disable() {
|
4192 | HandlerRepository.remove(element);
|
4193 | },
|
4194 | setListener: function setListener(callback) {
|
4195 | this._callback = callback;
|
4196 | },
|
4197 | enable: function enable() {
|
4198 | HandlerRepository.set(element, this);
|
4199 | },
|
4200 | isEnabled: function isEnabled() {
|
4201 | return HandlerRepository.get(element) === this;
|
4202 | },
|
4203 | destroy: function destroy() {
|
4204 | HandlerRepository.remove(element);
|
4205 | this._callback = this._element = null;
|
4206 | }
|
4207 | };
|
4208 | handler.enable();
|
4209 | return handler;
|
4210 | }
|
4211 | }, {
|
4212 | key: "_dispatchDeviceBackButtonEvent",
|
4213 | value: function _dispatchDeviceBackButtonEvent() {
|
4214 | var tree = this._captureTree();
|
4215 |
|
4216 | var element = this._findHandlerLeafElement(tree);
|
4217 |
|
4218 | var handler = HandlerRepository.get(element);
|
4219 |
|
4220 | handler._callback(createEvent(element));
|
4221 |
|
4222 | function createEvent(element) {
|
4223 | return {
|
4224 | _element: element,
|
4225 | callParentHandler: function callParentHandler() {
|
4226 | var parent = this._element.parentNode;
|
4227 |
|
4228 | while (parent) {
|
4229 | handler = HandlerRepository.get(parent);
|
4230 |
|
4231 | if (handler) {
|
4232 | return handler._callback(createEvent(parent));
|
4233 | }
|
4234 |
|
4235 | parent = parent.parentNode;
|
4236 | }
|
4237 | }
|
4238 | };
|
4239 | }
|
4240 | }
|
4241 | /**
|
4242 | * @return {Object}
|
4243 | */
|
4244 |
|
4245 | }, {
|
4246 | key: "_captureTree",
|
4247 | value: function _captureTree() {
|
4248 | return createTree(document.body);
|
4249 |
|
4250 | function createTree(element) {
|
4251 | var tree = {
|
4252 | element: element,
|
4253 | children: Array.prototype.concat.apply([], arrayOf(element.children).map(function (childElement) {
|
4254 | if (childElement.style.display === 'none' || childElement._isShown === false) {
|
4255 | return [];
|
4256 | }
|
4257 |
|
4258 | if (childElement.children.length === 0 && !HandlerRepository.has(childElement)) {
|
4259 | return [];
|
4260 | }
|
4261 |
|
4262 | var result = createTree(childElement);
|
4263 |
|
4264 | if (result.children.length === 0 && !HandlerRepository.has(result.element)) {
|
4265 | return [];
|
4266 | }
|
4267 |
|
4268 | return [result];
|
4269 | }))
|
4270 | };
|
4271 |
|
4272 | if (!HandlerRepository.has(tree.element)) {
|
4273 | for (var i = 0; i < tree.children.length; i++) {
|
4274 | var subTree = tree.children[i];
|
4275 |
|
4276 | if (HandlerRepository.has(subTree.element)) {
|
4277 | return subTree;
|
4278 | }
|
4279 | }
|
4280 | }
|
4281 |
|
4282 | return tree;
|
4283 | }
|
4284 |
|
4285 | function arrayOf(target) {
|
4286 | var result = [];
|
4287 |
|
4288 | for (var i = 0; i < target.length; i++) {
|
4289 | result.push(target[i]);
|
4290 | }
|
4291 |
|
4292 | return result;
|
4293 | }
|
4294 | }
|
4295 | /**
|
4296 | * @param {Object} tree
|
4297 | * @return {HTMLElement}
|
4298 | */
|
4299 |
|
4300 | }, {
|
4301 | key: "_findHandlerLeafElement",
|
4302 | value: function _findHandlerLeafElement(tree) {
|
4303 | return find(tree);
|
4304 |
|
4305 | function find(node) {
|
4306 | if (node.children.length === 0) {
|
4307 | return node.element;
|
4308 | }
|
4309 |
|
4310 | if (node.children.length === 1) {
|
4311 | return find(node.children[0]);
|
4312 | }
|
4313 |
|
4314 | return node.children.map(function (childNode) {
|
4315 | return childNode.element;
|
4316 | }).reduce(function (left, right) {
|
4317 | if (!left) {
|
4318 | return right;
|
4319 | }
|
4320 |
|
4321 | var leftZ = parseInt(window.getComputedStyle(left, '').zIndex, 10);
|
4322 | var rightZ = parseInt(window.getComputedStyle(right, '').zIndex, 10);
|
4323 |
|
4324 | if (!isNaN(leftZ) && !isNaN(rightZ)) {
|
4325 | return leftZ > rightZ ? left : right;
|
4326 | }
|
4327 |
|
4328 | throw new Error('Capturing backbutton-handler is failure.');
|
4329 | }, null);
|
4330 | }
|
4331 | }
|
4332 | }]);
|
4333 |
|
4334 | return DeviceBackButtonDispatcher;
|
4335 | }();
|
4336 |
|
4337 | var deviceBackButtonDispatcher = new DeviceBackButtonDispatcher();
|
4338 |
|
4339 | /*
|
4340 | Copyright 2013-2015 ASIAL CORPORATION
|
4341 |
|
4342 | Licensed under the Apache License, Version 2.0 (the "License");
|
4343 | you may not use this file except in compliance with the License.
|
4344 | You may obtain a copy of the License at
|
4345 |
|
4346 | http://www.apache.org/licenses/LICENSE-2.0
|
4347 |
|
4348 | Unless required by applicable law or agreed to in writing, software
|
4349 | distributed under the License is distributed on an "AS IS" BASIS,
|
4350 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
4351 | See the License for the specific language governing permissions and
|
4352 | limitations under the License.
|
4353 |
|
4354 | */
|
4355 | internal$1.AnimatorFactory = AnimatorFactory;
|
4356 | internal$1.ModifierUtil = ModifierUtil;
|
4357 | internal$1.dbbDispatcher = deviceBackButtonDispatcher;
|
4358 |
|
4359 | function setup$1(ons) {
|
4360 | internal$1.waitDOMContentLoaded(function () {
|
4361 | register('script[type="text/template"]');
|
4362 | register('script[type="text/ng-template"]');
|
4363 | register('template');
|
4364 |
|
4365 | function register(query) {
|
4366 | var templates = window.document.querySelectorAll(query);
|
4367 |
|
4368 | for (var i = 0; i < templates.length; i++) {
|
4369 | internal$1.templateStore.set(templates[i].getAttribute('id'), templates[i].textContent || templates[i].content);
|
4370 | }
|
4371 | }
|
4372 | });
|
4373 |
|
4374 | if (window._onsLoaded) {
|
4375 | ons._util.warn('Onsen UI is loaded more than once.');
|
4376 | }
|
4377 |
|
4378 | window._onsLoaded = true;
|
4379 | ons.ready(function () {
|
4380 | ons.enableDeviceBackButtonHandler();
|
4381 | ons._defaultDeviceBackButtonHandler = ons._internal.dbbDispatcher.createHandler(window.document.body, function () {
|
4382 | if (Object.hasOwnProperty.call(navigator, 'app')) {
|
4383 | navigator.app.exitApp();
|
4384 | } else {
|
4385 | console.warn('Could not close the app. Is \'cordova.js\' included?\nError: \'window.navigator.app\' is undefined.');
|
4386 | }
|
4387 | });
|
4388 | document.body._gestureDetector = new ons.GestureDetector(document.body, {
|
4389 | passive: true
|
4390 | }); // Simulate Device Back Button on ESC press
|
4391 |
|
4392 | if (!ons.platform.isWebView()) {
|
4393 | document.body.addEventListener('keydown', function (event) {
|
4394 | if (event.keyCode === 27) {
|
4395 | ons.fireDeviceBackButtonEvent();
|
4396 | }
|
4397 | });
|
4398 | } // setup loading placeholder
|
4399 |
|
4400 |
|
4401 | ons._setupLoadingPlaceHolders();
|
4402 | }); // viewport.js
|
4403 |
|
4404 | Viewport.setup();
|
4405 | }
|
4406 |
|
4407 | /*
|
4408 | Copyright 2013-2015 ASIAL CORPORATION
|
4409 |
|
4410 | Licensed under the Apache License, Version 2.0 (the "License");
|
4411 | you may not use this file except in compliance with the License.
|
4412 | You may obtain a copy of the License at
|
4413 |
|
4414 | http://www.apache.org/licenses/LICENSE-2.0
|
4415 |
|
4416 | Unless required by applicable law or agreed to in writing, software
|
4417 | distributed under the License is distributed on an "AS IS" BASIS,
|
4418 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
4419 | See the License for the specific language governing permissions and
|
4420 | limitations under the License.
|
4421 |
|
4422 | */
|
4423 |
|
4424 | var TIMEOUT_RATIO = 1.4;
|
4425 | var util$1 = {}; // capitalize string
|
4426 |
|
4427 | util$1.capitalize = function (str) {
|
4428 | return str.charAt(0).toUpperCase() + str.slice(1);
|
4429 | };
|
4430 | /**
|
4431 | * @param {Object} params
|
4432 | * @param {String} params.property
|
4433 | * @param {Float} params.duration
|
4434 | * @param {String} params.timing
|
4435 | */
|
4436 |
|
4437 |
|
4438 | util$1.buildTransitionValue = function (params) {
|
4439 | params.property = params.property || 'all';
|
4440 | params.duration = params.duration || 0.4;
|
4441 | params.timing = params.timing || 'linear';
|
4442 | var props = params.property.split(/ +/);
|
4443 | return props.map(function (prop) {
|
4444 | return prop + ' ' + params.duration + 's ' + params.timing;
|
4445 | }).join(', ');
|
4446 | };
|
4447 | /**
|
4448 | * Add an event handler on "transitionend" event.
|
4449 | */
|
4450 |
|
4451 |
|
4452 | util$1.onceOnTransitionEnd = function (element, callback) {
|
4453 | if (!element) {
|
4454 | return function () {};
|
4455 | }
|
4456 |
|
4457 | var removeListeners = function removeListeners() {
|
4458 | util$1._transitionEndEvents.forEach(function (eventName) {
|
4459 | element.removeEventListener(eventName, fn, false);
|
4460 | });
|
4461 | };
|
4462 |
|
4463 | var fn = function fn(event) {
|
4464 | if (element == event.target) {
|
4465 | event.stopPropagation();
|
4466 | removeListeners();
|
4467 | callback();
|
4468 | }
|
4469 | };
|
4470 |
|
4471 | util$1._transitionEndEvents.forEach(function (eventName) {
|
4472 | element.addEventListener(eventName, fn, false);
|
4473 | });
|
4474 |
|
4475 | return removeListeners;
|
4476 | };
|
4477 |
|
4478 | util$1._transitionEndEvents = function () {
|
4479 | if ('ontransitionend' in window) {
|
4480 | return ['transitionend'];
|
4481 | }
|
4482 |
|
4483 | if ('onwebkittransitionend' in window) {
|
4484 | return ['webkitTransitionEnd'];
|
4485 | }
|
4486 |
|
4487 | if (util$1.vendorPrefix === 'webkit' || util$1.vendorPrefix === 'o' || util$1.vendorPrefix === 'moz' || util$1.vendorPrefix === 'ms') {
|
4488 | return [util$1.vendorPrefix + 'TransitionEnd', 'transitionend'];
|
4489 | }
|
4490 |
|
4491 | return [];
|
4492 | }();
|
4493 |
|
4494 | util$1._cssPropertyDict = function () {
|
4495 | var styles = window.getComputedStyle(document.documentElement, '');
|
4496 | var dict = {};
|
4497 | var a = 'A'.charCodeAt(0);
|
4498 | var z = 'z'.charCodeAt(0);
|
4499 |
|
4500 | var upper = function upper(s) {
|
4501 | return s.substr(1).toUpperCase();
|
4502 | };
|
4503 |
|
4504 | for (var i = 0; i < styles.length; i++) {
|
4505 | var key = styles[i].replace(/^[-]+/, '').replace(/[-][a-z]/g, upper).replace(/^moz/, 'Moz');
|
4506 |
|
4507 | if (a <= key.charCodeAt(0) && z >= key.charCodeAt(0)) {
|
4508 | if (key !== 'cssText' && key !== 'parentText') {
|
4509 | dict[key] = true;
|
4510 | }
|
4511 | }
|
4512 | }
|
4513 |
|
4514 | return dict;
|
4515 | }();
|
4516 |
|
4517 | util$1.hasCssProperty = function (name) {
|
4518 | return name in util$1._cssPropertyDict;
|
4519 | };
|
4520 | /**
|
4521 | * Vendor prefix for css property.
|
4522 | */
|
4523 |
|
4524 |
|
4525 | util$1.vendorPrefix = function () {
|
4526 | var styles = window.getComputedStyle(document.documentElement, ''),
|
4527 | pre = (Array.prototype.slice.call(styles).join('').match(/-(moz|webkit|ms)-/) || styles.OLink === '' && ['', 'o'])[1];
|
4528 | return pre;
|
4529 | }();
|
4530 |
|
4531 | util$1.forceLayoutAtOnce = function (elements, callback) {
|
4532 | this.batchImmediate(function () {
|
4533 | elements.forEach(function (element) {
|
4534 | // force layout
|
4535 | element.offsetHeight;
|
4536 | });
|
4537 | callback();
|
4538 | });
|
4539 | };
|
4540 |
|
4541 | util$1.batchImmediate = function () {
|
4542 | var callbacks = [];
|
4543 | return function (callback) {
|
4544 | if (callbacks.length === 0) {
|
4545 | setImmediate(function () {
|
4546 | var concreateCallbacks = callbacks.slice(0);
|
4547 | callbacks = [];
|
4548 | concreateCallbacks.forEach(function (callback) {
|
4549 | callback();
|
4550 | });
|
4551 | });
|
4552 | }
|
4553 |
|
4554 | callbacks.push(callback);
|
4555 | };
|
4556 | }();
|
4557 |
|
4558 | util$1.batchAnimationFrame = function () {
|
4559 | var callbacks = [];
|
4560 |
|
4561 | var raf = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {
|
4562 | setTimeout(callback, 1000 / 60);
|
4563 | };
|
4564 |
|
4565 | return function (callback) {
|
4566 | if (callbacks.length === 0) {
|
4567 | raf(function () {
|
4568 | var concreateCallbacks = callbacks.slice(0);
|
4569 | callbacks = [];
|
4570 | concreateCallbacks.forEach(function (callback) {
|
4571 | callback();
|
4572 | });
|
4573 | });
|
4574 | }
|
4575 |
|
4576 | callbacks.push(callback);
|
4577 | };
|
4578 | }();
|
4579 |
|
4580 | util$1.transitionPropertyName = function () {
|
4581 | if (util$1.hasCssProperty('transitionDuration')) {
|
4582 | return 'transition';
|
4583 | }
|
4584 |
|
4585 | if (util$1.hasCssProperty(util$1.vendorPrefix + 'TransitionDuration')) {
|
4586 | return util$1.vendorPrefix + 'Transition';
|
4587 | }
|
4588 |
|
4589 | throw new Error('Invalid state');
|
4590 | }();
|
4591 | /**
|
4592 | * @param {HTMLElement} element
|
4593 | */
|
4594 |
|
4595 |
|
4596 | var Animit = function Animit(element, defaults) {
|
4597 | if (!(this instanceof Animit)) {
|
4598 | return new Animit(element, defaults);
|
4599 | }
|
4600 |
|
4601 | if (element instanceof HTMLElement) {
|
4602 | this.elements = [element];
|
4603 | } else if (Object.prototype.toString.call(element) === '[object Array]') {
|
4604 | this.elements = element;
|
4605 | } else {
|
4606 | throw new Error('First argument must be an array or an instance of HTMLElement.');
|
4607 | }
|
4608 |
|
4609 | this.defaults = defaults;
|
4610 | this.transitionQueue = [];
|
4611 | this.lastStyleAttributeDict = [];
|
4612 | };
|
4613 |
|
4614 | Animit.prototype = {
|
4615 | /**
|
4616 | * @property {Array}
|
4617 | */
|
4618 | transitionQueue: undefined,
|
4619 |
|
4620 | /**
|
4621 | * @property {Array}
|
4622 | */
|
4623 | elements: undefined,
|
4624 |
|
4625 | /**
|
4626 | * @property {Object}
|
4627 | */
|
4628 | defaults: undefined,
|
4629 |
|
4630 | /**
|
4631 | * Start animation sequence with passed animations.
|
4632 | *
|
4633 | * @param {Function} callback
|
4634 | */
|
4635 | play: function play(callback) {
|
4636 | if (typeof callback === 'function') {
|
4637 | this.transitionQueue.push(function (done) {
|
4638 | callback();
|
4639 | done();
|
4640 | });
|
4641 | }
|
4642 |
|
4643 | this.startAnimation();
|
4644 | return this;
|
4645 | },
|
4646 |
|
4647 | /**
|
4648 | * Most of the animations follow this default process.
|
4649 | *
|
4650 | * @param {from} css or options object containing css
|
4651 | * @param {to} css or options object containing css
|
4652 | * @param {delay} delay to wait
|
4653 | */
|
4654 | default: function _default(from, to, delay) {
|
4655 | function step(params, duration, timing) {
|
4656 | if (params.duration !== undefined) {
|
4657 | duration = params.duration;
|
4658 | }
|
4659 |
|
4660 | if (params.timing !== undefined) {
|
4661 | timing = params.timing;
|
4662 | }
|
4663 |
|
4664 | return {
|
4665 | css: params.css || params,
|
4666 | duration: duration,
|
4667 | timing: timing
|
4668 | };
|
4669 | }
|
4670 |
|
4671 | return this.saveStyle().queue(step(from, 0, this.defaults.timing)).wait(delay === undefined ? this.defaults.delay : delay).queue(step(to, this.defaults.duration, this.defaults.timing)).restoreStyle();
|
4672 | },
|
4673 |
|
4674 | /**
|
4675 | * Queue transition animations or other function.
|
4676 | *
|
4677 | * e.g. animit(elt).queue({color: 'red'})
|
4678 | * e.g. animit(elt).queue({color: 'red'}, {duration: 0.4})
|
4679 | * e.g. animit(elt).queue({css: {color: 'red'}, duration: 0.2})
|
4680 | *
|
4681 | * @param {Object|Animit.Transition|Function} transition
|
4682 | * @param {Object} [options]
|
4683 | */
|
4684 | queue: function queue(transition, options) {
|
4685 | var queue = this.transitionQueue;
|
4686 |
|
4687 | if (transition && options) {
|
4688 | options.css = transition;
|
4689 | transition = new Animit.Transition(options);
|
4690 | }
|
4691 |
|
4692 | if (!(transition instanceof Function || transition instanceof Animit.Transition)) {
|
4693 | if (transition.css) {
|
4694 | transition = new Animit.Transition(transition);
|
4695 | } else {
|
4696 | transition = new Animit.Transition({
|
4697 | css: transition
|
4698 | });
|
4699 | }
|
4700 | }
|
4701 |
|
4702 | if (transition instanceof Function) {
|
4703 | queue.push(transition);
|
4704 | } else if (transition instanceof Animit.Transition) {
|
4705 | queue.push(transition.build());
|
4706 | } else {
|
4707 | throw new Error('Invalid arguments');
|
4708 | }
|
4709 |
|
4710 | return this;
|
4711 | },
|
4712 |
|
4713 | /**
|
4714 | * Queue transition animations.
|
4715 | *
|
4716 | * @param {Float} seconds
|
4717 | */
|
4718 | wait: function wait(seconds) {
|
4719 | if (seconds > 0) {
|
4720 | this.transitionQueue.push(function (done) {
|
4721 | setTimeout(done, 1000 * seconds);
|
4722 | });
|
4723 | }
|
4724 |
|
4725 | return this;
|
4726 | },
|
4727 | saveStyle: function saveStyle() {
|
4728 | this.transitionQueue.push(function (done) {
|
4729 | this.elements.forEach(function (element, index) {
|
4730 | var css = this.lastStyleAttributeDict[index] = {};
|
4731 |
|
4732 | for (var i = 0; i < element.style.length; i++) {
|
4733 | css[element.style[i]] = element.style[element.style[i]];
|
4734 | }
|
4735 | }.bind(this));
|
4736 | done();
|
4737 | }.bind(this));
|
4738 | return this;
|
4739 | },
|
4740 |
|
4741 | /**
|
4742 | * Restore element's style.
|
4743 | *
|
4744 | * @param {Object} [options]
|
4745 | * @param {Float} [options.duration]
|
4746 | * @param {String} [options.timing]
|
4747 | * @param {String} [options.transition]
|
4748 | */
|
4749 | restoreStyle: function restoreStyle(options) {
|
4750 | options = options || {};
|
4751 | var self = this;
|
4752 |
|
4753 | if (options.transition && !options.duration) {
|
4754 | throw new Error('"options.duration" is required when "options.transition" is enabled.');
|
4755 | }
|
4756 |
|
4757 | var transitionName = util$1.transitionPropertyName;
|
4758 |
|
4759 | if (options.transition || options.duration && options.duration > 0) {
|
4760 | var transitionValue = options.transition || 'all ' + options.duration + 's ' + (options.timing || 'linear');
|
4761 | this.transitionQueue.push(function (done) {
|
4762 | var elements = this.elements;
|
4763 | var timeoutId;
|
4764 |
|
4765 | var clearTransition = function clearTransition() {
|
4766 | elements.forEach(function (element) {
|
4767 | element.style[transitionName] = '';
|
4768 | });
|
4769 | }; // add "transitionend" event handler
|
4770 |
|
4771 |
|
4772 | var removeListeners = util$1.onceOnTransitionEnd(elements[0], function () {
|
4773 | clearTimeout(timeoutId);
|
4774 | clearTransition();
|
4775 | done();
|
4776 | }); // for fail safe.
|
4777 |
|
4778 | timeoutId = setTimeout(function () {
|
4779 | removeListeners();
|
4780 | clearTransition();
|
4781 | done();
|
4782 | }, options.duration * 1000 * TIMEOUT_RATIO); // transition and style settings
|
4783 |
|
4784 | elements.forEach(function (element, index) {
|
4785 | var css = self.lastStyleAttributeDict[index];
|
4786 |
|
4787 | if (!css) {
|
4788 | throw new Error('restoreStyle(): The style is not saved. Invoke saveStyle() before.');
|
4789 | }
|
4790 |
|
4791 | self.lastStyleAttributeDict[index] = undefined;
|
4792 | var name;
|
4793 |
|
4794 | for (var i = 0, len = element.style.length; i < len; i++) {
|
4795 | name = element.style[i];
|
4796 |
|
4797 | if (css[name] === undefined) {
|
4798 | css[name] = '';
|
4799 | }
|
4800 | }
|
4801 |
|
4802 | element.style[transitionName] = transitionValue;
|
4803 | Object.keys(css).forEach(function (key) {
|
4804 | if (key !== transitionName) {
|
4805 | element.style[key] = css[key];
|
4806 | }
|
4807 | });
|
4808 | element.style[transitionName] = transitionValue;
|
4809 | });
|
4810 | });
|
4811 | } else {
|
4812 | this.transitionQueue.push(function (done) {
|
4813 | reset();
|
4814 | done();
|
4815 | });
|
4816 | }
|
4817 |
|
4818 | return this;
|
4819 |
|
4820 | function reset() {
|
4821 | // Clear transition animation settings.
|
4822 | self.elements.forEach(function (element, index) {
|
4823 | element.style[transitionName] = 'none';
|
4824 | var css = self.lastStyleAttributeDict[index];
|
4825 |
|
4826 | if (!css) {
|
4827 | throw new Error('restoreStyle(): The style is not saved. Invoke saveStyle() before.');
|
4828 | }
|
4829 |
|
4830 | self.lastStyleAttributeDict[index] = undefined;
|
4831 |
|
4832 | for (var i = 0, name = ''; i < element.style.length; i++) {
|
4833 | name = element.style[i];
|
4834 |
|
4835 | if (typeof css[element.style[i]] === 'undefined') {
|
4836 | css[element.style[i]] = '';
|
4837 | }
|
4838 | }
|
4839 |
|
4840 | Object.keys(css).forEach(function (key) {
|
4841 | element.style[key] = css[key];
|
4842 | });
|
4843 | });
|
4844 | }
|
4845 | },
|
4846 |
|
4847 | /**
|
4848 | * Start animation sequence.
|
4849 | */
|
4850 | startAnimation: function startAnimation() {
|
4851 | this._dequeueTransition();
|
4852 |
|
4853 | return this;
|
4854 | },
|
4855 | _dequeueTransition: function _dequeueTransition() {
|
4856 | var transition = this.transitionQueue.shift();
|
4857 |
|
4858 | if (this._currentTransition) {
|
4859 | throw new Error('Current transition exists.');
|
4860 | }
|
4861 |
|
4862 | this._currentTransition = transition;
|
4863 | var self = this;
|
4864 | var called = false;
|
4865 |
|
4866 | var done = function done() {
|
4867 | if (!called) {
|
4868 | called = true;
|
4869 | self._currentTransition = undefined;
|
4870 |
|
4871 | self._dequeueTransition();
|
4872 | } else {
|
4873 | throw new Error('Invalid state: This callback is called twice.');
|
4874 | }
|
4875 | };
|
4876 |
|
4877 | if (transition) {
|
4878 | transition.call(this, done);
|
4879 | }
|
4880 | }
|
4881 | };
|
4882 | /**
|
4883 | * @param {Animit} arguments
|
4884 | */
|
4885 |
|
4886 | Animit.runAll = function
|
4887 | /* arguments... */
|
4888 | () {
|
4889 | for (var i = 0; i < arguments.length; i++) {
|
4890 | arguments[i].play();
|
4891 | }
|
4892 | };
|
4893 | /**
|
4894 | * @param {Object} options
|
4895 | * @param {Float} [options.duration]
|
4896 | * @param {String} [options.property]
|
4897 | * @param {String} [options.timing]
|
4898 | */
|
4899 |
|
4900 |
|
4901 | Animit.Transition = function (options) {
|
4902 | this.options = options || {};
|
4903 | this.options.duration = this.options.duration || 0;
|
4904 | this.options.timing = this.options.timing || 'linear';
|
4905 | this.options.css = this.options.css || {};
|
4906 | this.options.property = this.options.property || 'all';
|
4907 | };
|
4908 |
|
4909 | Animit.Transition.prototype = {
|
4910 | /**
|
4911 | * @param {HTMLElement} element
|
4912 | * @return {Function}
|
4913 | */
|
4914 | build: function build() {
|
4915 | if (Object.keys(this.options.css).length === 0) {
|
4916 | throw new Error('options.css is required.');
|
4917 | }
|
4918 |
|
4919 | var css = createActualCssProps(this.options.css);
|
4920 |
|
4921 | if (this.options.duration > 0) {
|
4922 | var transitionValue = util$1.buildTransitionValue(this.options);
|
4923 | var self = this;
|
4924 | return function (callback) {
|
4925 | var elements = this.elements;
|
4926 | var timeout = self.options.duration * 1000 * TIMEOUT_RATIO;
|
4927 | var timeoutId;
|
4928 | var removeListeners = util$1.onceOnTransitionEnd(elements[0], function () {
|
4929 | clearTimeout(timeoutId);
|
4930 | callback();
|
4931 | });
|
4932 | timeoutId = setTimeout(function () {
|
4933 | removeListeners();
|
4934 | callback();
|
4935 | }, timeout);
|
4936 | elements.forEach(function (element) {
|
4937 | element.style[util$1.transitionPropertyName] = transitionValue;
|
4938 | Object.keys(css).forEach(function (name) {
|
4939 | element.style[name] = css[name];
|
4940 | });
|
4941 | });
|
4942 | };
|
4943 | }
|
4944 |
|
4945 | if (this.options.duration <= 0) {
|
4946 | return function (callback) {
|
4947 | var elements = this.elements;
|
4948 | elements.forEach(function (element) {
|
4949 | element.style[util$1.transitionPropertyName] = '';
|
4950 | Object.keys(css).forEach(function (name) {
|
4951 | element.style[name] = css[name];
|
4952 | });
|
4953 | });
|
4954 |
|
4955 | if (elements.length > 0) {
|
4956 | util$1.forceLayoutAtOnce(elements, function () {
|
4957 | util$1.batchAnimationFrame(callback);
|
4958 | });
|
4959 | } else {
|
4960 | util$1.batchAnimationFrame(callback);
|
4961 | }
|
4962 | };
|
4963 | }
|
4964 |
|
4965 | function createActualCssProps(css) {
|
4966 | var result = {};
|
4967 | Object.keys(css).forEach(function (name) {
|
4968 | var value = css[name];
|
4969 |
|
4970 | if (util$1.hasCssProperty(name)) {
|
4971 | result[name] = value;
|
4972 | return;
|
4973 | }
|
4974 |
|
4975 | var prefixed = util$1.vendorPrefix + util$1.capitalize(name);
|
4976 |
|
4977 | if (util$1.hasCssProperty(prefixed)) {
|
4978 | result[prefixed] = value;
|
4979 | } else {
|
4980 | result[prefixed] = value;
|
4981 | result[name] = value;
|
4982 | }
|
4983 | });
|
4984 | return result;
|
4985 | }
|
4986 | }
|
4987 | };
|
4988 |
|
4989 | /*
|
4990 | * Gesture detector library that forked from github.com/EightMedia/hammer.js.
|
4991 | */
|
4992 | var Event$1, Utils, Detection, PointerEvent;
|
4993 | /**
|
4994 | * @object ons.GestureDetector
|
4995 | * @category gesture
|
4996 | * @description
|
4997 | * [en]Utility class for gesture detection.[/en]
|
4998 | * [ja]ジェスチャを検知するためのユーティリティクラスです。[/ja]
|
4999 | */
|
5000 |
|
5001 | /**
|
5002 | * @method constructor
|
5003 | * @signature constructor(element[, options])
|
5004 | * @description
|
5005 | * [en]Create a new GestureDetector instance.[/en]
|
5006 | * [ja]GestureDetectorのインスタンスを生成します。[/ja]
|
5007 | * @param {Element} element
|
5008 | * [en]Name of the event.[/en]
|
5009 | * [ja]ジェスチャを検知するDOM要素を指定します。[/ja]
|
5010 | * @param {Object} [options]
|
5011 | * [en]Options object.[/en]
|
5012 | * [ja]オプションを指定します。[/ja]
|
5013 | * @return {ons.GestureDetector.Instance}
|
5014 | */
|
5015 |
|
5016 | var GestureDetector = function GestureDetector(element, options) {
|
5017 | return new GestureDetector.Instance(element, options || {});
|
5018 | };
|
5019 | /**
|
5020 | * default settings.
|
5021 | * more settings are defined per gesture at `/gestures`. Each gesture can be disabled/enabled
|
5022 | * by setting it's name (like `swipe`) to false.
|
5023 | * You can set the defaults for all instances by changing this object before creating an instance.
|
5024 | * @example
|
5025 | * ````
|
5026 | * GestureDetector.defaults.drag = false;
|
5027 | * GestureDetector.defaults.behavior.touchAction = 'pan-y';
|
5028 | * delete GestureDetector.defaults.behavior.userSelect;
|
5029 | * ````
|
5030 | * @property defaults
|
5031 | * @type {Object}
|
5032 | */
|
5033 |
|
5034 |
|
5035 | GestureDetector.defaults = {
|
5036 | behavior: {
|
5037 | // userSelect: 'none', // Also disables selection in `input` children
|
5038 | touchAction: 'pan-y',
|
5039 | touchCallout: 'none',
|
5040 | contentZooming: 'none',
|
5041 | userDrag: 'none',
|
5042 | tapHighlightColor: 'rgba(0,0,0,0)'
|
5043 | }
|
5044 | };
|
5045 | /**
|
5046 | * GestureDetector document where the base events are added at
|
5047 | * @property DOCUMENT
|
5048 | * @type {HTMLElement}
|
5049 | * @default window.document
|
5050 | */
|
5051 |
|
5052 | GestureDetector.DOCUMENT = document;
|
5053 | /**
|
5054 | * detect support for pointer events
|
5055 | * @property HAS_POINTEREVENTS
|
5056 | * @type {Boolean}
|
5057 | */
|
5058 |
|
5059 | GestureDetector.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled;
|
5060 | /**
|
5061 | * detect support for touch events
|
5062 | * @property HAS_TOUCHEVENTS
|
5063 | * @type {Boolean}
|
5064 | */
|
5065 |
|
5066 | GestureDetector.HAS_TOUCHEVENTS = 'ontouchstart' in window;
|
5067 | /**
|
5068 | * detect mobile browsers
|
5069 | * @property IS_MOBILE
|
5070 | * @type {Boolean}
|
5071 | */
|
5072 |
|
5073 | GestureDetector.IS_MOBILE = /mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent);
|
5074 | /**
|
5075 | * detect if we want to support mouseevents at all
|
5076 | * @property NO_MOUSEEVENTS
|
5077 | * @type {Boolean}
|
5078 | */
|
5079 |
|
5080 | GestureDetector.NO_MOUSEEVENTS = GestureDetector.HAS_TOUCHEVENTS && GestureDetector.IS_MOBILE || GestureDetector.HAS_POINTEREVENTS;
|
5081 | /**
|
5082 | * interval in which GestureDetector recalculates current velocity/direction/angle in ms
|
5083 | * @property CALCULATE_INTERVAL
|
5084 | * @type {Number}
|
5085 | * @default 25
|
5086 | */
|
5087 |
|
5088 | GestureDetector.CALCULATE_INTERVAL = 25;
|
5089 | /**
|
5090 | * eventtypes per touchevent (start, move, end) are filled by `Event.determineEventTypes` on `setup`
|
5091 | * the object contains the DOM event names per type (`EVENT_START`, `EVENT_MOVE`, `EVENT_END`)
|
5092 | * @property EVENT_TYPES
|
5093 | * @private
|
5094 | * @writeOnce
|
5095 | * @type {Object}
|
5096 | */
|
5097 |
|
5098 | var EVENT_TYPES = {};
|
5099 | /**
|
5100 | * direction strings, for safe comparisons
|
5101 | * @property DIRECTION_DOWN|LEFT|UP|RIGHT
|
5102 | * @final
|
5103 | * @type {String}
|
5104 | * @default 'down' 'left' 'up' 'right'
|
5105 | */
|
5106 |
|
5107 | var DIRECTION_DOWN = GestureDetector.DIRECTION_DOWN = 'down';
|
5108 | var DIRECTION_LEFT = GestureDetector.DIRECTION_LEFT = 'left';
|
5109 | var DIRECTION_UP = GestureDetector.DIRECTION_UP = 'up';
|
5110 | var DIRECTION_RIGHT = GestureDetector.DIRECTION_RIGHT = 'right';
|
5111 | /**
|
5112 | * pointertype strings, for safe comparisons
|
5113 | * @property POINTER_MOUSE|TOUCH|PEN
|
5114 | * @final
|
5115 | * @type {String}
|
5116 | * @default 'mouse' 'touch' 'pen'
|
5117 | */
|
5118 |
|
5119 | var POINTER_MOUSE = GestureDetector.POINTER_MOUSE = 'mouse';
|
5120 | var POINTER_TOUCH = GestureDetector.POINTER_TOUCH = 'touch';
|
5121 | var POINTER_PEN = GestureDetector.POINTER_PEN = 'pen';
|
5122 | /**
|
5123 | * eventtypes
|
5124 | * @property EVENT_START|MOVE|END|RELEASE|TOUCH
|
5125 | * @final
|
5126 | * @type {String}
|
5127 | * @default 'start' 'change' 'move' 'end' 'release' 'touch'
|
5128 | */
|
5129 |
|
5130 | var EVENT_START = GestureDetector.EVENT_START = 'start';
|
5131 | var EVENT_MOVE = GestureDetector.EVENT_MOVE = 'move';
|
5132 | var EVENT_END = GestureDetector.EVENT_END = 'end';
|
5133 | var EVENT_RELEASE = GestureDetector.EVENT_RELEASE = 'release';
|
5134 | var EVENT_TOUCH = GestureDetector.EVENT_TOUCH = 'touch';
|
5135 | /**
|
5136 | * if the window events are set...
|
5137 | * @property READY
|
5138 | * @writeOnce
|
5139 | * @type {Boolean}
|
5140 | * @default false
|
5141 | */
|
5142 |
|
5143 | GestureDetector.READY = false;
|
5144 | /**
|
5145 | * plugins namespace
|
5146 | * @property plugins
|
5147 | * @type {Object}
|
5148 | */
|
5149 |
|
5150 | GestureDetector.plugins = GestureDetector.plugins || {};
|
5151 | /**
|
5152 | * gestures namespace
|
5153 | * see `/gestures` for the definitions
|
5154 | * @property gestures
|
5155 | * @type {Object}
|
5156 | */
|
5157 |
|
5158 | GestureDetector.gestures = GestureDetector.gestures || {};
|
5159 | /**
|
5160 | * setup events to detect gestures on the document
|
5161 | * this function is called when creating an new instance
|
5162 | * @private
|
5163 | */
|
5164 |
|
5165 | function setup(opts) {
|
5166 | if (GestureDetector.READY) {
|
5167 | return;
|
5168 | } // find what eventtypes we add listeners to
|
5169 |
|
5170 |
|
5171 | Event$1.determineEventTypes(); // Register all gestures inside GestureDetector.gestures
|
5172 |
|
5173 | Utils.each(GestureDetector.gestures, function (gesture) {
|
5174 | Detection.register(gesture);
|
5175 | }); // Add touch events on the document
|
5176 |
|
5177 | Event$1.onTouch(GestureDetector.DOCUMENT, EVENT_MOVE, Detection.detect, opts);
|
5178 | Event$1.onTouch(GestureDetector.DOCUMENT, EVENT_END, Detection.detect, opts); // GestureDetector is ready...!
|
5179 |
|
5180 | GestureDetector.READY = true;
|
5181 | }
|
5182 | /**
|
5183 | * @module GestureDetector
|
5184 | *
|
5185 | * @class Utils
|
5186 | * @static
|
5187 | */
|
5188 |
|
5189 |
|
5190 | Utils = GestureDetector.utils = {
|
5191 | /**
|
5192 | * extend method, could also be used for cloning when `dest` is an empty object.
|
5193 | * changes the dest object
|
5194 | * @param {Object} dest
|
5195 | * @param {Object} src
|
5196 | * @param {Boolean} [merge=false] do a merge
|
5197 | * @return {Object} dest
|
5198 | */
|
5199 | extend: function extend(dest, src, merge) {
|
5200 | for (var key in src) {
|
5201 | if (Object.prototype.hasOwnProperty.call(src, key) && (dest[key] === undefined || !merge)) {
|
5202 | dest[key] = src[key];
|
5203 | }
|
5204 | }
|
5205 |
|
5206 | return dest;
|
5207 | },
|
5208 |
|
5209 | /**
|
5210 | * simple addEventListener wrapper
|
5211 | * @param {HTMLElement} element
|
5212 | * @param {String} type
|
5213 | * @param {Function} handler
|
5214 | */
|
5215 | on: function on(element, type, handler, opt) {
|
5216 | util$4.addEventListener(element, type, handler, opt, true);
|
5217 | },
|
5218 |
|
5219 | /**
|
5220 | * simple removeEventListener wrapper
|
5221 | * @param {HTMLElement} element
|
5222 | * @param {String} type
|
5223 | * @param {Function} handler
|
5224 | */
|
5225 | off: function off(element, type, handler, opt) {
|
5226 | util$4.removeEventListener(element, type, handler, opt, true);
|
5227 | },
|
5228 |
|
5229 | /**
|
5230 | * forEach over arrays and objects
|
5231 | * @param {Object|Array} obj
|
5232 | * @param {Function} iterator
|
5233 | * @param {any} iterator.item
|
5234 | * @param {Number} iterator.index
|
5235 | * @param {Object|Array} iterator.obj the source object
|
5236 | * @param {Object} context value to use as `this` in the iterator
|
5237 | */
|
5238 | each: function each(obj, iterator, context) {
|
5239 | var i, len; // native forEach on arrays
|
5240 |
|
5241 | if ('forEach' in obj) {
|
5242 | obj.forEach(iterator, context); // arrays
|
5243 | } else if (obj.length !== undefined) {
|
5244 | for (i = 0, len = obj.length; i < len; i++) {
|
5245 | if (iterator.call(context, obj[i], i, obj) === false) {
|
5246 | return;
|
5247 | }
|
5248 | } // objects
|
5249 |
|
5250 | } else {
|
5251 | for (i in obj) {
|
5252 | if (Object.prototype.hasOwnProperty.call(obj, i) && iterator.call(context, obj[i], i, obj) === false) {
|
5253 | return;
|
5254 | }
|
5255 | }
|
5256 | }
|
5257 | },
|
5258 |
|
5259 | /**
|
5260 | * find if a string contains the string using indexOf
|
5261 | * @param {String} src
|
5262 | * @param {String} find
|
5263 | * @return {Boolean} found
|
5264 | */
|
5265 | inStr: function inStr(src, find) {
|
5266 | return src.indexOf(find) > -1;
|
5267 | },
|
5268 |
|
5269 | /**
|
5270 | * find if a array contains the object using indexOf or a simple polyfill
|
5271 | * @param {String} src
|
5272 | * @param {String} find
|
5273 | * @return {Boolean|Number} false when not found, or the index
|
5274 | */
|
5275 | inArray: function inArray(src, find, deep) {
|
5276 | if (deep) {
|
5277 | for (var i = 0, len = src.length; i < len; i++) {
|
5278 | // Array.findIndex
|
5279 | if (Object.keys(find).every(function (key) {
|
5280 | return src[i][key] === find[key];
|
5281 | })) {
|
5282 | return i;
|
5283 | }
|
5284 | }
|
5285 |
|
5286 | return -1;
|
5287 | }
|
5288 |
|
5289 | if (src.indexOf) {
|
5290 | return src.indexOf(find);
|
5291 | } else {
|
5292 | for (var i = 0, len = src.length; i < len; i++) {
|
5293 | if (src[i] === find) {
|
5294 | return i;
|
5295 | }
|
5296 | }
|
5297 |
|
5298 | return -1;
|
5299 | }
|
5300 | },
|
5301 |
|
5302 | /**
|
5303 | * convert an array-like object (`arguments`, `touchlist`) to an array
|
5304 | * @param {Object} obj
|
5305 | * @return {Array}
|
5306 | */
|
5307 | toArray: function toArray(obj) {
|
5308 | return Array.prototype.slice.call(obj, 0);
|
5309 | },
|
5310 |
|
5311 | /**
|
5312 | * find if a node is in the given parent
|
5313 | * @param {HTMLElement} node
|
5314 | * @param {HTMLElement} parent
|
5315 | * @return {Boolean} found
|
5316 | */
|
5317 | hasParent: function hasParent(node, parent) {
|
5318 | while (node) {
|
5319 | if (node == parent) {
|
5320 | return true;
|
5321 | }
|
5322 |
|
5323 | node = node.parentNode;
|
5324 | }
|
5325 |
|
5326 | return false;
|
5327 | },
|
5328 |
|
5329 | /**
|
5330 | * get the center of all the touches
|
5331 | * @param {Array} touches
|
5332 | * @return {Object} center contains `pageX`, `pageY`, `clientX` and `clientY` properties
|
5333 | */
|
5334 | getCenter: function getCenter(touches) {
|
5335 | var pageX = [],
|
5336 | pageY = [],
|
5337 | clientX = [],
|
5338 | clientY = [],
|
5339 | min = Math.min,
|
5340 | max = Math.max; // no need to loop when only one touch
|
5341 |
|
5342 | if (touches.length === 1) {
|
5343 | return {
|
5344 | pageX: touches[0].pageX,
|
5345 | pageY: touches[0].pageY,
|
5346 | clientX: touches[0].clientX,
|
5347 | clientY: touches[0].clientY
|
5348 | };
|
5349 | }
|
5350 |
|
5351 | Utils.each(touches, function (touch) {
|
5352 | pageX.push(touch.pageX);
|
5353 | pageY.push(touch.pageY);
|
5354 | clientX.push(touch.clientX);
|
5355 | clientY.push(touch.clientY);
|
5356 | });
|
5357 | return {
|
5358 | pageX: (min.apply(Math, pageX) + max.apply(Math, pageX)) / 2,
|
5359 | pageY: (min.apply(Math, pageY) + max.apply(Math, pageY)) / 2,
|
5360 | clientX: (min.apply(Math, clientX) + max.apply(Math, clientX)) / 2,
|
5361 | clientY: (min.apply(Math, clientY) + max.apply(Math, clientY)) / 2
|
5362 | };
|
5363 | },
|
5364 |
|
5365 | /**
|
5366 | * calculate the velocity between two points. unit is in px per ms.
|
5367 | * @param {Number} deltaTime
|
5368 | * @param {Number} deltaX
|
5369 | * @param {Number} deltaY
|
5370 | * @return {Object} velocity `x` and `y`
|
5371 | */
|
5372 | getVelocity: function getVelocity(deltaTime, deltaX, deltaY) {
|
5373 | return {
|
5374 | x: Math.abs(deltaX / deltaTime) || 0,
|
5375 | y: Math.abs(deltaY / deltaTime) || 0
|
5376 | };
|
5377 | },
|
5378 |
|
5379 | /**
|
5380 | * calculate the angle between two coordinates
|
5381 | * @param {Touch} touch1
|
5382 | * @param {Touch} touch2
|
5383 | * @return {Number} angle
|
5384 | */
|
5385 | getAngle: function getAngle(touch1, touch2) {
|
5386 | var x = touch2.clientX - touch1.clientX,
|
5387 | y = touch2.clientY - touch1.clientY;
|
5388 | return Math.atan2(y, x) * 180 / Math.PI;
|
5389 | },
|
5390 |
|
5391 | /**
|
5392 | * do a small comparison to get the direction between two touches.
|
5393 | * @param {Touch} touch1
|
5394 | * @param {Touch} touch2
|
5395 | * @return {String} direction matches `DIRECTION_LEFT|RIGHT|UP|DOWN`
|
5396 | */
|
5397 | getDirection: function getDirection(touch1, touch2) {
|
5398 | var x = Math.abs(touch1.clientX - touch2.clientX),
|
5399 | y = Math.abs(touch1.clientY - touch2.clientY);
|
5400 |
|
5401 | if (x >= y) {
|
5402 | return touch1.clientX - touch2.clientX > 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;
|
5403 | }
|
5404 |
|
5405 | return touch1.clientY - touch2.clientY > 0 ? DIRECTION_UP : DIRECTION_DOWN;
|
5406 | },
|
5407 |
|
5408 | /**
|
5409 | * calculate the distance between two touches
|
5410 | * @param {Touch}touch1
|
5411 | * @param {Touch} touch2
|
5412 | * @return {Number} distance
|
5413 | */
|
5414 | getDistance: function getDistance(touch1, touch2) {
|
5415 | var x = touch2.clientX - touch1.clientX,
|
5416 | y = touch2.clientY - touch1.clientY;
|
5417 | return Math.sqrt(x * x + y * y);
|
5418 | },
|
5419 |
|
5420 | /**
|
5421 | * calculate the scale factor between two touchLists
|
5422 | * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out
|
5423 | * @param {Array} start array of touches
|
5424 | * @param {Array} end array of touches
|
5425 | * @return {Number} scale
|
5426 | */
|
5427 | getScale: function getScale(start, end) {
|
5428 | // need two fingers...
|
5429 | if (start.length >= 2 && end.length >= 2) {
|
5430 | return this.getDistance(end[0], end[1]) / this.getDistance(start[0], start[1]);
|
5431 | }
|
5432 |
|
5433 | return 1;
|
5434 | },
|
5435 |
|
5436 | /**
|
5437 | * calculate the rotation degrees between two touchLists
|
5438 | * @param {Array} start array of touches
|
5439 | * @param {Array} end array of touches
|
5440 | * @return {Number} rotation
|
5441 | */
|
5442 | getRotation: function getRotation(start, end) {
|
5443 | // need two fingers
|
5444 | if (start.length >= 2 && end.length >= 2) {
|
5445 | return this.getAngle(end[1], end[0]) - this.getAngle(start[1], start[0]);
|
5446 | }
|
5447 |
|
5448 | return 0;
|
5449 | },
|
5450 |
|
5451 | /**
|
5452 | * find out if the direction is vertical *
|
5453 | * @param {String} direction matches `DIRECTION_UP|DOWN`
|
5454 | * @return {Boolean} is_vertical
|
5455 | */
|
5456 | isVertical: function isVertical(direction) {
|
5457 | return direction == DIRECTION_UP || direction == DIRECTION_DOWN;
|
5458 | },
|
5459 |
|
5460 | /**
|
5461 | * set css properties with their prefixes
|
5462 | * @param {HTMLElement} element
|
5463 | * @param {String} prop
|
5464 | * @param {String} value
|
5465 | * @param {Boolean} [toggle=true]
|
5466 | * @return {Boolean}
|
5467 | */
|
5468 | setPrefixedCss: function setPrefixedCss(element, prop, value, toggle) {
|
5469 | var prefixes = ['', 'Webkit', 'Moz', 'O', 'ms'];
|
5470 | prop = Utils.toCamelCase(prop);
|
5471 |
|
5472 | for (var i = 0; i < prefixes.length; i++) {
|
5473 | var p = prop; // prefixes
|
5474 |
|
5475 | if (prefixes[i]) {
|
5476 | p = prefixes[i] + p.slice(0, 1).toUpperCase() + p.slice(1);
|
5477 | } // test the style
|
5478 |
|
5479 |
|
5480 | if (p in element.style) {
|
5481 | element.style[p] = (toggle === null || toggle) && value || '';
|
5482 | break;
|
5483 | }
|
5484 | }
|
5485 | },
|
5486 |
|
5487 | /**
|
5488 | * toggle browser default behavior by setting css properties.
|
5489 | * `userSelect='none'` also sets `element.onselectstart` to false
|
5490 | * `userDrag='none'` also sets `element.ondragstart` to false
|
5491 | *
|
5492 | * @param {HtmlElement} element
|
5493 | * @param {Object} props
|
5494 | * @param {Boolean} [toggle=true]
|
5495 | */
|
5496 | toggleBehavior: function toggleBehavior(element, props, toggle) {
|
5497 | if (!props || !element || !element.style) {
|
5498 | return;
|
5499 | } // set the css properties
|
5500 |
|
5501 |
|
5502 | Utils.each(props, function (value, prop) {
|
5503 | Utils.setPrefixedCss(element, prop, value, toggle);
|
5504 | });
|
5505 |
|
5506 | var falseFn = toggle && function () {
|
5507 | return false;
|
5508 | }; // also the disable onselectstart
|
5509 |
|
5510 |
|
5511 | if (props.userSelect == 'none') {
|
5512 | element.onselectstart = falseFn;
|
5513 | } // and disable ondragstart
|
5514 |
|
5515 |
|
5516 | if (props.userDrag == 'none') {
|
5517 | element.ondragstart = falseFn;
|
5518 | }
|
5519 | },
|
5520 |
|
5521 | /**
|
5522 | * convert a string with underscores to camelCase
|
5523 | * so prevent_default becomes preventDefault
|
5524 | * @param {String} str
|
5525 | * @return {String} camelCaseStr
|
5526 | */
|
5527 | toCamelCase: function toCamelCase(str) {
|
5528 | return str.replace(/[_-]([a-z])/g, function (s) {
|
5529 | return s[1].toUpperCase();
|
5530 | });
|
5531 | }
|
5532 | };
|
5533 | /**
|
5534 | * @module GestureDetector
|
5535 | */
|
5536 |
|
5537 | /**
|
5538 | * @class Event
|
5539 | * @static
|
5540 | */
|
5541 |
|
5542 | Event$1 = GestureDetector.event = {
|
5543 | /**
|
5544 | * when touch events have been fired, this is true
|
5545 | * this is used to stop mouse events
|
5546 | * @property prevent_mouseevents
|
5547 | * @private
|
5548 | * @type {Boolean}
|
5549 | */
|
5550 | preventMouseEvents: false,
|
5551 |
|
5552 | /**
|
5553 | * if EVENT_START has been fired
|
5554 | * @property started
|
5555 | * @private
|
5556 | * @type {Boolean}
|
5557 | */
|
5558 | started: false,
|
5559 |
|
5560 | /**
|
5561 | * when the mouse is hold down, this is true
|
5562 | * @property should_detect
|
5563 | * @private
|
5564 | * @type {Boolean}
|
5565 | */
|
5566 | shouldDetect: false,
|
5567 |
|
5568 | /**
|
5569 | * simple event binder with a hook and support for multiple types
|
5570 | * @param {HTMLElement} element
|
5571 | * @param {String} type
|
5572 | * @param {Function} handler
|
5573 | * @param {Object} [opt]
|
5574 | * @param {Function} [hook]
|
5575 | * @param {Object} hook.type
|
5576 | */
|
5577 | on: function on(element, type, handler, opt, hook) {
|
5578 | var types = type.split(' ');
|
5579 | Utils.each(types, function (type) {
|
5580 | Utils.on(element, type, handler, opt);
|
5581 | hook && hook(type);
|
5582 | });
|
5583 | },
|
5584 |
|
5585 | /**
|
5586 | * simple event unbinder with a hook and support for multiple types
|
5587 | * @param {HTMLElement} element
|
5588 | * @param {String} type
|
5589 | * @param {Function} handler
|
5590 | * @param {Object} [opt]
|
5591 | * @param {Function} [hook]
|
5592 | * @param {Object} hook.type
|
5593 | */
|
5594 | off: function off(element, type, handler, opt, hook) {
|
5595 | var types = type.split(' ');
|
5596 | Utils.each(types, function (type) {
|
5597 | Utils.off(element, type, handler, opt);
|
5598 | hook && hook(type);
|
5599 | });
|
5600 | },
|
5601 |
|
5602 | /**
|
5603 | * the core touch event handler.
|
5604 | * this finds out if we should to detect gestures
|
5605 | * @param {HTMLElement} element
|
5606 | * @param {String} eventType matches `EVENT_START|MOVE|END`
|
5607 | * @param {Function} handler
|
5608 | * @return onTouchHandler {Function} the core event handler
|
5609 | */
|
5610 | onTouch: function onTouch(element, eventType, handler, opt) {
|
5611 | var self = this;
|
5612 |
|
5613 | var onTouchHandler = function onTouchHandler(ev) {
|
5614 | var srcType = ev.type.toLowerCase(),
|
5615 | isPointer = GestureDetector.HAS_POINTEREVENTS,
|
5616 | isMouse = Utils.inStr(srcType, 'mouse'),
|
5617 | triggerType; // if we are in a mouseevent, but there has been a touchevent triggered in this session
|
5618 | // we want to do nothing. simply break out of the event.
|
5619 |
|
5620 | if (isMouse && self.preventMouseEvents) {
|
5621 | return; // mousebutton must be down
|
5622 | } else if (isMouse && eventType == EVENT_START && ev.button === 0) {
|
5623 | self.preventMouseEvents = false;
|
5624 | self.shouldDetect = true;
|
5625 | } else if (isPointer && eventType == EVENT_START) {
|
5626 | self.shouldDetect = ev.buttons === 1 || PointerEvent.matchType(POINTER_TOUCH, ev); // just a valid start event, but no mouse
|
5627 | } else if (!isMouse && eventType == EVENT_START) {
|
5628 | self.preventMouseEvents = true;
|
5629 | self.shouldDetect = true;
|
5630 | } // update the pointer event before entering the detection
|
5631 |
|
5632 |
|
5633 | if (isPointer && eventType != EVENT_END) {
|
5634 | PointerEvent.updatePointer(eventType, ev);
|
5635 | } // we are in a touch/down state, so allowed detection of gestures
|
5636 |
|
5637 |
|
5638 | if (self.shouldDetect) {
|
5639 | triggerType = self.doDetect.call(self, ev, eventType, element, handler);
|
5640 | } // ...and we are done with the detection
|
5641 | // so reset everything to start each detection totally fresh
|
5642 |
|
5643 |
|
5644 | if (triggerType == EVENT_END) {
|
5645 | self.preventMouseEvents = false;
|
5646 | self.shouldDetect = false;
|
5647 | PointerEvent.reset(); // update the pointerevent object after the detection
|
5648 | }
|
5649 |
|
5650 | if (isPointer && eventType == EVENT_END) {
|
5651 | PointerEvent.updatePointer(eventType, ev);
|
5652 | }
|
5653 | };
|
5654 |
|
5655 | this.on(element, EVENT_TYPES[eventType], onTouchHandler, opt);
|
5656 | return onTouchHandler;
|
5657 | },
|
5658 |
|
5659 | /**
|
5660 | * the core detection method
|
5661 | * this finds out what GestureDetector-touch-events to trigger
|
5662 | * @param {Object} ev
|
5663 | * @param {String} eventType matches `EVENT_START|MOVE|END`
|
5664 | * @param {HTMLElement} element
|
5665 | * @param {Function} handler
|
5666 | * @return {String} triggerType matches `EVENT_START|MOVE|END`
|
5667 | */
|
5668 | doDetect: function doDetect(ev, eventType, element, handler) {
|
5669 | var touchList = this.getTouchList(ev, eventType);
|
5670 | var touchListLength = touchList.length;
|
5671 | var triggerType = eventType;
|
5672 | var triggerChange = touchList.trigger; // used by fakeMultitouch plugin
|
5673 |
|
5674 | var changedLength = touchListLength; // at each touchstart-like event we want also want to trigger a TOUCH event...
|
5675 |
|
5676 | if (eventType == EVENT_START) {
|
5677 | triggerChange = EVENT_TOUCH; // ...the same for a touchend-like event
|
5678 | } else if (eventType == EVENT_END) {
|
5679 | triggerChange = EVENT_RELEASE; // keep track of how many touches have been removed
|
5680 |
|
5681 | changedLength = touchList.length - (ev.changedTouches ? ev.changedTouches.length : 1);
|
5682 | } // after there are still touches on the screen,
|
5683 | // we just want to trigger a MOVE event. so change the START or END to a MOVE
|
5684 | // but only after detection has been started, the first time we actually want a START
|
5685 |
|
5686 |
|
5687 | if (changedLength > 0 && this.started) {
|
5688 | triggerType = EVENT_MOVE;
|
5689 | } // detection has been started, we keep track of this, see above
|
5690 |
|
5691 |
|
5692 | this.started = true; // generate some event data, some basic information
|
5693 |
|
5694 | var evData = this.collectEventData(element, triggerType, touchList, ev); // trigger the triggerType event before the change (TOUCH, RELEASE) events
|
5695 | // but the END event should be at last
|
5696 |
|
5697 | if (eventType != EVENT_END) {
|
5698 | handler.call(Detection, evData);
|
5699 | } // trigger a change (TOUCH, RELEASE) event, this means the length of the touches changed
|
5700 |
|
5701 |
|
5702 | if (triggerChange) {
|
5703 | evData.changedLength = changedLength;
|
5704 | evData.eventType = triggerChange;
|
5705 | handler.call(Detection, evData);
|
5706 | evData.eventType = triggerType;
|
5707 | delete evData.changedLength;
|
5708 | } // trigger the END event
|
5709 |
|
5710 |
|
5711 | if (triggerType == EVENT_END) {
|
5712 | handler.call(Detection, evData); // ...and we are done with the detection
|
5713 | // so reset everything to start each detection totally fresh
|
5714 |
|
5715 | this.started = false;
|
5716 | }
|
5717 |
|
5718 | return triggerType;
|
5719 | },
|
5720 |
|
5721 | /**
|
5722 | * we have different events for each device/browser
|
5723 | * determine what we need and set them in the EVENT_TYPES constant
|
5724 | * the `onTouch` method is bind to these properties.
|
5725 | * @return {Object} events
|
5726 | */
|
5727 | determineEventTypes: function determineEventTypes() {
|
5728 | var types;
|
5729 |
|
5730 | if (GestureDetector.HAS_POINTEREVENTS) {
|
5731 | if (window.PointerEvent) {
|
5732 | types = ['pointerdown', 'pointermove', 'pointerup pointercancel lostpointercapture'];
|
5733 | } else {
|
5734 | types = ['MSPointerDown', 'MSPointerMove', 'MSPointerUp MSPointerCancel MSLostPointerCapture'];
|
5735 | }
|
5736 | } else if (GestureDetector.NO_MOUSEEVENTS) {
|
5737 | types = ['touchstart', 'touchmove', 'touchend touchcancel'];
|
5738 | } else {
|
5739 | types = ['touchstart mousedown', 'touchmove mousemove', 'touchend touchcancel mouseup'];
|
5740 | }
|
5741 |
|
5742 | EVENT_TYPES[EVENT_START] = types[0];
|
5743 | EVENT_TYPES[EVENT_MOVE] = types[1];
|
5744 | EVENT_TYPES[EVENT_END] = types[2];
|
5745 | return EVENT_TYPES;
|
5746 | },
|
5747 |
|
5748 | /**
|
5749 | * create touchList depending on the event
|
5750 | * @param {Object} ev
|
5751 | * @param {String} eventType
|
5752 | * @return {Array} touches
|
5753 | */
|
5754 | getTouchList: function getTouchList(ev, eventType) {
|
5755 | // get the fake pointerEvent touchlist
|
5756 | if (GestureDetector.HAS_POINTEREVENTS) {
|
5757 | return PointerEvent.getTouchList();
|
5758 | } // get the touchlist
|
5759 |
|
5760 |
|
5761 | if (ev.touches) {
|
5762 | if (eventType == EVENT_MOVE) {
|
5763 | return ev.touches;
|
5764 | }
|
5765 |
|
5766 | var identifiers = [];
|
5767 | var concat = [].concat(Utils.toArray(ev.touches), Utils.toArray(ev.changedTouches));
|
5768 | var touchList = [];
|
5769 | Utils.each(concat, function (touch) {
|
5770 | if (Utils.inArray(identifiers, touch.identifier) === -1) {
|
5771 | touchList.push(touch);
|
5772 | }
|
5773 |
|
5774 | identifiers.push(touch.identifier);
|
5775 | });
|
5776 | return touchList;
|
5777 | } // make fake touchList from mouse position
|
5778 |
|
5779 |
|
5780 | ev.identifier = 1;
|
5781 | return [ev];
|
5782 | },
|
5783 |
|
5784 | /**
|
5785 | * collect basic event data
|
5786 | * @param {HTMLElement} element
|
5787 | * @param {String} eventType matches `EVENT_START|MOVE|END`
|
5788 | * @param {Array} touches
|
5789 | * @param {Object} ev
|
5790 | * @return {Object} ev
|
5791 | */
|
5792 | collectEventData: function collectEventData(element, eventType, touches, ev) {
|
5793 | // find out pointerType
|
5794 | var pointerType = POINTER_TOUCH;
|
5795 |
|
5796 | if (Utils.inStr(ev.type, 'mouse') || PointerEvent.matchType(POINTER_MOUSE, ev)) {
|
5797 | pointerType = POINTER_MOUSE;
|
5798 | } else if (PointerEvent.matchType(POINTER_PEN, ev)) {
|
5799 | pointerType = POINTER_PEN;
|
5800 | }
|
5801 |
|
5802 | return {
|
5803 | center: Utils.getCenter(touches),
|
5804 | timeStamp: Date.now(),
|
5805 | target: ev.target,
|
5806 | touches: touches,
|
5807 | eventType: eventType,
|
5808 | pointerType: pointerType,
|
5809 | srcEvent: ev,
|
5810 |
|
5811 | /**
|
5812 | * prevent the browser default actions
|
5813 | * mostly used to disable scrolling of the browser
|
5814 | */
|
5815 | preventDefault: function preventDefault() {
|
5816 | var srcEvent = this.srcEvent;
|
5817 | srcEvent.preventManipulation && srcEvent.preventManipulation();
|
5818 | srcEvent.preventDefault && srcEvent.preventDefault();
|
5819 | },
|
5820 |
|
5821 | /**
|
5822 | * stop bubbling the event up to its parents
|
5823 | */
|
5824 | stopPropagation: function stopPropagation() {
|
5825 | this.srcEvent.stopPropagation();
|
5826 | },
|
5827 |
|
5828 | /**
|
5829 | * immediately stop gesture detection
|
5830 | * might be useful after a swipe was detected
|
5831 | * @return {*}
|
5832 | */
|
5833 | stopDetect: function stopDetect() {
|
5834 | return Detection.stopDetect();
|
5835 | }
|
5836 | };
|
5837 | }
|
5838 | };
|
5839 | /**
|
5840 | * @module GestureDetector
|
5841 | *
|
5842 | * @class PointerEvent
|
5843 | * @static
|
5844 | */
|
5845 |
|
5846 | PointerEvent = GestureDetector.PointerEvent = {
|
5847 | /**
|
5848 | * holds all pointers, by `identifier`
|
5849 | * @property pointers
|
5850 | * @type {Object}
|
5851 | */
|
5852 | pointers: {},
|
5853 |
|
5854 | /**
|
5855 | * get the pointers as an array
|
5856 | * @return {Array} touchlist
|
5857 | */
|
5858 | getTouchList: function getTouchList() {
|
5859 | var touchlist = []; // we can use forEach since pointerEvents only is in IE10
|
5860 |
|
5861 | Utils.each(this.pointers, function (pointer) {
|
5862 | touchlist.push(pointer);
|
5863 | });
|
5864 | return touchlist;
|
5865 | },
|
5866 |
|
5867 | /**
|
5868 | * update the position of a pointer
|
5869 | * @param {String} eventType matches `EVENT_START|MOVE|END`
|
5870 | * @param {Object} pointerEvent
|
5871 | */
|
5872 | updatePointer: function updatePointer(eventType, pointerEvent) {
|
5873 | if (eventType == EVENT_END || eventType != EVENT_END && pointerEvent.buttons !== 1) {
|
5874 | delete this.pointers[pointerEvent.pointerId];
|
5875 | } else {
|
5876 | pointerEvent.identifier = pointerEvent.pointerId;
|
5877 | this.pointers[pointerEvent.pointerId] = pointerEvent;
|
5878 | }
|
5879 | },
|
5880 |
|
5881 | /**
|
5882 | * check if ev matches pointertype
|
5883 | * @param {String} pointerType matches `POINTER_MOUSE|TOUCH|PEN`
|
5884 | * @param {PointerEvent} ev
|
5885 | */
|
5886 | matchType: function matchType(pointerType, ev) {
|
5887 | if (!ev.pointerType) {
|
5888 | return false;
|
5889 | }
|
5890 |
|
5891 | var pt = ev.pointerType,
|
5892 | types = {};
|
5893 | types[POINTER_MOUSE] = pt === (ev.MSPOINTER_TYPE_MOUSE || POINTER_MOUSE);
|
5894 | types[POINTER_TOUCH] = pt === (ev.MSPOINTER_TYPE_TOUCH || POINTER_TOUCH);
|
5895 | types[POINTER_PEN] = pt === (ev.MSPOINTER_TYPE_PEN || POINTER_PEN);
|
5896 | return types[pointerType];
|
5897 | },
|
5898 |
|
5899 | /**
|
5900 | * reset the stored pointers
|
5901 | */
|
5902 | reset: function resetList() {
|
5903 | this.pointers = {};
|
5904 | }
|
5905 | };
|
5906 | /**
|
5907 | * @module GestureDetector
|
5908 | *
|
5909 | * @class Detection
|
5910 | * @static
|
5911 | */
|
5912 |
|
5913 | Detection = GestureDetector.detection = {
|
5914 | // contains all registered GestureDetector.gestures in the correct order
|
5915 | gestures: [],
|
5916 | // data of the current GestureDetector.gesture detection session
|
5917 | current: null,
|
5918 | // the previous GestureDetector.gesture session data
|
5919 | // is a full clone of the previous gesture.current object
|
5920 | previous: null,
|
5921 | // when this becomes true, no gestures are fired
|
5922 | stopped: false,
|
5923 |
|
5924 | /**
|
5925 | * start GestureDetector.gesture detection
|
5926 | * @param {GestureDetector.Instance} inst
|
5927 | * @param {Object} eventData
|
5928 | */
|
5929 | startDetect: function startDetect(inst, eventData) {
|
5930 | // already busy with a GestureDetector.gesture detection on an element
|
5931 | if (this.current) {
|
5932 | return;
|
5933 | }
|
5934 |
|
5935 | this.stopped = false; // holds current session
|
5936 |
|
5937 | this.current = {
|
5938 | inst: inst,
|
5939 | // reference to GestureDetectorInstance we're working for
|
5940 | startEvent: Utils.extend({}, eventData),
|
5941 | // start eventData for distances, timing etc
|
5942 | lastEvent: false,
|
5943 | // last eventData
|
5944 | lastCalcEvent: false,
|
5945 | // last eventData for calculations.
|
5946 | futureCalcEvent: false,
|
5947 | // last eventData for calculations.
|
5948 | lastCalcData: {},
|
5949 | // last lastCalcData
|
5950 | name: '' // current gesture we're in/detected, can be 'tap', 'hold' etc
|
5951 |
|
5952 | };
|
5953 | this.detect(eventData);
|
5954 | },
|
5955 |
|
5956 | /**
|
5957 | * GestureDetector.gesture detection
|
5958 | * @param {Object} eventData
|
5959 | * @return {any}
|
5960 | */
|
5961 | detect: function detect(eventData) {
|
5962 | if (!this.current || this.stopped) {
|
5963 | return;
|
5964 | } // extend event data with calculations about scale, distance etc
|
5965 |
|
5966 |
|
5967 | eventData = this.extendEventData(eventData); // GestureDetector instance and instance options
|
5968 |
|
5969 | var inst = this.current.inst,
|
5970 | instOptions = inst.options; // call GestureDetector.gesture handlers
|
5971 |
|
5972 | Utils.each(this.gestures, function triggerGesture(gesture) {
|
5973 | // only when the instance options have enabled this gesture
|
5974 | if (!this.stopped && inst.enabled && instOptions[gesture.name]) {
|
5975 | gesture.handler.call(gesture, eventData, inst);
|
5976 | }
|
5977 | }, this); // store as previous event event
|
5978 |
|
5979 | if (this.current) {
|
5980 | this.current.lastEvent = eventData;
|
5981 | }
|
5982 |
|
5983 | if (eventData.eventType == EVENT_END) {
|
5984 | this.stopDetect();
|
5985 | }
|
5986 |
|
5987 | return eventData; // eslint-disable-line consistent-return
|
5988 | },
|
5989 |
|
5990 | /**
|
5991 | * clear the GestureDetector.gesture vars
|
5992 | * this is called on endDetect, but can also be used when a final GestureDetector.gesture has been detected
|
5993 | * to stop other GestureDetector.gestures from being fired
|
5994 | */
|
5995 | stopDetect: function stopDetect() {
|
5996 | // clone current data to the store as the previous gesture
|
5997 | // used for the double tap gesture, since this is an other gesture detect session
|
5998 | this.previous = Utils.extend({}, this.current); // reset the current
|
5999 |
|
6000 | this.current = null;
|
6001 | this.stopped = true;
|
6002 | },
|
6003 |
|
6004 | /**
|
6005 | * calculate velocity, angle and direction
|
6006 | * @param {Object} ev
|
6007 | * @param {Object} center
|
6008 | * @param {Number} deltaTime
|
6009 | * @param {Number} deltaX
|
6010 | * @param {Number} deltaY
|
6011 | */
|
6012 | getCalculatedData: function getCalculatedData(ev, center, deltaTime, deltaX, deltaY) {
|
6013 | var cur = this.current,
|
6014 | recalc = false,
|
6015 | calcEv = cur.lastCalcEvent,
|
6016 | calcData = cur.lastCalcData;
|
6017 |
|
6018 | if (calcEv && ev.timeStamp - calcEv.timeStamp > GestureDetector.CALCULATE_INTERVAL) {
|
6019 | center = calcEv.center;
|
6020 | deltaTime = ev.timeStamp - calcEv.timeStamp;
|
6021 | deltaX = ev.center.clientX - calcEv.center.clientX;
|
6022 | deltaY = ev.center.clientY - calcEv.center.clientY;
|
6023 | recalc = true;
|
6024 | }
|
6025 |
|
6026 | if (ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) {
|
6027 | cur.futureCalcEvent = ev;
|
6028 | }
|
6029 |
|
6030 | if (!cur.lastCalcEvent || recalc) {
|
6031 | calcData.velocity = Utils.getVelocity(deltaTime, deltaX, deltaY);
|
6032 | calcData.angle = Utils.getAngle(center, ev.center);
|
6033 | calcData.direction = Utils.getDirection(center, ev.center);
|
6034 | cur.lastCalcEvent = cur.futureCalcEvent || ev;
|
6035 | cur.futureCalcEvent = ev;
|
6036 | }
|
6037 |
|
6038 | ev.velocityX = calcData.velocity.x;
|
6039 | ev.velocityY = calcData.velocity.y;
|
6040 | ev.interimAngle = calcData.angle;
|
6041 | ev.interimDirection = calcData.direction;
|
6042 | },
|
6043 |
|
6044 | /**
|
6045 | * extend eventData for GestureDetector.gestures
|
6046 | * @param {Object} ev
|
6047 | * @return {Object} ev
|
6048 | */
|
6049 | extendEventData: function extendEventData(ev) {
|
6050 | var cur = this.current,
|
6051 | startEv = cur.startEvent,
|
6052 | lastEv = cur.lastEvent || startEv; // update the start touchlist to calculate the scale/rotation
|
6053 |
|
6054 | if (ev.eventType == EVENT_TOUCH || ev.eventType == EVENT_RELEASE) {
|
6055 | startEv.touches = [];
|
6056 | Utils.each(ev.touches, function (touch) {
|
6057 | startEv.touches.push({
|
6058 | clientX: touch.clientX,
|
6059 | clientY: touch.clientY
|
6060 | });
|
6061 | });
|
6062 | }
|
6063 |
|
6064 | var deltaTime = ev.timeStamp - startEv.timeStamp,
|
6065 | deltaX = ev.center.clientX - startEv.center.clientX,
|
6066 | deltaY = ev.center.clientY - startEv.center.clientY;
|
6067 | this.getCalculatedData(ev, lastEv.center, deltaTime, deltaX, deltaY);
|
6068 | Utils.extend(ev, {
|
6069 | startEvent: startEv,
|
6070 | deltaTime: deltaTime,
|
6071 | deltaX: deltaX,
|
6072 | deltaY: deltaY,
|
6073 | distance: Utils.getDistance(startEv.center, ev.center),
|
6074 | angle: Utils.getAngle(startEv.center, ev.center),
|
6075 | direction: Utils.getDirection(startEv.center, ev.center),
|
6076 | scale: Utils.getScale(startEv.touches, ev.touches),
|
6077 | rotation: Utils.getRotation(startEv.touches, ev.touches)
|
6078 | });
|
6079 | return ev;
|
6080 | },
|
6081 |
|
6082 | /**
|
6083 | * register new gesture
|
6084 | * @param {Object} gesture object, see `gestures/` for documentation
|
6085 | * @return {Array} gestures
|
6086 | */
|
6087 | register: function register(gesture) {
|
6088 | // add an enable gesture options if there is no given
|
6089 | var options = gesture.defaults || {};
|
6090 |
|
6091 | if (options[gesture.name] === undefined) {
|
6092 | options[gesture.name] = true;
|
6093 | } // extend GestureDetector default options with the GestureDetector.gesture options
|
6094 |
|
6095 |
|
6096 | Utils.extend(GestureDetector.defaults, options, true); // set its index
|
6097 |
|
6098 | gesture.index = gesture.index || 1000; // add GestureDetector.gesture to the list
|
6099 |
|
6100 | this.gestures.push(gesture); // sort the list by index
|
6101 |
|
6102 | this.gestures.sort(function (a, b) {
|
6103 | if (a.index < b.index) {
|
6104 | return -1;
|
6105 | }
|
6106 |
|
6107 | if (a.index > b.index) {
|
6108 | return 1;
|
6109 | }
|
6110 |
|
6111 | return 0;
|
6112 | });
|
6113 | return this.gestures;
|
6114 | }
|
6115 | };
|
6116 | /**
|
6117 | * @module GestureDetector
|
6118 | */
|
6119 |
|
6120 | /**
|
6121 | * create new GestureDetector instance
|
6122 | * all methods should return the instance itself, so it is chainable.
|
6123 | *
|
6124 | * @class Instance
|
6125 | * @constructor
|
6126 | * @param {HTMLElement} element
|
6127 | * @param {Object} [options={}] options are merged with `GestureDetector.defaults`
|
6128 | * @return {GestureDetector.Instance}
|
6129 | */
|
6130 |
|
6131 | GestureDetector.Instance = function (element, options) {
|
6132 | var self = this;
|
6133 | var listenerOptions = options && options.passive ? {
|
6134 | passive: true
|
6135 | } : undefined; // setup GestureDetectorJS window events and register all gestures
|
6136 | // this also sets up the default options
|
6137 |
|
6138 | setup(listenerOptions);
|
6139 | /**
|
6140 | * @property element
|
6141 | * @type {HTMLElement}
|
6142 | */
|
6143 |
|
6144 | this.element = element;
|
6145 | /**
|
6146 | * @property enabled
|
6147 | * @type {Boolean}
|
6148 | * @protected
|
6149 | */
|
6150 |
|
6151 | this.enabled = true;
|
6152 | /**
|
6153 | * options, merged with the defaults
|
6154 | * options with an _ are converted to camelCase
|
6155 | * @property options
|
6156 | * @type {Object}
|
6157 | */
|
6158 |
|
6159 | Utils.each(options, function (value, name) {
|
6160 | delete options[name];
|
6161 | options[Utils.toCamelCase(name)] = value;
|
6162 | });
|
6163 | this.options = Utils.extend(Utils.extend({}, GestureDetector.defaults), options || {});
|
6164 | this.options.listenerOptions = listenerOptions; // add some css to the element to prevent the browser from doing its native behavior
|
6165 |
|
6166 | if (this.options.behavior) {
|
6167 | Utils.toggleBehavior(this.element, this.options.behavior, true);
|
6168 | }
|
6169 | /**
|
6170 | * event start handler on the element to start the detection
|
6171 | * @property eventStartHandler
|
6172 | * @type {Object}
|
6173 | */
|
6174 |
|
6175 |
|
6176 | this.eventStartHandler = Event$1.onTouch(element, EVENT_START, function (ev) {
|
6177 | if (self.enabled && ev.eventType == EVENT_START) {
|
6178 | Detection.startDetect(self, ev);
|
6179 | } else if (ev.eventType == EVENT_TOUCH) {
|
6180 | Detection.detect(ev);
|
6181 | }
|
6182 | }, listenerOptions);
|
6183 | /**
|
6184 | * keep a list of user event handlers which needs to be removed when calling 'dispose'
|
6185 | * @property eventHandlers
|
6186 | * @type {Array}
|
6187 | */
|
6188 |
|
6189 | this.eventHandlers = [];
|
6190 | };
|
6191 |
|
6192 | GestureDetector.Instance.prototype = {
|
6193 | /**
|
6194 | * @method on
|
6195 | * @signature on(gestures, handler)
|
6196 | * @description
|
6197 | * [en]Adds an event handler for a gesture. Available gestures are: drag, dragleft, dragright, dragup, dragdown, hold, release, swipe, swipeleft, swiperight, swipeup, swipedown, tap, doubletap, touch, transform, pinch, pinchin, pinchout and rotate. [/en]
|
6198 | * [ja]ジェスチャに対するイベントハンドラを追加します。指定できるジェスチャ名は、drag dragleft dragright dragup dragdown hold release swipe swipeleft swiperight swipeup swipedown tap doubletap touch transform pinch pinchin pinchout rotate です。[/ja]
|
6199 | * @param {String} gestures
|
6200 | * [en]A space separated list of gestures.[/en]
|
6201 | * [ja]検知するジェスチャ名を指定します。スペースで複数指定することができます。[/ja]
|
6202 | * @param {Function} handler
|
6203 | * [en]An event handling function.[/en]
|
6204 | * [ja]イベントハンドラとなる関数オブジェクトを指定します。[/ja]
|
6205 | */
|
6206 | on: function onEvent(gestures, handler, opt) {
|
6207 | var self = this;
|
6208 | Event$1.on(self.element, gestures, handler, util$4.extend({}, self.options.listenerOptions, opt), function (type) {
|
6209 | self.eventHandlers.push({
|
6210 | gesture: type,
|
6211 | handler: handler
|
6212 | });
|
6213 | });
|
6214 | return self;
|
6215 | },
|
6216 |
|
6217 | /**
|
6218 | * @method off
|
6219 | * @signature off(gestures, handler)
|
6220 | * @description
|
6221 | * [en]Remove an event listener.[/en]
|
6222 | * [ja]イベントリスナーを削除します。[/ja]
|
6223 | * @param {String} gestures
|
6224 | * [en]A space separated list of gestures.[/en]
|
6225 | * [ja]ジェスチャ名を指定します。スペースで複数指定することができます。[/ja]
|
6226 | * @param {Function} handler
|
6227 | * [en]An event handling function.[/en]
|
6228 | * [ja]イベントハンドラとなる関数オブジェクトを指定します。[/ja]
|
6229 | */
|
6230 | off: function offEvent(gestures, handler, opt) {
|
6231 | var self = this;
|
6232 | Event$1.off(self.element, gestures, handler, util$4.extend({}, self.options.listenerOptions, opt), function (type) {
|
6233 | var index = Utils.inArray(self.eventHandlers, {
|
6234 | gesture: type,
|
6235 | handler: handler
|
6236 | }, true);
|
6237 |
|
6238 | if (index >= 0) {
|
6239 | self.eventHandlers.splice(index, 1);
|
6240 | }
|
6241 | });
|
6242 | return self;
|
6243 | },
|
6244 |
|
6245 | /**
|
6246 | * trigger gesture event
|
6247 | * @method trigger
|
6248 | * @signature trigger(gesture, eventData)
|
6249 | * @param {String} gesture
|
6250 | * @param {Object} [eventData]
|
6251 | */
|
6252 | trigger: function triggerEvent(gesture, eventData) {
|
6253 | // optional
|
6254 | if (!eventData) {
|
6255 | eventData = {};
|
6256 | } // create DOM event
|
6257 |
|
6258 |
|
6259 | var event = GestureDetector.DOCUMENT.createEvent('Event');
|
6260 | event.initEvent(gesture, true, true);
|
6261 | event.gesture = eventData; // trigger on the target if it is in the instance element,
|
6262 | // this is for event delegation tricks
|
6263 |
|
6264 | var element = this.element;
|
6265 |
|
6266 | if (Utils.hasParent(eventData.target, element)) {
|
6267 | element = eventData.target;
|
6268 | }
|
6269 |
|
6270 | element.dispatchEvent(event);
|
6271 | return this;
|
6272 | },
|
6273 |
|
6274 | /**
|
6275 | * @method enable
|
6276 | * @signature enable(state)
|
6277 | * @description
|
6278 | * [en]Enable or disable gesture detection.[/en]
|
6279 | * [ja]ジェスチャ検知を有効化/無効化します。[/ja]
|
6280 | * @param {Boolean} state
|
6281 | * [en]Specify if it should be enabled or not.[/en]
|
6282 | * [ja]有効にするかどうかを指定します。[/ja]
|
6283 | */
|
6284 | enable: function enable(state) {
|
6285 | this.enabled = state;
|
6286 | return this;
|
6287 | },
|
6288 |
|
6289 | /**
|
6290 | * @method dispose
|
6291 | * @signature dispose()
|
6292 | * @description
|
6293 | * [en]Remove and destroy all event handlers for this instance.[/en]
|
6294 | * [ja]このインスタンスでのジェスチャの検知や、イベントハンドラを全て解除して廃棄します。[/ja]
|
6295 | */
|
6296 | dispose: function dispose() {
|
6297 | var i, eh; // undo all changes made by stop_browser_behavior
|
6298 |
|
6299 | Utils.toggleBehavior(this.element, this.options.behavior, false); // unbind all custom event handlers
|
6300 |
|
6301 | for (i = -1; eh = this.eventHandlers[++i];) {
|
6302 | // eslint-disable-line no-cond-assign
|
6303 | Utils.off(this.element, eh.gesture, eh.handler);
|
6304 | }
|
6305 |
|
6306 | this.eventHandlers = []; // unbind the start event listener
|
6307 |
|
6308 | Event$1.off(this.element, EVENT_TYPES[EVENT_START], this.eventStartHandler);
|
6309 | return null;
|
6310 | }
|
6311 | };
|
6312 | /**
|
6313 | * @module gestures
|
6314 | */
|
6315 |
|
6316 | /**
|
6317 | * Move with x fingers (default 1) around on the page.
|
6318 | * Preventing the default browser behavior is a good way to improve feel and working.
|
6319 | * ````
|
6320 | * GestureDetectortime.on("drag", function(ev) {
|
6321 | * console.log(ev);
|
6322 | * ev.gesture.preventDefault();
|
6323 | * });
|
6324 | * ````
|
6325 | *
|
6326 | * @class Drag
|
6327 | * @static
|
6328 | */
|
6329 |
|
6330 | /**
|
6331 | * @event drag
|
6332 | * @param {Object} ev
|
6333 | */
|
6334 |
|
6335 | /**
|
6336 | * @event dragstart
|
6337 | * @param {Object} ev
|
6338 | */
|
6339 |
|
6340 | /**
|
6341 | * @event dragend
|
6342 | * @param {Object} ev
|
6343 | */
|
6344 |
|
6345 | /**
|
6346 | * @event drapleft
|
6347 | * @param {Object} ev
|
6348 | */
|
6349 |
|
6350 | /**
|
6351 | * @event dragright
|
6352 | * @param {Object} ev
|
6353 | */
|
6354 |
|
6355 | /**
|
6356 | * @event dragup
|
6357 | * @param {Object} ev
|
6358 | */
|
6359 |
|
6360 | /**
|
6361 | * @event dragdown
|
6362 | * @param {Object} ev
|
6363 | */
|
6364 |
|
6365 | /**
|
6366 | * @param {String} name
|
6367 | */
|
6368 |
|
6369 | (function (name) {
|
6370 | var triggered = false;
|
6371 |
|
6372 | function dragGesture(ev, inst) {
|
6373 | var cur = Detection.current; // max touches
|
6374 |
|
6375 | if (inst.options.dragMaxTouches > 0 && ev.touches.length > inst.options.dragMaxTouches) {
|
6376 | return;
|
6377 | }
|
6378 |
|
6379 | switch (ev.eventType) {
|
6380 | case EVENT_START:
|
6381 | triggered = false;
|
6382 | break;
|
6383 |
|
6384 | case EVENT_MOVE:
|
6385 | // when the distance we moved is too small we skip this gesture
|
6386 | // or we can be already in dragging
|
6387 | if (ev.distance < inst.options.dragMinDistance && cur.name != name) {
|
6388 | return;
|
6389 | }
|
6390 |
|
6391 | var startCenter = cur.startEvent.center; // we are dragging!
|
6392 |
|
6393 | if (cur.name != name) {
|
6394 | cur.name = name;
|
6395 |
|
6396 | if (inst.options.dragDistanceCorrection && ev.distance > 0) {
|
6397 | // When a drag is triggered, set the event center to dragMinDistance pixels from the original event center.
|
6398 | // Without this correction, the dragged distance would jumpstart at dragMinDistance pixels instead of at 0.
|
6399 | // It might be useful to save the original start point somewhere
|
6400 | var factor = Math.abs(inst.options.dragMinDistance / ev.distance);
|
6401 | startCenter.pageX += ev.deltaX * factor;
|
6402 | startCenter.pageY += ev.deltaY * factor;
|
6403 | startCenter.clientX += ev.deltaX * factor;
|
6404 | startCenter.clientY += ev.deltaY * factor; // recalculate event data using new start point
|
6405 |
|
6406 | ev = Detection.extendEventData(ev);
|
6407 | }
|
6408 | } // lock drag to axis?
|
6409 |
|
6410 |
|
6411 | if (cur.lastEvent.dragLockToAxis || inst.options.dragLockToAxis && inst.options.dragLockMinDistance <= ev.distance) {
|
6412 | ev.dragLockToAxis = true;
|
6413 | } // keep direction on the axis that the drag gesture started on
|
6414 |
|
6415 |
|
6416 | var lastDirection = cur.lastEvent.direction;
|
6417 |
|
6418 | if (ev.dragLockToAxis && lastDirection !== ev.direction) {
|
6419 | if (Utils.isVertical(lastDirection)) {
|
6420 | ev.direction = ev.deltaY < 0 ? DIRECTION_UP : DIRECTION_DOWN;
|
6421 | } else {
|
6422 | ev.direction = ev.deltaX < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;
|
6423 | }
|
6424 | } // first time, trigger dragstart event
|
6425 |
|
6426 |
|
6427 | if (!triggered) {
|
6428 | inst.trigger(name + 'start', ev);
|
6429 | triggered = true;
|
6430 | } // trigger events
|
6431 |
|
6432 |
|
6433 | inst.trigger(name, ev);
|
6434 | inst.trigger(name + ev.direction, ev);
|
6435 | var isVertical = Utils.isVertical(ev.direction); // block the browser events
|
6436 |
|
6437 | if (inst.options.dragBlockVertical && isVertical || inst.options.dragBlockHorizontal && !isVertical) {
|
6438 | ev.preventDefault();
|
6439 | }
|
6440 |
|
6441 | break;
|
6442 |
|
6443 | case EVENT_RELEASE:
|
6444 | if (triggered && ev.changedLength <= inst.options.dragMaxTouches) {
|
6445 | inst.trigger(name + 'end', ev);
|
6446 | triggered = false;
|
6447 | }
|
6448 |
|
6449 | break;
|
6450 |
|
6451 | case EVENT_END:
|
6452 | triggered = false;
|
6453 | break;
|
6454 | }
|
6455 | }
|
6456 |
|
6457 | GestureDetector.gestures.Drag = {
|
6458 | name: name,
|
6459 | index: 50,
|
6460 | handler: dragGesture,
|
6461 | defaults: {
|
6462 | /**
|
6463 | * minimal movement that have to be made before the drag event gets triggered
|
6464 | * @property dragMinDistance
|
6465 | * @type {Number}
|
6466 | * @default 10
|
6467 | */
|
6468 | dragMinDistance: 10,
|
6469 |
|
6470 | /**
|
6471 | * Set dragDistanceCorrection to true to make the starting point of the drag
|
6472 | * be calculated from where the drag was triggered, not from where the touch started.
|
6473 | * Useful to avoid a jerk-starting drag, which can make fine-adjustments
|
6474 | * through dragging difficult, and be visually unappealing.
|
6475 | * @property dragDistanceCorrection
|
6476 | * @type {Boolean}
|
6477 | * @default true
|
6478 | */
|
6479 | dragDistanceCorrection: true,
|
6480 |
|
6481 | /**
|
6482 | * set 0 for unlimited, but this can conflict with transform
|
6483 | * @property dragMaxTouches
|
6484 | * @type {Number}
|
6485 | * @default 1
|
6486 | */
|
6487 | dragMaxTouches: 1,
|
6488 |
|
6489 | /**
|
6490 | * prevent default browser behavior when dragging occurs
|
6491 | * be careful with it, it makes the element a blocking element
|
6492 | * when you are using the drag gesture, it is a good practice to set this true
|
6493 | * @property dragBlockHorizontal
|
6494 | * @type {Boolean}
|
6495 | * @default false
|
6496 | */
|
6497 | dragBlockHorizontal: false,
|
6498 |
|
6499 | /**
|
6500 | * same as `dragBlockHorizontal`, but for vertical movement
|
6501 | * @property dragBlockVertical
|
6502 | * @type {Boolean}
|
6503 | * @default false
|
6504 | */
|
6505 | dragBlockVertical: false,
|
6506 |
|
6507 | /**
|
6508 | * dragLockToAxis keeps the drag gesture on the axis that it started on,
|
6509 | * It disallows vertical directions if the initial direction was horizontal, and vice versa.
|
6510 | * @property dragLockToAxis
|
6511 | * @type {Boolean}
|
6512 | * @default false
|
6513 | */
|
6514 | dragLockToAxis: false,
|
6515 |
|
6516 | /**
|
6517 | * drag lock only kicks in when distance > dragLockMinDistance
|
6518 | * This way, locking occurs only when the distance has become large enough to reliably determine the direction
|
6519 | * @property dragLockMinDistance
|
6520 | * @type {Number}
|
6521 | * @default 25
|
6522 | */
|
6523 | dragLockMinDistance: 25
|
6524 | }
|
6525 | };
|
6526 | })('drag');
|
6527 | /**
|
6528 | * @module gestures
|
6529 | */
|
6530 |
|
6531 | /**
|
6532 | * trigger a simple gesture event, so you can do anything in your handler.
|
6533 | * only usable if you know what your doing...
|
6534 | *
|
6535 | * @class Gesture
|
6536 | * @static
|
6537 | */
|
6538 |
|
6539 | /**
|
6540 | * @event gesture
|
6541 | * @param {Object} ev
|
6542 | */
|
6543 |
|
6544 |
|
6545 | GestureDetector.gestures.Gesture = {
|
6546 | name: 'gesture',
|
6547 | index: 1337,
|
6548 | handler: function releaseGesture(ev, inst) {
|
6549 | inst.trigger(this.name, ev);
|
6550 | }
|
6551 | };
|
6552 | /**
|
6553 | * @module gestures
|
6554 | */
|
6555 |
|
6556 | /**
|
6557 | * Touch stays at the same place for x time
|
6558 | *
|
6559 | * @class Hold
|
6560 | * @static
|
6561 | */
|
6562 |
|
6563 | /**
|
6564 | * @event hold
|
6565 | * @param {Object} ev
|
6566 | */
|
6567 |
|
6568 | /**
|
6569 | * @param {String} name
|
6570 | */
|
6571 |
|
6572 | (function (name) {
|
6573 | var timer;
|
6574 |
|
6575 | function holdGesture(ev, inst) {
|
6576 | var options = inst.options,
|
6577 | current = Detection.current;
|
6578 |
|
6579 | switch (ev.eventType) {
|
6580 | case EVENT_START:
|
6581 | clearTimeout(timer); // set the gesture so we can check in the timeout if it still is
|
6582 |
|
6583 | current.name = name; // set timer and if after the timeout it still is hold,
|
6584 | // we trigger the hold event
|
6585 |
|
6586 | timer = setTimeout(function () {
|
6587 | if (current && current.name == name) {
|
6588 | inst.trigger(name, ev);
|
6589 | }
|
6590 | }, options.holdTimeout);
|
6591 | break;
|
6592 |
|
6593 | case EVENT_MOVE:
|
6594 | if (ev.distance > options.holdThreshold) {
|
6595 | clearTimeout(timer);
|
6596 | }
|
6597 |
|
6598 | break;
|
6599 |
|
6600 | case EVENT_RELEASE:
|
6601 | clearTimeout(timer);
|
6602 | break;
|
6603 | }
|
6604 | }
|
6605 |
|
6606 | GestureDetector.gestures.Hold = {
|
6607 | name: name,
|
6608 | index: 10,
|
6609 | defaults: {
|
6610 | /**
|
6611 | * @property holdTimeout
|
6612 | * @type {Number}
|
6613 | * @default 500
|
6614 | */
|
6615 | holdTimeout: 500,
|
6616 |
|
6617 | /**
|
6618 | * movement allowed while holding
|
6619 | * @property holdThreshold
|
6620 | * @type {Number}
|
6621 | * @default 2
|
6622 | */
|
6623 | holdThreshold: 2
|
6624 | },
|
6625 | handler: holdGesture
|
6626 | };
|
6627 | })('hold');
|
6628 | /**
|
6629 | * @module gestures
|
6630 | */
|
6631 |
|
6632 | /**
|
6633 | * when a touch is being released from the page
|
6634 | *
|
6635 | * @class Release
|
6636 | * @static
|
6637 | */
|
6638 |
|
6639 | /**
|
6640 | * @event release
|
6641 | * @param {Object} ev
|
6642 | */
|
6643 |
|
6644 |
|
6645 | GestureDetector.gestures.Release = {
|
6646 | name: 'release',
|
6647 | index: Infinity,
|
6648 | handler: function releaseGesture(ev, inst) {
|
6649 | if (ev.eventType == EVENT_RELEASE) {
|
6650 | inst.trigger(this.name, ev);
|
6651 | }
|
6652 | }
|
6653 | };
|
6654 | /**
|
6655 | * @module gestures
|
6656 | */
|
6657 |
|
6658 | /**
|
6659 | * triggers swipe events when the end velocity is above the threshold
|
6660 | * for best usage, set `preventDefault` (on the drag gesture) to `true`
|
6661 | * ````
|
6662 | * GestureDetectortime.on("dragleft swipeleft", function(ev) {
|
6663 | * console.log(ev);
|
6664 | * ev.gesture.preventDefault();
|
6665 | * });
|
6666 | * ````
|
6667 | *
|
6668 | * @class Swipe
|
6669 | * @static
|
6670 | */
|
6671 |
|
6672 | /**
|
6673 | * @event swipe
|
6674 | * @param {Object} ev
|
6675 | */
|
6676 |
|
6677 | /**
|
6678 | * @event swipeleft
|
6679 | * @param {Object} ev
|
6680 | */
|
6681 |
|
6682 | /**
|
6683 | * @event swiperight
|
6684 | * @param {Object} ev
|
6685 | */
|
6686 |
|
6687 | /**
|
6688 | * @event swipeup
|
6689 | * @param {Object} ev
|
6690 | */
|
6691 |
|
6692 | /**
|
6693 | * @event swipedown
|
6694 | * @param {Object} ev
|
6695 | */
|
6696 |
|
6697 | GestureDetector.gestures.Swipe = {
|
6698 | name: 'swipe',
|
6699 | index: 40,
|
6700 | defaults: {
|
6701 | /**
|
6702 | * @property swipeMinTouches
|
6703 | * @type {Number}
|
6704 | * @default 1
|
6705 | */
|
6706 | swipeMinTouches: 1,
|
6707 |
|
6708 | /**
|
6709 | * @property swipeMaxTouches
|
6710 | * @type {Number}
|
6711 | * @default 1
|
6712 | */
|
6713 | swipeMaxTouches: 1,
|
6714 |
|
6715 | /**
|
6716 | * horizontal swipe velocity
|
6717 | * @property swipeVelocityX
|
6718 | * @type {Number}
|
6719 | * @default 0.6
|
6720 | */
|
6721 | swipeVelocityX: 0.6,
|
6722 |
|
6723 | /**
|
6724 | * vertical swipe velocity
|
6725 | * @property swipeVelocityY
|
6726 | * @type {Number}
|
6727 | * @default 0.6
|
6728 | */
|
6729 | swipeVelocityY: 0.6
|
6730 | },
|
6731 | handler: function swipeGesture(ev, inst) {
|
6732 | if (ev.eventType == EVENT_RELEASE) {
|
6733 | var touches = ev.touches.length,
|
6734 | options = inst.options; // max touches
|
6735 |
|
6736 | if (touches < options.swipeMinTouches || touches > options.swipeMaxTouches) {
|
6737 | return;
|
6738 | } // when the distance we moved is too small we skip this gesture
|
6739 | // or we can be already in dragging
|
6740 |
|
6741 |
|
6742 | if (ev.velocityX > options.swipeVelocityX || ev.velocityY > options.swipeVelocityY) {
|
6743 | // trigger swipe events
|
6744 | inst.trigger(this.name, ev);
|
6745 | inst.trigger(this.name + ev.direction, ev);
|
6746 | }
|
6747 | }
|
6748 | }
|
6749 | };
|
6750 | /**
|
6751 | * @module gestures
|
6752 | */
|
6753 |
|
6754 | /**
|
6755 | * Single tap and a double tap on a place
|
6756 | *
|
6757 | * @class Tap
|
6758 | * @static
|
6759 | */
|
6760 |
|
6761 | /**
|
6762 | * @event tap
|
6763 | * @param {Object} ev
|
6764 | */
|
6765 |
|
6766 | /**
|
6767 | * @event doubletap
|
6768 | * @param {Object} ev
|
6769 | */
|
6770 |
|
6771 | /**
|
6772 | * @param {String} name
|
6773 | */
|
6774 |
|
6775 | (function (name) {
|
6776 | var hasMoved = false;
|
6777 |
|
6778 | function tapGesture(ev, inst) {
|
6779 | var options = inst.options,
|
6780 | current = Detection.current,
|
6781 | prev = Detection.previous,
|
6782 | sincePrev,
|
6783 | didDoubleTap;
|
6784 |
|
6785 | switch (ev.eventType) {
|
6786 | case EVENT_START:
|
6787 | hasMoved = false;
|
6788 | break;
|
6789 |
|
6790 | case EVENT_MOVE:
|
6791 | hasMoved = hasMoved || ev.distance > options.tapMaxDistance;
|
6792 | break;
|
6793 |
|
6794 | case EVENT_END:
|
6795 | if (!Utils.inStr(ev.srcEvent.type, 'cancel') && ev.deltaTime < options.tapMaxTime && !hasMoved) {
|
6796 | // previous gesture, for the double tap since these are two different gesture detections
|
6797 | sincePrev = prev && prev.lastEvent && ev.timeStamp - prev.lastEvent.timeStamp;
|
6798 | didDoubleTap = false; // check if double tap
|
6799 |
|
6800 | if (prev && prev.name == name && sincePrev && sincePrev < options.doubleTapInterval && ev.distance < options.doubleTapDistance) {
|
6801 | inst.trigger('doubletap', ev);
|
6802 | didDoubleTap = true;
|
6803 | } // do a single tap
|
6804 |
|
6805 |
|
6806 | if (!didDoubleTap || options.tapAlways) {
|
6807 | current.name = name;
|
6808 | inst.trigger(current.name, ev);
|
6809 | }
|
6810 | }
|
6811 |
|
6812 | break;
|
6813 | }
|
6814 | }
|
6815 |
|
6816 | GestureDetector.gestures.Tap = {
|
6817 | name: name,
|
6818 | index: 100,
|
6819 | handler: tapGesture,
|
6820 | defaults: {
|
6821 | /**
|
6822 | * max time of a tap, this is for the slow tappers
|
6823 | * @property tapMaxTime
|
6824 | * @type {Number}
|
6825 | * @default 250
|
6826 | */
|
6827 | tapMaxTime: 250,
|
6828 |
|
6829 | /**
|
6830 | * max distance of movement of a tap, this is for the slow tappers
|
6831 | * @property tapMaxDistance
|
6832 | * @type {Number}
|
6833 | * @default 10
|
6834 | */
|
6835 | tapMaxDistance: 10,
|
6836 |
|
6837 | /**
|
6838 | * always trigger the `tap` event, even while double-tapping
|
6839 | * @property tapAlways
|
6840 | * @type {Boolean}
|
6841 | * @default true
|
6842 | */
|
6843 | tapAlways: true,
|
6844 |
|
6845 | /**
|
6846 | * max distance between two taps
|
6847 | * @property doubleTapDistance
|
6848 | * @type {Number}
|
6849 | * @default 20
|
6850 | */
|
6851 | doubleTapDistance: 20,
|
6852 |
|
6853 | /**
|
6854 | * max time between two taps
|
6855 | * @property doubleTapInterval
|
6856 | * @type {Number}
|
6857 | * @default 300
|
6858 | */
|
6859 | doubleTapInterval: 300
|
6860 | }
|
6861 | };
|
6862 | })('tap');
|
6863 | /**
|
6864 | * @module gestures
|
6865 | */
|
6866 |
|
6867 | /**
|
6868 | * when a touch is being touched at the page
|
6869 | *
|
6870 | * @class Touch
|
6871 | * @static
|
6872 | */
|
6873 |
|
6874 | /**
|
6875 | * @event touch
|
6876 | * @param {Object} ev
|
6877 | */
|
6878 |
|
6879 |
|
6880 | GestureDetector.gestures.Touch = {
|
6881 | name: 'touch',
|
6882 | index: -Infinity,
|
6883 | defaults: {
|
6884 | /**
|
6885 | * call preventDefault at touchstart, and makes the element blocking by disabling the scrolling of the page,
|
6886 | * but it improves gestures like transforming and dragging.
|
6887 | * be careful with using this, it can be very annoying for users to be stuck on the page
|
6888 | * @property preventDefault
|
6889 | * @type {Boolean}
|
6890 | * @default false
|
6891 | */
|
6892 | preventDefault: false,
|
6893 |
|
6894 | /**
|
6895 | * disable mouse events, so only touch (or pen!) input triggers events
|
6896 | * @property preventMouse
|
6897 | * @type {Boolean}
|
6898 | * @default false
|
6899 | */
|
6900 | preventMouse: false
|
6901 | },
|
6902 | handler: function touchGesture(ev, inst) {
|
6903 | if (inst.options.preventMouse && ev.pointerType == POINTER_MOUSE) {
|
6904 | ev.stopDetect();
|
6905 | return;
|
6906 | }
|
6907 |
|
6908 | if (inst.options.preventDefault) {
|
6909 | ev.preventDefault();
|
6910 | }
|
6911 |
|
6912 | if (ev.eventType == EVENT_TOUCH) {
|
6913 | inst.trigger('touch', ev);
|
6914 | }
|
6915 | }
|
6916 | };
|
6917 | /**
|
6918 | * @module gestures
|
6919 | */
|
6920 |
|
6921 | /**
|
6922 | * User want to scale or rotate with 2 fingers
|
6923 | * Preventing the default browser behavior is a good way to improve feel and working. This can be done with the
|
6924 | * `preventDefault` option.
|
6925 | *
|
6926 | * @class Transform
|
6927 | * @static
|
6928 | */
|
6929 |
|
6930 | /**
|
6931 | * @event transform
|
6932 | * @param {Object} ev
|
6933 | */
|
6934 |
|
6935 | /**
|
6936 | * @event transformstart
|
6937 | * @param {Object} ev
|
6938 | */
|
6939 |
|
6940 | /**
|
6941 | * @event transformend
|
6942 | * @param {Object} ev
|
6943 | */
|
6944 |
|
6945 | /**
|
6946 | * @event pinchin
|
6947 | * @param {Object} ev
|
6948 | */
|
6949 |
|
6950 | /**
|
6951 | * @event pinchout
|
6952 | * @param {Object} ev
|
6953 | */
|
6954 |
|
6955 | /**
|
6956 | * @event rotate
|
6957 | * @param {Object} ev
|
6958 | */
|
6959 |
|
6960 | /**
|
6961 | * @param {String} name
|
6962 | */
|
6963 |
|
6964 | (function (name) {
|
6965 | var triggered = false;
|
6966 |
|
6967 | function transformGesture(ev, inst) {
|
6968 | switch (ev.eventType) {
|
6969 | case EVENT_START:
|
6970 | triggered = false;
|
6971 | break;
|
6972 |
|
6973 | case EVENT_MOVE:
|
6974 | // at least multitouch
|
6975 | if (ev.touches.length < 2) {
|
6976 | return;
|
6977 | }
|
6978 |
|
6979 | var scaleThreshold = Math.abs(1 - ev.scale);
|
6980 | var rotationThreshold = Math.abs(ev.rotation); // when the distance we moved is too small we skip this gesture
|
6981 | // or we can be already in dragging
|
6982 |
|
6983 | if (scaleThreshold < inst.options.transformMinScale && rotationThreshold < inst.options.transformMinRotation) {
|
6984 | return;
|
6985 | } // we are transforming!
|
6986 |
|
6987 |
|
6988 | Detection.current.name = name; // first time, trigger dragstart event
|
6989 |
|
6990 | if (!triggered) {
|
6991 | inst.trigger(name + 'start', ev);
|
6992 | triggered = true;
|
6993 | }
|
6994 |
|
6995 | inst.trigger(name, ev); // basic transform event
|
6996 | // trigger rotate event
|
6997 |
|
6998 | if (rotationThreshold > inst.options.transformMinRotation) {
|
6999 | inst.trigger('rotate', ev);
|
7000 | } // trigger pinch event
|
7001 |
|
7002 |
|
7003 | if (scaleThreshold > inst.options.transformMinScale) {
|
7004 | inst.trigger('pinch', ev);
|
7005 | inst.trigger('pinch' + (ev.scale < 1 ? 'in' : 'out'), ev);
|
7006 | }
|
7007 |
|
7008 | break;
|
7009 |
|
7010 | case EVENT_RELEASE:
|
7011 | if (triggered && ev.changedLength < 2) {
|
7012 | inst.trigger(name + 'end', ev);
|
7013 | triggered = false;
|
7014 | }
|
7015 |
|
7016 | break;
|
7017 | }
|
7018 | }
|
7019 |
|
7020 | GestureDetector.gestures.Transform = {
|
7021 | name: name,
|
7022 | index: 45,
|
7023 | defaults: {
|
7024 | /**
|
7025 | * minimal scale factor, no scale is 1, zoomin is to 0 and zoomout until higher then 1
|
7026 | * @property transformMinScale
|
7027 | * @type {Number}
|
7028 | * @default 0.01
|
7029 | */
|
7030 | transformMinScale: 0.01,
|
7031 |
|
7032 | /**
|
7033 | * rotation in degrees
|
7034 | * @property transformMinRotation
|
7035 | * @type {Number}
|
7036 | * @default 1
|
7037 | */
|
7038 | transformMinRotation: 1
|
7039 | },
|
7040 | handler: transformGesture
|
7041 | };
|
7042 | })('transform');
|
7043 |
|
7044 | /*
|
7045 | Copyright 2013-2015 ASIAL CORPORATION
|
7046 |
|
7047 | Licensed under the Apache License, Version 2.0 (the "License");
|
7048 | you may not use this file except in compliance with the License.
|
7049 | You may obtain a copy of the License at
|
7050 |
|
7051 | http://www.apache.org/licenses/LICENSE-2.0
|
7052 |
|
7053 | Unless required by applicable law or agreed to in writing, software
|
7054 | distributed under the License is distributed on an "AS IS" BASIS,
|
7055 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
7056 | See the License for the specific language governing permissions and
|
7057 | limitations under the License.
|
7058 |
|
7059 | */
|
7060 | var readyMap, queueMap;
|
7061 |
|
7062 | function isContentReady(element) {
|
7063 | if (element.childNodes.length > 0) {
|
7064 | setContentReady(element);
|
7065 | }
|
7066 |
|
7067 | return readyMap.has(element);
|
7068 | }
|
7069 |
|
7070 | function setContentReady(element) {
|
7071 | readyMap.set(element, true);
|
7072 | }
|
7073 |
|
7074 | function addCallback(element, fn) {
|
7075 | if (!queueMap.has(element)) {
|
7076 | queueMap.set(element, []);
|
7077 | }
|
7078 |
|
7079 | queueMap.get(element).push(fn);
|
7080 | }
|
7081 |
|
7082 | function consumeQueue(element) {
|
7083 | var callbacks = queueMap.get(element, []) || [];
|
7084 | queueMap.delete(element);
|
7085 | callbacks.forEach(function (callback) {
|
7086 | return callback();
|
7087 | });
|
7088 | }
|
7089 |
|
7090 | function contentReady(element) {
|
7091 | var fn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {};
|
7092 |
|
7093 | if (readyMap === undefined) {
|
7094 | readyMap = new WeakMap();
|
7095 | queueMap = new WeakMap();
|
7096 | }
|
7097 |
|
7098 | addCallback(element, fn);
|
7099 |
|
7100 | if (isContentReady(element)) {
|
7101 | consumeQueue(element);
|
7102 | return;
|
7103 | }
|
7104 |
|
7105 | var observer = new MutationObserver(function (changes) {
|
7106 | setContentReady(element);
|
7107 | consumeQueue(element);
|
7108 | });
|
7109 | observer.observe(element, {
|
7110 | childList: true,
|
7111 | characterData: true
|
7112 | }); // failback for elements has empty content.
|
7113 |
|
7114 | setImmediate(function () {
|
7115 | setContentReady(element);
|
7116 | consumeQueue(element);
|
7117 | });
|
7118 | }
|
7119 |
|
7120 | /*
|
7121 | Copyright 2013-2015 ASIAL CORPORATION
|
7122 |
|
7123 | Licensed under the Apache License, Version 2.0 (the "License");
|
7124 | you may not use this file except in compliance with the License.
|
7125 | You may obtain a copy of the License at
|
7126 |
|
7127 | http://www.apache.org/licenses/LICENSE-2.0
|
7128 |
|
7129 | Unless required by applicable law or agreed to in writing, software
|
7130 | distributed under the License is distributed on an "AS IS" BASIS,
|
7131 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
7132 | See the License for the specific language governing permissions and
|
7133 | limitations under the License.
|
7134 |
|
7135 | */
|
7136 | var ToastQueue = /*#__PURE__*/function () {
|
7137 | function ToastQueue() {
|
7138 | _classCallCheck(this, ToastQueue);
|
7139 |
|
7140 | this.queue = [];
|
7141 | }
|
7142 |
|
7143 | _createClass(ToastQueue, [{
|
7144 | key: "add",
|
7145 | value: function add(fn, promise) {
|
7146 | var _this = this;
|
7147 |
|
7148 | this.queue.push(fn);
|
7149 |
|
7150 | if (this.queue.length === 1) {
|
7151 | setImmediate(this.queue[0]);
|
7152 | }
|
7153 |
|
7154 | promise.then(function () {
|
7155 | _this.queue.shift();
|
7156 |
|
7157 | if (_this.queue.length > 0) {
|
7158 | setTimeout(_this.queue[0], 1000 / 30); // Apply some visual delay
|
7159 | }
|
7160 | });
|
7161 | }
|
7162 | }]);
|
7163 |
|
7164 | return ToastQueue;
|
7165 | }();
|
7166 |
|
7167 | var ToastQueue$1 = new ToastQueue();
|
7168 |
|
7169 | var _setAttributes = function _setAttributes(element, options) {
|
7170 | ['id', 'class', 'animation'].forEach(function (a) {
|
7171 | return Object.prototype.hasOwnProperty.call(options, a) && element.setAttribute(a, options[a]);
|
7172 | });
|
7173 |
|
7174 | if (options.modifier) {
|
7175 | util$4.addModifier(element, options.modifier);
|
7176 | }
|
7177 | };
|
7178 |
|
7179 | var _normalizeArguments = function _normalizeArguments(message) {
|
7180 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
7181 | var defaults = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
7182 | options = _objectSpread2({}, options);
|
7183 | typeof message === 'string' ? options.message = message : options = message;
|
7184 |
|
7185 | if (!options || !options.message && !options.messageHTML) {
|
7186 | util$4.throw('Notifications must contain a message');
|
7187 | }
|
7188 |
|
7189 | if (Object.prototype.hasOwnProperty.call(options, 'buttonLabels') || Object.prototype.hasOwnProperty.call(options, 'buttonLabel')) {
|
7190 | options.buttonLabels = options.buttonLabels || options.buttonLabel;
|
7191 |
|
7192 | if (!Array.isArray(options.buttonLabels)) {
|
7193 | options.buttonLabels = [options.buttonLabels || ''];
|
7194 | }
|
7195 | }
|
7196 |
|
7197 | return util$4.extend({
|
7198 | compile: function compile(param) {
|
7199 | return param;
|
7200 | },
|
7201 | callback: function callback(param) {
|
7202 | return param;
|
7203 | },
|
7204 | animation: 'default',
|
7205 | cancelable: false,
|
7206 | primaryButtonIndex: (options.buttonLabels || defaults.buttonLabels || []).length - 1
|
7207 | }, defaults, options);
|
7208 | };
|
7209 | /**
|
7210 | * @object ons.notification
|
7211 | * @category dialog
|
7212 | * @tutorial vanilla/Reference/notification
|
7213 | * @description
|
7214 | * [en]
|
7215 | * Utility methods to create different kinds of notifications. There are three methods available:
|
7216 | *
|
7217 | * * `ons.notification.alert()`
|
7218 | * * `ons.notification.confirm()`
|
7219 | * * `ons.notification.prompt()`
|
7220 | * * `ons.notification.toast()`
|
7221 | *
|
7222 | * It will automatically display a Material Design dialog on Android devices.
|
7223 | * [/en]
|
7224 | * [ja]いくつかの種類のアラートダイアログを作成するためのユーティリティメソッドを収めたオブジェクトです。[/ja]
|
7225 | * @example
|
7226 | * ons.notification.alert('Hello, world!');
|
7227 | *
|
7228 | * ons.notification.confirm('Are you ready?')
|
7229 | * .then(
|
7230 | * function(answer) {
|
7231 | * if (answer === 1) {
|
7232 | * ons.notification.alert('Let\'s go!');
|
7233 | * }
|
7234 | * }
|
7235 | * );
|
7236 | *
|
7237 | * ons.notification.prompt('How old are ?')
|
7238 | * .then(
|
7239 | * function(age) {
|
7240 | * ons.notification.alert('You are ' + age + ' years old.');
|
7241 | * }
|
7242 | * );
|
7243 | */
|
7244 |
|
7245 |
|
7246 | var notification = {};
|
7247 |
|
7248 | notification._createAlertDialog = function () {
|
7249 | for (var _len = arguments.length, params = new Array(_len), _key = 0; _key < _len; _key++) {
|
7250 | params[_key] = arguments[_key];
|
7251 | }
|
7252 |
|
7253 | return new Promise(function (resolve) {
|
7254 | var options = _normalizeArguments.apply(void 0, params);
|
7255 |
|
7256 | util$4.checkMissingImport('AlertDialog', 'AlertDialogButton'); // Prompt input string
|
7257 |
|
7258 | var inputString = '';
|
7259 |
|
7260 | if (options.isPrompt) {
|
7261 | inputString = "\n <input\n class=\"text-input text-input--underbar\"\n type=\"".concat(options.inputType || 'text', "\"\n placeholder=\"").concat(options.placeholder || '', "\"\n value=\"").concat(options.defaultValue || '', "\"\n style=\"width: 100%; margin-top: 10px;\"\n />\n ");
|
7262 | } // Buttons string
|
7263 |
|
7264 |
|
7265 | var buttons = '';
|
7266 | options.buttonLabels.forEach(function (label, index) {
|
7267 | buttons += "\n <ons-alert-dialog-button\n class=\"\n ".concat(index === options.primaryButtonIndex ? ' alert-dialog-button--primal' : '', "\n ").concat(options.buttonLabels.length <= 2 ? ' alert-dialog-button--rowfooter' : '', "\n \"\n style=\"position: relative;\">\n ").concat(label, "\n </ons-alert-dialog-button>\n ");
|
7268 | }); // Dialog Element
|
7269 |
|
7270 | var el = {};
|
7271 |
|
7272 | var _destroyDialog = function _destroyDialog() {
|
7273 | if (el.dialog.onDialogCancel) {
|
7274 | el.dialog.removeEventListener('dialogcancel', el.dialog.onDialogCancel);
|
7275 | }
|
7276 |
|
7277 | Object.keys(el).forEach(function (key) {
|
7278 | return delete el[key];
|
7279 | });
|
7280 | el = null;
|
7281 |
|
7282 | if (options.destroy instanceof Function) {
|
7283 | options.destroy();
|
7284 | }
|
7285 | };
|
7286 |
|
7287 | el.dialog = document.createElement('ons-alert-dialog');
|
7288 | el.dialog.innerHTML = "\n <div class=\"alert-dialog-mask\"\n style=\"\n ".concat(options.maskColor ? 'background-color: ' + options.maskColor : '', "\n \"></div>\n <div class=\"alert-dialog\">\n <div class=\"alert-dialog-container\">\n <div class=\"alert-dialog-title\">\n ").concat(options.title || '', "\n </div>\n <div class=\"alert-dialog-content\">\n ").concat(options.message || options.messageHTML, "\n ").concat(inputString, "\n </div>\n <div class=\"\n alert-dialog-footer\n ").concat(options.buttonLabels.length <= 2 ? ' alert-dialog-footer--rowfooter' : '', "\n \">\n ").concat(buttons, "\n </div>\n </div>\n </div>\n ");
|
7289 | contentReady(el.dialog); // Set attributes
|
7290 |
|
7291 | _setAttributes(el.dialog, options); // Prompt events
|
7292 |
|
7293 |
|
7294 | if (options.isPrompt) {
|
7295 | el.input = el.dialog.querySelector('.text-input');
|
7296 |
|
7297 | if (options.submitOnEnter) {
|
7298 | el.input.onkeypress = function (event) {
|
7299 | if (event.keyCode === 13) {
|
7300 | el.dialog.hide().then(function () {
|
7301 | if (el) {
|
7302 | var resolveValue = el.input.value;
|
7303 |
|
7304 | _destroyDialog();
|
7305 |
|
7306 | options.callback(resolveValue);
|
7307 | resolve(resolveValue);
|
7308 | }
|
7309 | });
|
7310 | }
|
7311 | };
|
7312 | }
|
7313 | } // Button events
|
7314 |
|
7315 |
|
7316 | el.footer = el.dialog.querySelector('.alert-dialog-footer');
|
7317 | util$4.arrayFrom(el.dialog.querySelectorAll('.alert-dialog-button')).forEach(function (buttonElement, index) {
|
7318 | buttonElement.onclick = function () {
|
7319 | el.dialog.hide().then(function () {
|
7320 | if (el) {
|
7321 | var resolveValue = index;
|
7322 |
|
7323 | if (options.isPrompt) {
|
7324 | resolveValue = index === options.primaryButtonIndex ? el.input.value : null;
|
7325 | }
|
7326 |
|
7327 | el.dialog.remove();
|
7328 |
|
7329 | _destroyDialog();
|
7330 |
|
7331 | options.callback(resolveValue);
|
7332 | resolve(resolveValue);
|
7333 | }
|
7334 | });
|
7335 | };
|
7336 |
|
7337 | el.footer.appendChild(buttonElement);
|
7338 | }); // Cancel events
|
7339 |
|
7340 | if (options.cancelable) {
|
7341 | el.dialog.cancelable = true;
|
7342 |
|
7343 | el.dialog.onDialogCancel = function () {
|
7344 | setImmediate(function () {
|
7345 | el.dialog.remove();
|
7346 |
|
7347 | _destroyDialog();
|
7348 | });
|
7349 | var resolveValue = options.isPrompt ? null : -1;
|
7350 | options.callback(resolveValue);
|
7351 | resolve(resolveValue);
|
7352 | };
|
7353 |
|
7354 | el.dialog.addEventListener('dialogcancel', el.dialog.onDialogCancel, false);
|
7355 | } // Show dialog
|
7356 |
|
7357 |
|
7358 | document.body.appendChild(el.dialog);
|
7359 | options.compile(el.dialog);
|
7360 | setImmediate(function () {
|
7361 | el.dialog.show().then(function () {
|
7362 | if (el.input && options.isPrompt && options.autofocus) {
|
7363 | var strLength = el.input.value.length;
|
7364 | el.input.focus();
|
7365 |
|
7366 | if (el.input.type && ['text', 'search', 'url', 'tel', 'password'].includes(el.input.type)) {
|
7367 | el.input.setSelectionRange(strLength, strLength);
|
7368 | }
|
7369 | }
|
7370 | });
|
7371 | });
|
7372 | });
|
7373 | };
|
7374 | /**
|
7375 | * @method alert
|
7376 | * @signature alert(message [, options] | options)
|
7377 | * @return {Promise}
|
7378 | * [en]Will resolve to the index of the button that was pressed or `-1` when canceled.[/en]
|
7379 | * [ja][/ja]
|
7380 | * @param {String} message
|
7381 | * [en]Notification message. This argument is optional but if it's not defined either `options.message` or `options.messageHTML` must be defined instead.[/en]
|
7382 | * [ja][/ja]
|
7383 | * @param {Object} options
|
7384 | * [en]Parameter object.[/en]
|
7385 | * [ja]オプションを指定するオブジェクトです。[/ja]
|
7386 | * @param {String} [options.message]
|
7387 | * [en]Notification message.[/en]
|
7388 | * [ja]アラートダイアログに表示する文字列を指定します。[/ja]
|
7389 | * @param {String} [options.messageHTML]
|
7390 | * [en]Notification message in HTML.[/en]
|
7391 | * [ja]アラートダイアログに表示するHTMLを指定します。[/ja]
|
7392 | * @param {String | Array} [options.buttonLabels]
|
7393 | * [en]Labels for the buttons. Default is `"OK"`.[/en]
|
7394 | * [ja]確認ボタンのラベルを指定します。"OK"がデフォルトです。[/ja]
|
7395 | * @param {Number} [options.primaryButtonIndex]
|
7396 | * [en]Index of primary button. Default is the last one.[/en]
|
7397 | * [ja]プライマリボタンのインデックスを指定します。デフォルトは 0 です。[/ja]
|
7398 | * @param {Boolean} [options.cancelable]
|
7399 | * [en]Whether the dialog is cancelable or not. Default is `false`. If the dialog is cancelable it can be closed by clicking the background or pressing the Android back button.[/en]
|
7400 | * [ja]ダイアログがキャンセル可能かどうかを指定します。[/ja]
|
7401 | * @param {String} [options.animation]
|
7402 | * [en]Animation name. Available animations are `none` and `fade`. Default is `fade`.[/en]
|
7403 | * [ja]アラートダイアログを表示する際のアニメーション名を指定します。"none", "fade"のいずれかを指定できます。[/ja]
|
7404 | * @param {String} [options.id]
|
7405 | * [en]The `<ons-alert-dialog>` element's ID.[/en]
|
7406 | * [ja]ons-alert-dialog要素のID。[/ja]
|
7407 | * @param {String} [options.class]
|
7408 | * [en]The `<ons-alert-dialog>` element's class.[/en]
|
7409 | * [ja]ons-alert-dialog要素のclass。[/ja]
|
7410 | * @param {String} [options.title]
|
7411 | * [en]Dialog title. Default is `"Alert"`.[/en]
|
7412 | * [ja]アラートダイアログの上部に表示するタイトルを指定します。"Alert"がデフォルトです。[/ja]
|
7413 | * @param {String} [options.modifier]
|
7414 | * [en]Modifier for the dialog.[/en]
|
7415 | * [ja]アラートダイアログのmodifier属性の値を指定します。[/ja]
|
7416 | * @param {String} [options.maskColor]
|
7417 | * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)" ("rgba(0, 0, 0, 0.3)" for Material).[/en]
|
7418 | * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
|
7419 | * @param {Function} [options.callback]
|
7420 | * [en]Function that executes after dialog has been closed.[/en]
|
7421 | * [ja]アラートダイアログが閉じられた時に呼び出される関数オブジェクトを指定します。[/ja]
|
7422 | * @description
|
7423 | * [en]
|
7424 | * Display an alert dialog to show the user a message.
|
7425 | *
|
7426 | * The content of the message can be either simple text or HTML.
|
7427 | *
|
7428 | * It can be called in the following ways:
|
7429 | *
|
7430 | * ```
|
7431 | * ons.notification.alert(message, options);
|
7432 | * ons.notification.alert(options);
|
7433 | * ```
|
7434 | *
|
7435 | * Must specify either `message` or `messageHTML`.
|
7436 | * [/en]
|
7437 | * [ja]
|
7438 | * ユーザーへメッセージを見せるためのアラートダイアログを表示します。
|
7439 | * 表示するメッセージは、テキストかもしくはHTMLを指定できます。
|
7440 | * このメソッドの引数には、options.messageもしくはoptions.messageHTMLのどちらかを必ず指定する必要があります。
|
7441 | * [/ja]
|
7442 | */
|
7443 |
|
7444 |
|
7445 | notification.alert = function (message, options) {
|
7446 | return notification._createAlertDialog(message, options, {
|
7447 | buttonLabels: ['OK'],
|
7448 | title: 'Alert'
|
7449 | });
|
7450 | };
|
7451 | /**
|
7452 | * @method confirm
|
7453 | * @signature confirm(message [, options] | options)
|
7454 | * @return {Promise}
|
7455 | * [en]Will resolve to the index of the button that was pressed or `-1` when canceled.[/en]
|
7456 | * [ja][/ja]
|
7457 | * @param {String} message
|
7458 | * [en]Notification message. This argument is optional but if it's not defined either `options.message` or `options.messageHTML` must be defined instead.[/en]
|
7459 | * [ja][/ja]
|
7460 | * @param {Object} options
|
7461 | * [en]Parameter object.[/en]
|
7462 | * @param {Array} [options.buttonLabels]
|
7463 | * [en]Labels for the buttons. Default is `["Cancel", "OK"]`.[/en]
|
7464 | * [ja]ボタンのラベルの配列を指定します。["Cancel", "OK"]がデフォルトです。[/ja]
|
7465 | * @param {Number} [options.primaryButtonIndex]
|
7466 | * [en]Index of primary button. Default is the last one.[/en]
|
7467 | * [ja]プライマリボタンのインデックスを指定します。デフォルトは 1 です。[/ja]
|
7468 | * @description
|
7469 | * [en]
|
7470 | * Display a dialog to ask the user for confirmation. Extends `alert()` parameters.
|
7471 | * The default button labels are `"Cancel"` and `"OK"` but they can be customized.
|
7472 | *
|
7473 | * It can be called in the following ways:
|
7474 | *
|
7475 | * ```
|
7476 | * ons.notification.confirm(message, options);
|
7477 | * ons.notification.confirm(options);
|
7478 | * ```
|
7479 | *
|
7480 | * Must specify either `message` or `messageHTML`.
|
7481 | * [/en]
|
7482 | * [ja]
|
7483 | * ユーザに確認を促すダイアログを表示します。
|
7484 | * デオルとのボタンラベルは、"Cancel"と"OK"ですが、これはこのメソッドの引数でカスタマイズできます。
|
7485 | * このメソッドの引数には、options.messageもしくはoptions.messageHTMLのどちらかを必ず指定する必要があります。
|
7486 | * [/ja]
|
7487 | */
|
7488 |
|
7489 |
|
7490 | notification.confirm = function (message, options) {
|
7491 | return notification._createAlertDialog(message, options, {
|
7492 | buttonLabels: ['Cancel', 'OK'],
|
7493 | title: 'Confirm'
|
7494 | });
|
7495 | };
|
7496 | /**
|
7497 | * @method prompt
|
7498 | * @signature prompt(message [, options] | options)
|
7499 | * @param {String} message
|
7500 | * [en]Notification message. This argument is optional but if it's not defined either `options.message` or `options.messageHTML` must be defined instead.[/en]
|
7501 | * [ja][/ja]
|
7502 | * @return {Promise}
|
7503 | * [en]Will resolve to the input value when the dialog is closed or `null` when canceled.[/en]
|
7504 | * [ja][/ja]
|
7505 | * @param {Object} options
|
7506 | * [en]Parameter object.[/en]
|
7507 | * [ja]オプションを指定するオブジェクトです。[/ja]
|
7508 | * @param {String | Array} [options.buttonLabels]
|
7509 | * [en]Labels for the buttons. Default is `"OK"`.[/en]
|
7510 | * [ja]確認ボタンのラベルを指定します。"OK"がデフォルトです。[/ja]
|
7511 | * @param {Number} [options.primaryButtonIndex]
|
7512 | * [en]Index of primary button. Default is the last one.[/en]
|
7513 | * [ja]プライマリボタンのインデックスを指定します。デフォルトは 0 です。[/ja]
|
7514 | * @param {String} [options.placeholder]
|
7515 | * [en]Placeholder for the text input.[/en]
|
7516 | * [ja]テキスト欄のプレースホルダに表示するテキストを指定します。[/ja]
|
7517 | * @param {String} [options.defaultValue]
|
7518 | * [en]Default value for the text input.[/en]
|
7519 | * [ja]テキスト欄のデフォルトの値を指定します。[/ja]
|
7520 | * @param {String} [options.inputType]
|
7521 | * [en]Type of the input element (`password`, `date`...). Default is `text`.[/en]
|
7522 | * [ja][/ja]
|
7523 | * @param {Boolean} [options.autofocus]
|
7524 | * [en]Autofocus the input element. Default is `true`. In Cordova, `KeyboardDisplayRequiresUserAction` in `config.xml` must be `false` to activate this feature.[/en]
|
7525 | * [ja]input要素に自動的にフォーカスするかどうかを指定します。デフォルトはtrueです。Cordova環境では、この機能を有効にするためには `config.xml` で `KeyboardDisplayRequiresUserAction` を `false` に設定する必要があります。[/ja]
|
7526 | * @param {Boolean} [options.submitOnEnter]
|
7527 | * [en]Submit automatically when enter is pressed. Default is `true`.[/en]
|
7528 | * [ja]Enterが押された際にそのformをsubmitするかどうかを指定します。デフォルトはtrueです。[/ja]
|
7529 | * @description
|
7530 | * [en]
|
7531 | * Display a dialog with a prompt to ask the user a question. Extends `alert()` parameters.
|
7532 | *
|
7533 | * It can be called in the following ways:
|
7534 | *
|
7535 | * ```
|
7536 | * ons.notification.prompt(message, options);
|
7537 | * ons.notification.prompt(options);
|
7538 | * ```
|
7539 | *
|
7540 | * Must specify either `message` or `messageHTML`.
|
7541 | * [/en]
|
7542 | * [ja]
|
7543 | * ユーザーに入力を促すダイアログを表示します。
|
7544 | * このメソッドの引数には、options.messageもしくはoptions.messageHTMLのどちらかを必ず指定する必要があります。
|
7545 | * [/ja]
|
7546 | */
|
7547 |
|
7548 |
|
7549 | notification.prompt = function (message, options) {
|
7550 | return notification._createAlertDialog(message, options, {
|
7551 | buttonLabels: ['OK'],
|
7552 | title: 'Alert',
|
7553 | isPrompt: true,
|
7554 | autofocus: true,
|
7555 | submitOnEnter: true
|
7556 | });
|
7557 | };
|
7558 | /**
|
7559 | * @method toast
|
7560 | * @signature toast(message [, options] | options)
|
7561 | * @return {Promise}
|
7562 | * [en]Will resolve when the toast is hidden.[/en]
|
7563 | * [ja][/ja]
|
7564 | * @param {String} message
|
7565 | * [en]Toast message. This argument is optional but if it's not defined then `options.message` must be defined instead.[/en]
|
7566 | * [ja][/ja]
|
7567 | * @param {Object} options
|
7568 | * [en]Parameter object.[/en]
|
7569 | * [ja]オプションを指定するオブジェクトです。[/ja]
|
7570 | * @param {String} [options.message]
|
7571 | * [en]Notification message.[/en]
|
7572 | * [ja]トーストに表示する文字列を指定します。[/ja]
|
7573 | * @param {String} [options.buttonLabel]
|
7574 | * [en]Label for the button.[/en]
|
7575 | * [ja]確認ボタンのラベルを指定します。[/ja]
|
7576 | * @param {String} [options.animation]
|
7577 | * [en]Animation name. Available animations are `none`, `fade`, `ascend`, `lift` and `fall`. Default is `ascend` for Android and `lift` for iOS.[/en]
|
7578 | * [ja]トーストを表示する際のアニメーション名を指定します。"none", "fade", "ascend", "lift", "fall"のいずれかを指定できます。[/ja]
|
7579 | * @param {Number} [options.timeout]
|
7580 | * [en]Number of miliseconds where the toast is visible before hiding automatically.[/en]
|
7581 | * [ja][/ja]
|
7582 | * @param {Boolean} [options.force]
|
7583 | * [en]If `true`, the toast skips the notification queue and is shown immediately. Defaults to `false`.[/en]
|
7584 | * [ja][/ja]
|
7585 | * @param {String} [options.id]
|
7586 | * [en]The `<ons-toast>` element's ID.[/en]
|
7587 | * [ja]ons-toast要素のID。[/ja]
|
7588 | * @param {String} [options.class]
|
7589 | * [en]The `<ons-toast>` element's class.[/en]
|
7590 | * [ja]ons-toast要素のclass。[/ja]
|
7591 | * @param {String} [options.modifier]
|
7592 | * [en]Modifier for the element.[/en]
|
7593 | * [ja]トーストのmodifier属性の値を指定します。[/ja]
|
7594 | * @param {Function} [options.callback]
|
7595 | * [en]Function that executes after toast has been hidden.[/en]
|
7596 | * [ja]トーストが閉じられた時に呼び出される関数オブジェクトを指定します。[/ja]
|
7597 | * @description
|
7598 | * [en]
|
7599 | * Display a simple notification toast with an optional button that can be used for simple actions.
|
7600 | *
|
7601 | * It can be called in the following ways:
|
7602 | *
|
7603 | * ```
|
7604 | * ons.notification.toast(message, options);
|
7605 | * ons.notification.toast(options);
|
7606 | * ```
|
7607 | * [/en]
|
7608 | * [ja][/ja]
|
7609 | */
|
7610 |
|
7611 |
|
7612 | notification.toast = function (message, options) {
|
7613 | var promise = new Promise(function (resolve) {
|
7614 | util$4.checkMissingImport('Toast'); // Throws error, must be inside promise
|
7615 |
|
7616 | options = _normalizeArguments(message, options, {
|
7617 | timeout: 0,
|
7618 | force: false
|
7619 | });
|
7620 | var toast = util$4.createElement("\n <ons-toast>\n ".concat(options.message, "\n ").concat(options.buttonLabels ? "<button>".concat(options.buttonLabels[0], "</button>") : '', "\n </ons-toast>\n "));
|
7621 |
|
7622 | _setAttributes(toast, options);
|
7623 |
|
7624 | var originalHide = toast.hide.bind(toast);
|
7625 |
|
7626 | var finish = function finish(value) {
|
7627 | if (toast) {
|
7628 | originalHide().then(function () {
|
7629 | if (toast) {
|
7630 | toast.remove();
|
7631 | toast = null;
|
7632 | options.callback(value);
|
7633 | resolve(value);
|
7634 | }
|
7635 | });
|
7636 | }
|
7637 | };
|
7638 |
|
7639 | if (options.buttonLabels) {
|
7640 | util$4.findChild(toast._toast, 'button').onclick = function () {
|
7641 | return finish(0);
|
7642 | };
|
7643 | } // overwrite so that ons.notification.hide resolves when toast.hide is called
|
7644 |
|
7645 |
|
7646 | toast.hide = function () {
|
7647 | return finish(-1);
|
7648 | };
|
7649 |
|
7650 | document.body.appendChild(toast);
|
7651 | options.compile(toast);
|
7652 |
|
7653 | var show = function show() {
|
7654 | toast.parentElement && toast.show(options).then(function () {
|
7655 | if (options.timeout) {
|
7656 | setTimeout(function () {
|
7657 | return finish(-1);
|
7658 | }, options.timeout);
|
7659 | }
|
7660 | });
|
7661 | };
|
7662 |
|
7663 | setImmediate(function () {
|
7664 | return options.force ? show() : ToastQueue$1.add(show, promise);
|
7665 | });
|
7666 | });
|
7667 | return promise;
|
7668 | };
|
7669 |
|
7670 | var checkOptions = function checkOptions(options) {
|
7671 | var err = function err(prop) {
|
7672 | var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'Function';
|
7673 | return util$4.throw("\"options.".concat(prop, "\" must be an instance of ").concat(type));
|
7674 | };
|
7675 |
|
7676 | var hasOwnProperty = function hasOwnProperty(prop) {
|
7677 | return Object.hasOwnProperty.call(options, prop);
|
7678 | };
|
7679 |
|
7680 | var instanceOf = function instanceOf(prop) {
|
7681 | var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Function;
|
7682 | return options[prop] instanceof type;
|
7683 | };
|
7684 |
|
7685 | var b = 'buttons',
|
7686 | cb = 'callback',
|
7687 | c = 'compile',
|
7688 | d = 'destroy';
|
7689 | (!hasOwnProperty(b) || !instanceOf(b, Array)) && err(b, 'Array');
|
7690 | hasOwnProperty(cb) && !instanceOf(cb) && err(cb);
|
7691 | hasOwnProperty(c) && !instanceOf(c) && err(c);
|
7692 | hasOwnProperty(d) && !instanceOf(d) && err(d);
|
7693 | }; // Action Sheet
|
7694 |
|
7695 |
|
7696 | var actionSheet = (function () {
|
7697 | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
7698 | return new Promise(function (resolve) {
|
7699 | util$4.checkMissingImport('ActionSheet');
|
7700 | checkOptions(options); // Main component
|
7701 |
|
7702 | var actionSheet = util$4.createElement("\n <ons-action-sheet\n ".concat(options.title ? "title=\"".concat(options.title, "\"") : '', "\n ").concat(options.cancelable ? 'cancelable' : '', "\n ").concat(options.modifier ? "modifier=\"".concat(options.modifier, "\"") : '', "\n ").concat(options.maskColor ? "mask-color=\"".concat(options.maskColor, "\"") : '', "\n ").concat(options.id ? "id=\"".concat(options.id, "\"") : '', "\n ").concat(options.class ? "class=\"".concat(options.class, "\"") : '', "\n >\n <div class=\"action-sheet\"></div>\n </ons-action-sheet>\n ")); // Resolve action and clean up
|
7703 |
|
7704 | var finish = function finish(event) {
|
7705 | var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : -1;
|
7706 |
|
7707 | if (actionSheet) {
|
7708 | options.destroy && options.destroy(actionSheet);
|
7709 | actionSheet.removeEventListener('dialogcancel', finish, false);
|
7710 | actionSheet.remove();
|
7711 | actionSheet = null;
|
7712 | options.callback && options.callback(index);
|
7713 | resolve(index);
|
7714 | }
|
7715 | }; // Link cancel handler
|
7716 |
|
7717 |
|
7718 | actionSheet.addEventListener('dialogcancel', finish, false); // Create buttons and link action handler
|
7719 |
|
7720 | var buttons = document.createDocumentFragment();
|
7721 | options.buttons.forEach(function (item, index) {
|
7722 | var buttonOptions = typeof item === 'string' ? {
|
7723 | label: item
|
7724 | } : _objectSpread2({}, item);
|
7725 |
|
7726 | if (options.destructive === index) {
|
7727 | buttonOptions.modifier = (buttonOptions.modifier || '') + ' destructive';
|
7728 | }
|
7729 |
|
7730 | var button = util$4.createElement("\n <ons-action-sheet-button\n ".concat(buttonOptions.icon ? "icon=\"".concat(buttonOptions.icon, "\"") : '', "\n ").concat(buttonOptions.modifier ? "modifier=\"".concat(buttonOptions.modifier, "\"") : '', "\n >\n ").concat(buttonOptions.label, "\n </ons-action-sheet-button>\n "));
|
7731 |
|
7732 | button.onclick = function (event) {
|
7733 | return actionSheet.hide().then(function () {
|
7734 | return finish(event, index);
|
7735 | });
|
7736 | };
|
7737 |
|
7738 | buttons.appendChild(button);
|
7739 | }); // Finish component and attach
|
7740 |
|
7741 | util$4.findChild(actionSheet, '.action-sheet').appendChild(buttons);
|
7742 | document.body.appendChild(actionSheet);
|
7743 | options.compile && options.compile(el.dialog); // Show
|
7744 |
|
7745 | setImmediate(function () {
|
7746 | return actionSheet.show({
|
7747 | animation: options.animation,
|
7748 | animationOptions: options.animationOptions
|
7749 | });
|
7750 | });
|
7751 | });
|
7752 | });
|
7753 |
|
7754 | /*
|
7755 | Copyright 2013-2015 ASIAL CORPORATION
|
7756 |
|
7757 | Licensed under the Apache License, Version 2.0 (the "License");
|
7758 | you may not use this file except in compliance with the License.
|
7759 | You may obtain a copy of the License at
|
7760 |
|
7761 | http://www.apache.org/licenses/LICENSE-2.0
|
7762 |
|
7763 | Unless required by applicable law or agreed to in writing, software
|
7764 | distributed under the License is distributed on an "AS IS" BASIS,
|
7765 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
7766 | See the License for the specific language governing permissions and
|
7767 | limitations under the License.
|
7768 |
|
7769 | */
|
7770 |
|
7771 | var create = function create() {
|
7772 | /**
|
7773 | * @object ons.orientation
|
7774 | * @category util
|
7775 | * @description
|
7776 | * [en]Utility methods for orientation detection.[/en]
|
7777 | * [ja]画面のオリエンテーション検知のためのユーティリティメソッドを収めているオブジェクトです。[/ja]
|
7778 | */
|
7779 | var obj = {
|
7780 | /**
|
7781 | * @event change
|
7782 | * @description
|
7783 | * [en]Fired when the device orientation changes.[/en]
|
7784 | * [ja]デバイスのオリエンテーションが変化した際に発火します。[/ja]
|
7785 | * @param {Object} event
|
7786 | * [en]Event object.[/en]
|
7787 | * [ja]イベントオブジェクトです。[/ja]
|
7788 | * @param {Boolean} event.isPortrait
|
7789 | * [en]Will be true if the current orientation is portrait mode.[/en]
|
7790 | * [ja]現在のオリエンテーションがportraitの場合にtrueを返します。[/ja]
|
7791 | */
|
7792 |
|
7793 | /**
|
7794 | * @method on
|
7795 | * @signature on(eventName, listener)
|
7796 | * @description
|
7797 | * [en]Add an event listener.[/en]
|
7798 | * [ja]イベントリスナーを追加します。[/ja]
|
7799 | * @param {String} eventName
|
7800 | * [en]Name of the event.[/en]
|
7801 | * [ja]イベント名を指定します。[/ja]
|
7802 | * @param {Function} listener
|
7803 | * [en]Function to execute when the event is triggered.[/en]
|
7804 | * [ja]このイベントが発火された際に呼び出される関数オブジェクトを指定します。[/ja]
|
7805 | */
|
7806 |
|
7807 | /**
|
7808 | * @method once
|
7809 | * @signature once(eventName, listener)
|
7810 | * @description
|
7811 | * [en]Add an event listener that's only triggered once.[/en]
|
7812 | * [ja]一度だけ呼び出されるイベントリスナーを追加します。[/ja]
|
7813 | * @param {String} eventName
|
7814 | * [en]Name of the event.[/en]
|
7815 | * [ja]イベント名を指定します。[/ja]
|
7816 | * @param {Function} listener
|
7817 | * [en]Function to execute when the event is triggered.[/en]
|
7818 | * [ja]イベントが発火した際に呼び出される関数オブジェクトを指定します。[/ja]
|
7819 | */
|
7820 |
|
7821 | /**
|
7822 | * @method off
|
7823 | * @signature off(eventName, [listener])
|
7824 | * @description
|
7825 | * [en]Remove an event listener. If the listener is not specified all listeners for the event type will be removed.[/en]
|
7826 | * [ja]イベントリスナーを削除します。もしイベントリスナーを指定しなかった場合には、そのイベントに紐づく全てのイベントリスナーが削除されます。[/ja]
|
7827 | * @param {String} eventName
|
7828 | * [en]Name of the event.[/en]
|
7829 | * [ja]イベント名を指定します。[/ja]
|
7830 | * @param {Function} listener
|
7831 | * [en]Function to execute when the event is triggered.[/en]
|
7832 | * [ja]削除するイベントリスナーを指定します。[/ja]
|
7833 | */
|
7834 | // actual implementation to detect if whether current screen is portrait or not
|
7835 | _isPortrait: false,
|
7836 |
|
7837 | /**
|
7838 | * @method isPortrait
|
7839 | * @signature isPortrait()
|
7840 | * @return {Boolean}
|
7841 | * [en]Will be true if the current orientation is portrait mode.[/en]
|
7842 | * [ja]オリエンテーションがportraitモードの場合にtrueになります。[/ja]
|
7843 | * @description
|
7844 | * [en]Returns whether the current screen orientation is portrait or not.[/en]
|
7845 | * [ja]オリエンテーションがportraitモードかどうかを返します。[/ja]
|
7846 | */
|
7847 | isPortrait: function isPortrait() {
|
7848 | return this._isPortrait();
|
7849 | },
|
7850 |
|
7851 | /**
|
7852 | * @method isLandscape
|
7853 | * @signature isLandscape()
|
7854 | * @return {Boolean}
|
7855 | * [en]Will be true if the current orientation is landscape mode.[/en]
|
7856 | * [ja]オリエンテーションがlandscapeモードの場合にtrueになります。[/ja]
|
7857 | * @description
|
7858 | * [en]Returns whether the current screen orientation is landscape or not.[/en]
|
7859 | * [ja]オリエンテーションがlandscapeモードかどうかを返します。[/ja]
|
7860 | */
|
7861 | isLandscape: function isLandscape() {
|
7862 | return !this.isPortrait();
|
7863 | },
|
7864 | _init: function _init() {
|
7865 | document.addEventListener('DOMContentLoaded', this._onDOMContentLoaded.bind(this), false);
|
7866 |
|
7867 | if ('orientation' in window) {
|
7868 | window.addEventListener('orientationchange', this._onOrientationChange.bind(this), false);
|
7869 | } else {
|
7870 | window.addEventListener('resize', this._onResize.bind(this), false);
|
7871 | }
|
7872 |
|
7873 | this._isPortrait = function () {
|
7874 | return window.innerHeight > window.innerWidth;
|
7875 | };
|
7876 |
|
7877 | return this;
|
7878 | },
|
7879 | _onDOMContentLoaded: function _onDOMContentLoaded() {
|
7880 | this._installIsPortraitImplementation();
|
7881 |
|
7882 | this.emit('change', {
|
7883 | isPortrait: this.isPortrait()
|
7884 | });
|
7885 | },
|
7886 | _installIsPortraitImplementation: function _installIsPortraitImplementation() {
|
7887 | var isPortrait = window.innerWidth < window.innerHeight;
|
7888 |
|
7889 | if (!('orientation' in window)) {
|
7890 | this._isPortrait = function () {
|
7891 | return window.innerHeight > window.innerWidth;
|
7892 | };
|
7893 | } else if (window.orientation % 180 === 0) {
|
7894 | this._isPortrait = function () {
|
7895 | return Math.abs(window.orientation % 180) === 0 ? isPortrait : !isPortrait;
|
7896 | };
|
7897 | } else {
|
7898 | this._isPortrait = function () {
|
7899 | return Math.abs(window.orientation % 180) === 90 ? isPortrait : !isPortrait;
|
7900 | };
|
7901 | }
|
7902 | },
|
7903 | _onOrientationChange: function _onOrientationChange() {
|
7904 | var _this = this;
|
7905 |
|
7906 | var isPortrait = this._isPortrait(); // Wait for the dimensions to change because
|
7907 | // of Android inconsistency.
|
7908 |
|
7909 |
|
7910 | var nIter = 0;
|
7911 | var interval = setInterval(function () {
|
7912 | nIter++;
|
7913 | var w = window.innerWidth;
|
7914 | var h = window.innerHeight;
|
7915 |
|
7916 | if (isPortrait && w <= h || !isPortrait && w >= h) {
|
7917 | _this.emit('change', {
|
7918 | isPortrait: isPortrait
|
7919 | });
|
7920 |
|
7921 | clearInterval(interval);
|
7922 | } else if (nIter === 50) {
|
7923 | _this.emit('change', {
|
7924 | isPortrait: isPortrait
|
7925 | });
|
7926 |
|
7927 | clearInterval(interval);
|
7928 | }
|
7929 | }, 20);
|
7930 | },
|
7931 | // Run on not mobile browser.
|
7932 | _onResize: function _onResize() {
|
7933 | this.emit('change', {
|
7934 | isPortrait: this.isPortrait()
|
7935 | });
|
7936 | }
|
7937 | };
|
7938 | MicroEvent.mixin(obj);
|
7939 | return obj;
|
7940 | };
|
7941 |
|
7942 | var orientation = create()._init();
|
7943 |
|
7944 | /*
|
7945 | Copyright 2013-2015 ASIAL CORPORATION
|
7946 |
|
7947 | Licensed under the Apache License, Version 2.0 (the "License");
|
7948 | you may not use this file except in compliance with the License.
|
7949 | You may obtain a copy of the License at
|
7950 |
|
7951 | http://www.apache.org/licenses/LICENSE-2.0
|
7952 |
|
7953 | Unless required by applicable law or agreed to in writing, software
|
7954 | distributed under the License is distributed on an "AS IS" BASIS,
|
7955 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
7956 | See the License for the specific language governing permissions and
|
7957 | limitations under the License.
|
7958 |
|
7959 | */
|
7960 | /**
|
7961 | * @object ons.modifier
|
7962 | * @category visual
|
7963 | * @description
|
7964 | * [en]
|
7965 | * Utility methods to change modifier attributes of Onsen UI elements..
|
7966 | * [/en]
|
7967 | * [ja][/ja]
|
7968 | * @example
|
7969 | * ons.modifier.add(myOnsInputElement, 'underbar');
|
7970 | * ons.modifier.toggle(myOnsToastElement, 'custom-modifier');
|
7971 | *
|
7972 | */
|
7973 |
|
7974 | var modifier = {
|
7975 | /**
|
7976 | * @method add
|
7977 | * @signature add(element, modifier [, modifier])
|
7978 | * @description
|
7979 | * [en]Add the specified modifiers to the element if they are not already included.[/en]
|
7980 | * [ja][/ja]
|
7981 | * @param {HTMLElement} element
|
7982 | * [en]Target element.[/en]
|
7983 | * [ja][/ja]
|
7984 | * @param {String} modifier
|
7985 | * [en]Name of the modifier.[/en]
|
7986 | * [ja][/ja]
|
7987 | */
|
7988 | add: function add(element) {
|
7989 | for (var _len = arguments.length, modifiers = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
7990 | modifiers[_key - 1] = arguments[_key];
|
7991 | }
|
7992 |
|
7993 | return modifiers.forEach(function (modifier) {
|
7994 | return util$4.addModifier(element, modifier);
|
7995 | });
|
7996 | },
|
7997 |
|
7998 | /**
|
7999 | * @method remove
|
8000 | * @signature remove(element, modifier [, modifier])
|
8001 | * @description
|
8002 | * [en]Remove the specified modifiers from the element if they are included.[/en]
|
8003 | * [ja][/ja]
|
8004 | * @param {HTMLElement} element
|
8005 | * [en]Target element.[/en]
|
8006 | * [ja][/ja]
|
8007 | * @param {String} modifier
|
8008 | * [en]Name of the modifier.[/en]
|
8009 | * [ja][/ja]
|
8010 | */
|
8011 | remove: function remove(element) {
|
8012 | for (var _len2 = arguments.length, modifiers = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
|
8013 | modifiers[_key2 - 1] = arguments[_key2];
|
8014 | }
|
8015 |
|
8016 | return modifiers.forEach(function (modifier) {
|
8017 | return util$4.removeModifier(element, modifier);
|
8018 | });
|
8019 | },
|
8020 |
|
8021 | /**
|
8022 | * @method contains
|
8023 | * @signature contains(element, modifier)
|
8024 | * @description
|
8025 | * [en]Check whether the specified modifier is included in the element.[/en]
|
8026 | * [ja][/ja]
|
8027 | * @param {HTMLElement} element
|
8028 | * [en]Target element.[/en]
|
8029 | * [ja][/ja]
|
8030 | * @param {String} modifier
|
8031 | * [en]Name of the modifier.[/en]
|
8032 | * [ja][/ja]
|
8033 | * @return {Boolean}
|
8034 | * [en]`true` when the specified modifier is found in the element's `modifier` attribute. `false` otherwise.[/en]
|
8035 | * [ja][/ja]
|
8036 | */
|
8037 | contains: util$4.hasModifier,
|
8038 |
|
8039 | /**
|
8040 | * @method toggle
|
8041 | * @signature toggle(element, modifier [, force])
|
8042 | * @description
|
8043 | * [en]Toggle the specified modifier.[/en]
|
8044 | * [ja][/ja]
|
8045 | * @param {HTMLElement} element
|
8046 | * [en]Target element.[/en]
|
8047 | * [ja][/ja]
|
8048 | * @param {String} modifier
|
8049 | * [en]Name of the modifier.[/en]
|
8050 | * [ja][/ja]
|
8051 | * @param {String} force
|
8052 | * [en]If it evaluates to true, add specified modifier value, and if it evaluates to false, remove it.[/en]
|
8053 | * [ja][/ja]
|
8054 | */
|
8055 | toggle: util$4.toggleModifier
|
8056 | };
|
8057 |
|
8058 | /*
|
8059 | Copyright 2013-2015 ASIAL CORPORATION
|
8060 |
|
8061 | Licensed under the Apache License, Version 2.0 (the "License");
|
8062 | you may not use this file except in compliance with the License.
|
8063 | You may obtain a copy of the License at
|
8064 |
|
8065 | http://www.apache.org/licenses/LICENSE-2.0
|
8066 |
|
8067 | Unless required by applicable law or agreed to in writing, software
|
8068 | distributed under the License is distributed on an "AS IS" BASIS,
|
8069 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
8070 | See the License for the specific language governing permissions and
|
8071 | limitations under the License.
|
8072 |
|
8073 | */
|
8074 | var softwareKeyboard = new MicroEvent();
|
8075 | softwareKeyboard._visible = false;
|
8076 |
|
8077 | var onShow = function onShow() {
|
8078 | softwareKeyboard._visible = true;
|
8079 | softwareKeyboard.emit('show');
|
8080 | };
|
8081 |
|
8082 | var onHide = function onHide() {
|
8083 | softwareKeyboard._visible = false;
|
8084 | softwareKeyboard.emit('hide');
|
8085 | };
|
8086 |
|
8087 | var bindEvents = function bindEvents() {
|
8088 | if (typeof Keyboard !== 'undefined') {
|
8089 | // https://github.com/martinmose/cordova-keyboard/blob/95f3da3a38d8f8e1fa41fbf40145352c13535a00/README.md
|
8090 | Keyboard.onshow = onShow;
|
8091 | Keyboard.onhide = onHide;
|
8092 | softwareKeyboard.emit('init', {
|
8093 | visible: Keyboard.isVisible
|
8094 | });
|
8095 | return true;
|
8096 | } else if (typeof cordova.plugins !== 'undefined' && typeof cordova.plugins.Keyboard !== 'undefined') {
|
8097 | // https://github.com/driftyco/ionic-plugins-keyboard/blob/ca27ecf/README.md
|
8098 | window.addEventListener('native.keyboardshow', onShow);
|
8099 | window.addEventListener('native.keyboardhide', onHide);
|
8100 | softwareKeyboard.emit('init', {
|
8101 | visible: cordova.plugins.Keyboard.isVisible
|
8102 | });
|
8103 | return true;
|
8104 | }
|
8105 |
|
8106 | return false;
|
8107 | };
|
8108 |
|
8109 | var noPluginError = function noPluginError() {
|
8110 | util$4.warn('ons-keyboard: Cordova Keyboard plugin is not present.');
|
8111 | };
|
8112 |
|
8113 | document.addEventListener('deviceready', function () {
|
8114 | if (!bindEvents()) {
|
8115 | if (document.querySelector('[ons-keyboard-active]') || document.querySelector('[ons-keyboard-inactive]')) {
|
8116 | noPluginError();
|
8117 | }
|
8118 |
|
8119 | softwareKeyboard.on = noPluginError;
|
8120 | }
|
8121 | });
|
8122 |
|
8123 | /*
|
8124 | Copyright 2013-2015 ASIAL CORPORATION
|
8125 |
|
8126 | Licensed under the Apache License, Version 2.0 (the "License");
|
8127 | you may not use this file except in compliance with the License.
|
8128 | You may obtain a copy of the License at
|
8129 |
|
8130 | http://www.apache.org/licenses/LICENSE-2.0
|
8131 |
|
8132 | Unless required by applicable law or agreed to in writing, software
|
8133 | distributed under the License is distributed on an "AS IS" BASIS,
|
8134 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
8135 | See the License for the specific language governing permissions and
|
8136 | limitations under the License.
|
8137 |
|
8138 | */
|
8139 | var generateId$1 = function () {
|
8140 | var i = 0;
|
8141 | return function () {
|
8142 | return i++;
|
8143 | };
|
8144 | }();
|
8145 | /**
|
8146 | * Door locking system.
|
8147 | *
|
8148 | * @param {Object} [options]
|
8149 | * @param {Function} [options.log]
|
8150 | */
|
8151 |
|
8152 |
|
8153 | var DoorLock = /*#__PURE__*/function () {
|
8154 | function DoorLock() {
|
8155 | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
8156 |
|
8157 | _classCallCheck(this, DoorLock);
|
8158 |
|
8159 | this._lockList = [];
|
8160 | this._waitList = [];
|
8161 |
|
8162 | this._log = options.log || function () {};
|
8163 | }
|
8164 | /**
|
8165 | * Register a lock.
|
8166 | *
|
8167 | * @return {Function} Callback for unlocking.
|
8168 | */
|
8169 |
|
8170 |
|
8171 | _createClass(DoorLock, [{
|
8172 | key: "lock",
|
8173 | value: function lock() {
|
8174 | var _this = this;
|
8175 |
|
8176 | var unlock = function unlock() {
|
8177 | _this._unlock(unlock);
|
8178 | };
|
8179 |
|
8180 | unlock.id = generateId$1();
|
8181 |
|
8182 | this._lockList.push(unlock);
|
8183 |
|
8184 | this._log('lock: ' + unlock.id);
|
8185 |
|
8186 | return unlock;
|
8187 | }
|
8188 | }, {
|
8189 | key: "_unlock",
|
8190 | value: function _unlock(fn) {
|
8191 | var index = this._lockList.indexOf(fn);
|
8192 |
|
8193 | if (index === -1) {
|
8194 | throw new Error('This function is not registered in the lock list.');
|
8195 | }
|
8196 |
|
8197 | this._lockList.splice(index, 1);
|
8198 |
|
8199 | this._log('unlock: ' + fn.id);
|
8200 |
|
8201 | this._tryToFreeWaitList();
|
8202 | }
|
8203 | }, {
|
8204 | key: "_tryToFreeWaitList",
|
8205 | value: function _tryToFreeWaitList() {
|
8206 | while (!this.isLocked() && this._waitList.length > 0) {
|
8207 | this._waitList.shift()();
|
8208 | }
|
8209 | }
|
8210 | /**
|
8211 | * Register a callback for waiting unlocked door.
|
8212 | *
|
8213 | * @params {Function} callback Callback on unlocking the door completely.
|
8214 | */
|
8215 |
|
8216 | }, {
|
8217 | key: "waitUnlock",
|
8218 | value: function waitUnlock(callback) {
|
8219 | if (!(callback instanceof Function)) {
|
8220 | throw new Error('The callback param must be a function.');
|
8221 | }
|
8222 |
|
8223 | if (this.isLocked()) {
|
8224 | this._waitList.push(callback);
|
8225 | } else {
|
8226 | callback();
|
8227 | }
|
8228 | }
|
8229 | /**
|
8230 | * @return {Boolean}
|
8231 | */
|
8232 |
|
8233 | }, {
|
8234 | key: "isLocked",
|
8235 | value: function isLocked() {
|
8236 | return this._lockList.length > 0;
|
8237 | }
|
8238 | }]);
|
8239 |
|
8240 | return DoorLock;
|
8241 | }();
|
8242 |
|
8243 | function loadPage(_ref, done, error) {
|
8244 | var page = _ref.page,
|
8245 | parent = _ref.parent;
|
8246 | _ref.params;
|
8247 | internal$1.getPageHTMLAsync(page).then(function (html) {
|
8248 | var pageElement = util$4.createElement(html);
|
8249 | parent.appendChild(pageElement);
|
8250 | done(pageElement);
|
8251 | }).catch(function (e) {
|
8252 | return error(e);
|
8253 | });
|
8254 | }
|
8255 |
|
8256 | function unloadPage(element) {
|
8257 | if (element._destroy instanceof Function) {
|
8258 | element._destroy();
|
8259 | } else {
|
8260 | element.remove();
|
8261 | }
|
8262 | }
|
8263 |
|
8264 | var PageLoader = /*#__PURE__*/function () {
|
8265 | /**
|
8266 | * @param {Function} [fn] Returns an object that has "element" property and "unload" function.
|
8267 | */
|
8268 | function PageLoader(loader, unloader) {
|
8269 | _classCallCheck(this, PageLoader);
|
8270 |
|
8271 | this._loader = loader instanceof Function ? loader : loadPage;
|
8272 | this._unloader = unloader instanceof Function ? unloader : unloadPage;
|
8273 | }
|
8274 | /**
|
8275 | * Set internal loader implementation.
|
8276 | */
|
8277 |
|
8278 |
|
8279 | _createClass(PageLoader, [{
|
8280 | key: "internalLoader",
|
8281 | get: function get() {
|
8282 | return this._loader;
|
8283 | }
|
8284 | /**
|
8285 | * @param {any} options.page
|
8286 | * @param {Element} options.parent A location to load page.
|
8287 | * @param {Object} [options.params] Extra parameters for ons-page.
|
8288 | * @param {Function} done Take an object that has "element" property and "unload" function.
|
8289 | * @param {Function} error Function called when there is an error.
|
8290 | */
|
8291 | ,
|
8292 | set: function set(fn) {
|
8293 | if (!(fn instanceof Function)) {
|
8294 | throw Error('First parameter must be an instance of Function');
|
8295 | }
|
8296 |
|
8297 | this._loader = fn;
|
8298 | }
|
8299 | }, {
|
8300 | key: "load",
|
8301 | value: function load(_ref2, done, error) {
|
8302 | var page = _ref2.page,
|
8303 | parent = _ref2.parent,
|
8304 | _ref2$params = _ref2.params,
|
8305 | params = _ref2$params === void 0 ? {} : _ref2$params;
|
8306 |
|
8307 | this._loader({
|
8308 | page: page,
|
8309 | parent: parent,
|
8310 | params: params
|
8311 | }, function (pageElement) {
|
8312 | if (!(pageElement instanceof Element)) {
|
8313 | throw Error('pageElement must be an instance of Element.');
|
8314 | }
|
8315 |
|
8316 | done(pageElement);
|
8317 | }, error);
|
8318 | }
|
8319 | }, {
|
8320 | key: "unload",
|
8321 | value: function unload(pageElement) {
|
8322 | if (!(pageElement instanceof Element)) {
|
8323 | throw Error('pageElement must be an instance of Element.');
|
8324 | }
|
8325 |
|
8326 | this._unloader(pageElement);
|
8327 | }
|
8328 | }]);
|
8329 |
|
8330 | return PageLoader;
|
8331 | }();
|
8332 | var defaultPageLoader = new PageLoader();
|
8333 | var instantPageLoader = new PageLoader(function (_ref3, done) {
|
8334 | var page = _ref3.page,
|
8335 | parent = _ref3.parent;
|
8336 | _ref3.params;
|
8337 | var element = util$4.createElement(page.trim());
|
8338 | parent.appendChild(element);
|
8339 | done(element);
|
8340 | }, unloadPage);
|
8341 |
|
8342 | /**
|
8343 | * @object ons
|
8344 | * @category util
|
8345 | * @description
|
8346 | * [ja]Onsen UIで利用できるグローバルなオブジェクトです。[/ja]
|
8347 | * [en]A global object that's used in Onsen UI. [/en]
|
8348 | */
|
8349 |
|
8350 | var ons = {
|
8351 | animit: Animit,
|
8352 | defaultPageLoader: defaultPageLoader,
|
8353 | elements: onsElements,
|
8354 | GestureDetector: GestureDetector,
|
8355 | modifier: modifier,
|
8356 | notification: notification,
|
8357 | orientation: orientation,
|
8358 | pageAttributeExpression: pageAttributeExpression,
|
8359 | PageLoader: PageLoader,
|
8360 | platform: platform,
|
8361 | softwareKeyboard: softwareKeyboard,
|
8362 | _autoStyle: autoStyle,
|
8363 | _internal: internal$1,
|
8364 | _readyLock: new DoorLock(),
|
8365 | _util: util$4
|
8366 | };
|
8367 | ons.platform.select((window.location.search.match(/platform=([\w-]+)/) || [])[1]);
|
8368 | waitDeviceReady();
|
8369 |
|
8370 | var readyError = function readyError(after) {
|
8371 | return util$4.throw("This method must be called ".concat(after ? 'after' : 'before', " ons.isReady() is true"));
|
8372 | };
|
8373 | /**
|
8374 | * @method isReady
|
8375 | * @signature isReady()
|
8376 | * @return {Boolean}
|
8377 | * [en]Will be true if Onsen UI is initialized.[/en]
|
8378 | * [ja]初期化されているかどうかを返します。[/ja]
|
8379 | * @description
|
8380 | * [en]Returns true if Onsen UI is initialized.[/en]
|
8381 | * [ja]Onsen UIがすでに初期化されているかどうかを返すメソッドです。[/ja]
|
8382 | */
|
8383 |
|
8384 |
|
8385 | ons.isReady = function () {
|
8386 | return !ons._readyLock.isLocked();
|
8387 | };
|
8388 | /**
|
8389 | * @method isWebView
|
8390 | * @signature isWebView()
|
8391 | * @return {Boolean}
|
8392 | * [en]Will be true if the app is running in Cordova.[/en]
|
8393 | * [ja]Cordovaで実行されている場合にtrueになります。[/ja]
|
8394 | * @description
|
8395 | * [en]Returns true if running inside Cordova.[/en]
|
8396 | * [ja]Cordovaで実行されているかどうかを返すメソッドです。[/ja]
|
8397 | */
|
8398 |
|
8399 |
|
8400 | ons.isWebView = ons.platform.isWebView;
|
8401 | /**
|
8402 | * @method ready
|
8403 | * @signature ready(callback)
|
8404 | * @description
|
8405 | * [ja]アプリの初期化に利用するメソッドです。渡された関数は、Onsen UIの初期化が終了している時点で必ず呼ばれます。[/ja]
|
8406 | * [en]Method used to wait for app initialization. Waits for `DOMContentLoaded` and `deviceready`, when necessary, before executing the callback.[/en]
|
8407 | * @param {Function} callback
|
8408 | * [en]Function that executes after Onsen UI has been initialized.[/en]
|
8409 | * [ja]Onsen UIが初期化が完了した後に呼び出される関数オブジェクトを指定します。[/ja]
|
8410 | */
|
8411 |
|
8412 | ons.ready = function (callback) {
|
8413 | if (ons.isReady()) {
|
8414 | callback();
|
8415 | } else {
|
8416 | ons._readyLock.waitUnlock(callback);
|
8417 | }
|
8418 | };
|
8419 | /**
|
8420 | * @method setDefaultDeviceBackButtonListener
|
8421 | * @signature setDefaultDeviceBackButtonListener(listener)
|
8422 | * @param {Function} listener
|
8423 | * [en]Function that executes when device back button is pressed. Must be called on `ons.ready`.[/en]
|
8424 | * [ja]デバイスのバックボタンが押された時に実行される関数オブジェクトを指定します。[/ja]
|
8425 | * @description
|
8426 | * [en]Set default handler for device back button.[/en]
|
8427 | * [ja]デバイスのバックボタンのためのデフォルトのハンドラを設定します。[/ja]
|
8428 | */
|
8429 |
|
8430 |
|
8431 | ons.setDefaultDeviceBackButtonListener = function (listener) {
|
8432 | if (!ons.isReady()) {
|
8433 | readyError(true);
|
8434 | }
|
8435 |
|
8436 | ons._defaultDeviceBackButtonHandler.setListener(listener);
|
8437 | };
|
8438 | /**
|
8439 | * @method disableDeviceBackButtonHandler
|
8440 | * @signature disableDeviceBackButtonHandler()
|
8441 | * @description
|
8442 | * [en]Disable device back button event handler. Must be called on `ons.ready`.[/en]
|
8443 | * [ja]デバイスのバックボタンのイベントを受け付けないようにします。[/ja]
|
8444 | */
|
8445 |
|
8446 |
|
8447 | ons.disableDeviceBackButtonHandler = function () {
|
8448 | if (!ons.isReady()) {
|
8449 | readyError(true);
|
8450 | }
|
8451 |
|
8452 | internal$1.dbbDispatcher.disable();
|
8453 | };
|
8454 | /**
|
8455 | * @method enableDeviceBackButtonHandler
|
8456 | * @signature enableDeviceBackButtonHandler()
|
8457 | * @description
|
8458 | * [en]Enable device back button event handler. Must be called on `ons.ready`.[/en]
|
8459 | * [ja]デバイスのバックボタンのイベントを受け付けるようにします。[/ja]
|
8460 | */
|
8461 |
|
8462 |
|
8463 | ons.enableDeviceBackButtonHandler = function () {
|
8464 | if (!ons.isReady()) {
|
8465 | readyError(true);
|
8466 | }
|
8467 |
|
8468 | internal$1.dbbDispatcher.enable();
|
8469 | };
|
8470 |
|
8471 | ons.fireDeviceBackButtonEvent = function () {
|
8472 | internal$1.dbbDispatcher.fireDeviceBackButtonEvent();
|
8473 | };
|
8474 | /**
|
8475 | * @method enableAutoStatusBarFill
|
8476 | * @signature enableAutoStatusBarFill()
|
8477 | * @description
|
8478 | * [en]Enable status bar fill feature on iOS7 and above (except for iPhone X). Must be called before `ons.ready`.[/en]
|
8479 | * [ja]iOS7以上(iPhone Xは除く)で、ステータスバー部分の高さを自動的に埋める処理を有効にします。[/ja]
|
8480 | */
|
8481 |
|
8482 |
|
8483 | ons.enableAutoStatusBarFill = function () {
|
8484 | if (ons.isReady()) {
|
8485 | readyError(false);
|
8486 | }
|
8487 |
|
8488 | internal$1.config.autoStatusBarFill = true;
|
8489 | };
|
8490 | /**
|
8491 | * @method disableAutoStatusBarFill
|
8492 | * @signature disableAutoStatusBarFill()
|
8493 | * @description
|
8494 | * [en]Disable status bar fill feature on iOS7 and above (except for iPhone X). Must be called before `ons.ready`.[/en]
|
8495 | * [ja]iOS7以上(iPhone Xは除く)で、ステータスバー部分の高さを自動的に埋める処理を無効にします。[/ja]
|
8496 | */
|
8497 |
|
8498 |
|
8499 | ons.disableAutoStatusBarFill = function () {
|
8500 | if (ons.isReady()) {
|
8501 | readyError(false);
|
8502 | }
|
8503 |
|
8504 | internal$1.config.autoStatusBarFill = false;
|
8505 | };
|
8506 | /**
|
8507 | * @method mockStatusBar
|
8508 | * @signature mockStatusBar()
|
8509 | * @description
|
8510 | * [en]Creates a static element similar to iOS status bar. Only useful for browser testing. Must be called before `ons.ready`.[/en]
|
8511 | * [ja][/ja]
|
8512 | */
|
8513 |
|
8514 |
|
8515 | ons.mockStatusBar = function () {
|
8516 | if (ons.isReady()) {
|
8517 | readyError(false);
|
8518 | }
|
8519 |
|
8520 | var mock = function mock() {
|
8521 | if (!document.body.children[0] || !document.body.children[0].classList.contains('ons-status-bar-mock')) {
|
8522 | var android = platform.isAndroid(),
|
8523 | i = function i(_i) {
|
8524 | return "<i class=\"".concat(_i.split('-')[0], " ").concat(_i, "\"></i>");
|
8525 | };
|
8526 |
|
8527 | var left = android ? "".concat(i('zmdi-twitter'), " ").concat(i('zmdi-google-play')) : "No SIM ".concat(i('fa-wifi')),
|
8528 | center = android ? '' : '12:28 PM',
|
8529 | right = android ? "".concat(i('zmdi-network'), " ").concat(i('zmdi-wifi'), " ").concat(i('zmdi-battery'), " 12:28 PM") : "80% ".concat(i('fa-battery-three-quarters'));
|
8530 | document.body.insertBefore(util$4.createElement("<div class=\"ons-status-bar-mock ".concat(android ? 'android' : 'ios', "\">") + "<div>".concat(left, "</div><div>").concat(center, "</div><div>").concat(right, "</div>") + "</div>"), document.body.firstChild);
|
8531 | }
|
8532 | };
|
8533 |
|
8534 | document.body ? mock() : internal$1.waitDOMContentLoaded(mock);
|
8535 | };
|
8536 | /**
|
8537 | * @method disableAnimations
|
8538 | * @signature disableAnimations()
|
8539 | * @description
|
8540 | * [en]Disable all animations. Could be handy for testing and older devices.[/en]
|
8541 | * [ja]アニメーションを全て無効にします。テストの際に便利です。[/ja]
|
8542 | */
|
8543 |
|
8544 |
|
8545 | ons.disableAnimations = function () {
|
8546 | internal$1.config.animationsDisabled = true;
|
8547 | };
|
8548 | /**
|
8549 | * @method enableAnimations
|
8550 | * @signature enableAnimations()
|
8551 | * @description
|
8552 | * [en]Enable animations (default).[/en]
|
8553 | * [ja]アニメーションを有効にします。[/ja]
|
8554 | */
|
8555 |
|
8556 |
|
8557 | ons.enableAnimations = function () {
|
8558 | internal$1.config.animationsDisabled = false;
|
8559 | };
|
8560 |
|
8561 | ons._disableWarnings = function () {
|
8562 | internal$1.config.warningsDisabled = true;
|
8563 | };
|
8564 |
|
8565 | ons._enableWarnings = function () {
|
8566 | internal$1.config.warningsDisabled = false;
|
8567 | };
|
8568 | /**
|
8569 | * @method disableAutoStyling
|
8570 | * @signature disableAutoStyling()
|
8571 | * @description
|
8572 | * [en]Disable automatic styling.[/en]
|
8573 | * [ja][/ja]
|
8574 | */
|
8575 |
|
8576 |
|
8577 | ons.disableAutoStyling = autoStyle.disable;
|
8578 | /**
|
8579 | * @method enableAutoStyling
|
8580 | * @signature enableAutoStyling()
|
8581 | * @description
|
8582 | * [en]Enable automatic styling based on OS (default).[/en]
|
8583 | * [ja][/ja]
|
8584 | */
|
8585 |
|
8586 | ons.enableAutoStyling = autoStyle.enable;
|
8587 | /**
|
8588 | * @method disableIconAutoPrefix
|
8589 | * @signature disableIconAutoPrefix()
|
8590 | * @description
|
8591 | * [en]Disable adding `fa-` prefix automatically to `ons-icon` classes. Useful when including custom icon packs.[/en]
|
8592 | * [ja][/ja]
|
8593 | */
|
8594 |
|
8595 | ons.disableIconAutoPrefix = function () {
|
8596 | util$4.checkMissingImport('Icon');
|
8597 | onsElements.Icon.setAutoPrefix(false);
|
8598 | };
|
8599 | /**
|
8600 | * @method forcePlatformStyling
|
8601 | * @signature forcePlatformStyling(platform)
|
8602 | * @description
|
8603 | * [en]Refresh styling for the given platform. Only useful for demos. Use `ons.platform.select(...)` instead for development and production.[/en]
|
8604 | * [ja][/ja]
|
8605 | * @param {string} platform New platform to style the elements.
|
8606 | */
|
8607 |
|
8608 |
|
8609 | ons.forcePlatformStyling = function (newPlatform) {
|
8610 | ons.enableAutoStyling();
|
8611 | ons.platform.select(newPlatform || 'ios');
|
8612 |
|
8613 | ons._util.arrayFrom(document.querySelectorAll('*')).forEach(function (element) {
|
8614 | if (element.tagName.toLowerCase() === 'ons-if') {
|
8615 | element._platformUpdate();
|
8616 | } else if (element.tagName.match(/^ons-/i)) {
|
8617 | autoStyle.prepare(element, true);
|
8618 |
|
8619 | if (element.tagName.toLowerCase() === 'ons-tabbar') {
|
8620 | element._updatePosition();
|
8621 | }
|
8622 | }
|
8623 | });
|
8624 | };
|
8625 | /**
|
8626 | * @method preload
|
8627 | * @signature preload(templatePaths)
|
8628 | * @param {String|Array} templatePaths
|
8629 | * [en]Set of HTML file paths containing 'ons-page' elements.[/en]
|
8630 | * [ja][/ja]
|
8631 | * @return {Promise}
|
8632 | * [en]Promise that resolves when all the templates are cached.[/en]
|
8633 | * [ja][/ja]
|
8634 | * @description
|
8635 | * [en]Separated files need to be requested on demand and this can slightly delay pushing new pages. This method requests and caches templates for later use.[/en]
|
8636 | * [ja][/ja]
|
8637 | */
|
8638 |
|
8639 |
|
8640 | ons.preload = function () {
|
8641 | var templates = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
8642 | return Promise.all((templates instanceof Array ? templates : [templates]).map(function (template) {
|
8643 | if (typeof template !== 'string') {
|
8644 | util$4.throw('Expected string arguments but got ' + _typeof(template));
|
8645 | }
|
8646 |
|
8647 | return internal$1.getTemplateHTMLAsync(template);
|
8648 | }));
|
8649 | };
|
8650 | /**
|
8651 | * @method createElement
|
8652 | * @signature createElement(template, options)
|
8653 | * @param {String} template
|
8654 | * [en]Either an HTML file path, a `<template>` id or an HTML string such as `'<div id="foo">hoge</div>'`.[/en]
|
8655 | * [ja][/ja]
|
8656 | * @param {Object} [options]
|
8657 | * [en]Parameter object.[/en]
|
8658 | * [ja]オプションを指定するオブジェクト。[/ja]
|
8659 | * @param {Boolean|HTMLElement} [options.append]
|
8660 | * [en]Whether or not the element should be automatically appended to the DOM. Defaults to `false`. If `true` value is given, `document.body` will be used as the target.[/en]
|
8661 | * [ja][/ja]
|
8662 | * @param {HTMLElement} [options.insertBefore]
|
8663 | * [en]Reference node that becomes the next sibling of the new node (`options.append` element).[/en]
|
8664 | * [ja][/ja]
|
8665 | * @return {HTMLElement|Promise}
|
8666 | * [en]If the provided template was an inline HTML string, it returns the new element. Otherwise, it returns a promise that resolves to the new element.[/en]
|
8667 | * [ja][/ja]
|
8668 | * @description
|
8669 | * [en]Create a new element from a template. Both inline HTML and external files are supported although the return value differs.[/en]
|
8670 | * [ja][/ja]
|
8671 | */
|
8672 |
|
8673 |
|
8674 | ons.createElement = function (template) {
|
8675 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
8676 | template = template.trim();
|
8677 |
|
8678 | var create = function create(html) {
|
8679 | var element = ons._util.createElement(html);
|
8680 |
|
8681 | element.remove();
|
8682 |
|
8683 | if (options.append) {
|
8684 | var target = options.append instanceof HTMLElement ? options.append : document.body;
|
8685 | target.insertBefore(element, options.insertBefore || null);
|
8686 | options.link instanceof Function && options.link(element);
|
8687 | }
|
8688 |
|
8689 | return element;
|
8690 | };
|
8691 |
|
8692 | return template.charAt(0) === '<' ? create(template) : internal$1.getPageHTMLAsync(template).then(create);
|
8693 | };
|
8694 | /**
|
8695 | * @method createPopover
|
8696 | * @signature createPopover(page, [options])
|
8697 | * @param {String} page
|
8698 | * [en]Page name. Can be either an HTML file or a <template> containing a <ons-dialog> component.[/en]
|
8699 | * [ja]pageのURLか、もしくは`<template>`で宣言したテンプレートのid属性の値を指定できます。[/ja]
|
8700 | * @param {Object} [options]
|
8701 | * [en]Parameter object.[/en]
|
8702 | * [ja]オプションを指定するオブジェクト。[/ja]
|
8703 | * @param {Object} [options.parentScope]
|
8704 | * [en]Parent scope of the dialog. Used to bind models and access scope methods from the dialog.[/en]
|
8705 | * [ja]ダイアログ内で利用する親スコープを指定します。ダイアログからモデルやスコープのメソッドにアクセスするのに使います。このパラメータはAngularJSバインディングでのみ利用できます。[/ja]
|
8706 | * @return {Promise}
|
8707 | * [en]Promise object that resolves to the popover component object.[/en]
|
8708 | * [ja]ポップオーバーのコンポーネントオブジェクトを解決するPromiseオブジェクトを返します。[/ja]
|
8709 | * @description
|
8710 | * [en]Create a popover instance from a template.[/en]
|
8711 | * [ja]テンプレートからポップオーバーのインスタンスを生成します。[/ja]
|
8712 | */
|
8713 |
|
8714 | /**
|
8715 | * @method createDialog
|
8716 | * @signature createDialog(page, [options])
|
8717 | * @param {String} page
|
8718 | * [en]Page name. Can be either an HTML file or an `<template>` containing a <ons-dialog> component.[/en]
|
8719 | * [ja]pageのURLか、もしくは`<template>`で宣言したテンプレートのid属性の値を指定できます。[/ja]
|
8720 | * @param {Object} [options]
|
8721 | * [en]Parameter object.[/en]
|
8722 | * [ja]オプションを指定するオブジェクト。[/ja]
|
8723 | * @return {Promise}
|
8724 | * [en]Promise object that resolves to the dialog component object.[/en]
|
8725 | * [ja]ダイアログのコンポーネントオブジェクトを解決するPromiseオブジェクトを返します。[/ja]
|
8726 | * @description
|
8727 | * [en]Create a dialog instance from a template.[/en]
|
8728 | * [ja]テンプレートからダイアログのインスタンスを生成します。[/ja]
|
8729 | */
|
8730 |
|
8731 | /**
|
8732 | * @method createAlertDialog
|
8733 | * @signature createAlertDialog(page, [options])
|
8734 | * @param {String} page
|
8735 | * [en]Page name. Can be either an HTML file or an `<template>` containing a <ons-alert-dialog> component.[/en]
|
8736 | * [ja]pageのURLか、もしくは`<template>`で宣言したテンプレートのid属性の値を指定できます。[/ja]
|
8737 | * @param {Object} [options]
|
8738 | * [en]Parameter object.[/en]
|
8739 | * [ja]オプションを指定するオブジェクト。[/ja]
|
8740 | * @return {Promise}
|
8741 | * [en]Promise object that resolves to the alert dialog component object.[/en]
|
8742 | * [ja]ダイアログのコンポーネントオブジェクトを解決するPromiseオブジェクトを返します。[/ja]
|
8743 | * @description
|
8744 | * [en]Create a alert dialog instance from a template.[/en]
|
8745 | * [ja]テンプレートからアラートダイアログのインスタンスを生成します。[/ja]
|
8746 | */
|
8747 |
|
8748 |
|
8749 | ons.createPopover = ons.createDialog = ons.createAlertDialog = function (template) {
|
8750 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
8751 | return ons.createElement(template, _objectSpread2({
|
8752 | append: true
|
8753 | }, options));
|
8754 | };
|
8755 | /**
|
8756 | * @method openActionSheet
|
8757 | * @signature openActionSheet(options)
|
8758 | * @description
|
8759 | * [en]Shows an instant Action Sheet and lets the user choose an action.[/en]
|
8760 | * [ja][/ja]
|
8761 | * @param {Object} [options]
|
8762 | * [en]Parameter object.[/en]
|
8763 | * [ja]オプションを指定するオブジェクト。[/ja]
|
8764 | * @param {Array} [options.buttons]
|
8765 | * [en]Represent each button of the action sheet following the specified order. Every item can be either a string label or an object containing `label`, `icon` and `modifier` properties.[/en]
|
8766 | * [ja][/ja]
|
8767 | * @param {String} [options.title]
|
8768 | * [en]Optional title for the action sheet.[/en]
|
8769 | * [ja][/ja]
|
8770 | * @param {Number} [options.destructive]
|
8771 | * [en]Optional index of the "destructive" button (only for iOS). It can be specified in the button array as well.[/en]
|
8772 | * [ja][/ja]
|
8773 | * @param {Boolean} [options.cancelable]
|
8774 | * [en]Whether the action sheet can be canceled by tapping on the background mask or not.[/en]
|
8775 | * [ja][/ja]
|
8776 | * @param {String} [options.modifier]
|
8777 | * [en]Modifier attribute of the action sheet. E.g. `'destructive'`.[/en]
|
8778 | * [ja][/ja]
|
8779 | * @param {String} [options.maskColor]
|
8780 | * [en]Optionally change the background mask color.[/en]
|
8781 | * [ja][/ja]
|
8782 | * @param {String} [options.id]
|
8783 | * [en]The element's id attribute.[/en]
|
8784 | * [ja][/ja]
|
8785 | * @param {String} [options.class]
|
8786 | * [en]The element's class attribute.[/en]
|
8787 | * [ja][/ja]
|
8788 | * @return {Promise}
|
8789 | * [en]Will resolve when the action sheet is closed. The resolve value is either the index of the tapped button or -1 when canceled.[/en]
|
8790 | * [ja][/ja]
|
8791 | */
|
8792 |
|
8793 |
|
8794 | ons.openActionSheet = actionSheet;
|
8795 | /**
|
8796 | * @method resolveLoadingPlaceholder
|
8797 | * @signature resolveLoadingPlaceholder(page)
|
8798 | * @param {String} page
|
8799 | * [en]Page name. Can be either an HTML file or a `<template>` id.[/en]
|
8800 | * [ja]pageのURLか、もしくは`<template>`で宣言したテンプレートのid属性の値を指定できます。[/ja]
|
8801 | * @description
|
8802 | * [en]If no page is defined for the `ons-loading-placeholder` attribute it will wait for this method being called before loading the page.[/en]
|
8803 | * [ja]ons-loading-placeholderの属性値としてページが指定されていない場合は、ページロード前に呼ばれるons.resolveLoadingPlaceholder処理が行われるまで表示されません。[/ja]
|
8804 | */
|
8805 |
|
8806 | ons.resolveLoadingPlaceholder = function (page, link) {
|
8807 | var elements = ons._util.arrayFrom(window.document.querySelectorAll('[ons-loading-placeholder]'));
|
8808 |
|
8809 | if (elements.length === 0) {
|
8810 | util$4.throw('No ons-loading-placeholder exists');
|
8811 | }
|
8812 |
|
8813 | elements.filter(function (element) {
|
8814 | return !element.getAttribute('page');
|
8815 | }).forEach(function (element) {
|
8816 | element.setAttribute('ons-loading-placeholder', page);
|
8817 |
|
8818 | ons._resolveLoadingPlaceholder(element, page, link);
|
8819 | });
|
8820 | };
|
8821 |
|
8822 | ons._setupLoadingPlaceHolders = function () {
|
8823 | ons.ready(function () {
|
8824 | var elements = ons._util.arrayFrom(window.document.querySelectorAll('[ons-loading-placeholder]'));
|
8825 |
|
8826 | elements.forEach(function (element) {
|
8827 | var page = element.getAttribute('ons-loading-placeholder');
|
8828 |
|
8829 | if (typeof page === 'string') {
|
8830 | ons._resolveLoadingPlaceholder(element, page);
|
8831 | }
|
8832 | });
|
8833 | });
|
8834 | };
|
8835 |
|
8836 | ons._resolveLoadingPlaceholder = function (parent, page) {
|
8837 | var link = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (el, done) {
|
8838 | return done();
|
8839 | };
|
8840 | page && ons.createElement(page).then(function (element) {
|
8841 | element.style.display = 'none';
|
8842 | parent.appendChild(element);
|
8843 | link(element, function () {
|
8844 | while (parent.firstChild && parent.firstChild !== element) {
|
8845 | parent.removeChild(parent.firstChild);
|
8846 | }
|
8847 |
|
8848 | element.style.display = '';
|
8849 | });
|
8850 | }).catch(function (error) {
|
8851 | return Promise.reject('Unabled to resolve placeholder: ' + error);
|
8852 | });
|
8853 | };
|
8854 |
|
8855 | function waitDeviceReady() {
|
8856 | var unlockDeviceReady = ons._readyLock.lock();
|
8857 |
|
8858 | window.addEventListener('DOMContentLoaded', function () {
|
8859 | if (ons.isWebView()) {
|
8860 | window.document.addEventListener('deviceready', unlockDeviceReady, {
|
8861 | once: true
|
8862 | });
|
8863 | } else {
|
8864 | unlockDeviceReady();
|
8865 | }
|
8866 | }, {
|
8867 | once: true
|
8868 | });
|
8869 | }
|
8870 | /**
|
8871 | * @method getScriptPage
|
8872 | * @signature getScriptPage()
|
8873 | * @description
|
8874 | * [en]Access the last created page from the current `script` scope. Only works inside `<script></script>` tags that are direct children of `ons-page` element. Use this to add lifecycle hooks to a page.[/en]
|
8875 | * [ja][/ja]
|
8876 | * @return {HTMLElement}
|
8877 | * [en]Returns the corresponding page element.[/en]
|
8878 | * [ja][/ja]
|
8879 | */
|
8880 |
|
8881 |
|
8882 | var getCS = 'currentScript' in document ? function () {
|
8883 | return document.currentScript;
|
8884 | } : function () {
|
8885 | return document.scripts[document.scripts.length - 1];
|
8886 | };
|
8887 |
|
8888 | ons.getScriptPage = function () {
|
8889 | return getCS() && /ons-page/i.test(getCS().parentElement.tagName) && getCS().parentElement || null;
|
8890 | };
|
8891 |
|
8892 | /*
|
8893 | Copyright 2013-2015 ASIAL CORPORATION
|
8894 |
|
8895 | Licensed under the Apache License, Version 2.0 (the "License");
|
8896 | you may not use this file except in compliance with the License.
|
8897 | You may obtain a copy of the License at
|
8898 |
|
8899 | http://www.apache.org/licenses/LICENSE-2.0
|
8900 |
|
8901 | Unless required by applicable law or agreed to in writing, software
|
8902 | distributed under the License is distributed on an "AS IS" BASIS,
|
8903 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
8904 | See the License for the specific language governing permissions and
|
8905 | limitations under the License.
|
8906 |
|
8907 | */
|
8908 | function getElementClass() {
|
8909 | if (typeof HTMLElement !== 'function') {
|
8910 | // case of Safari
|
8911 | var _BaseElement = function _BaseElement() {};
|
8912 |
|
8913 | _BaseElement.prototype = document.createElement('div');
|
8914 | return _BaseElement;
|
8915 | } else {
|
8916 | return HTMLElement;
|
8917 | }
|
8918 | }
|
8919 |
|
8920 | var BaseElement = /*#__PURE__*/function (_getElementClass) {
|
8921 | _inherits(BaseElement, _getElementClass);
|
8922 |
|
8923 | var _super = _createSuper(BaseElement);
|
8924 |
|
8925 | function BaseElement() {
|
8926 | _classCallCheck(this, BaseElement);
|
8927 |
|
8928 | return _super.call(this);
|
8929 | }
|
8930 |
|
8931 | return _createClass(BaseElement);
|
8932 | }(getElementClass());
|
8933 |
|
8934 | /**
|
8935 | * @element ons-if
|
8936 | * @category conditional
|
8937 | * @tutorial vanilla/Reference/if
|
8938 | * @description
|
8939 | * [en]
|
8940 | * Conditionally display content depending on the platform, device orientation or both.
|
8941 | *
|
8942 | * Sometimes it is useful to conditionally hide or show certain components based on platform. When running on iOS the `<ons-if>` element can be used to hide the `<ons-fab>` element.
|
8943 | * [/en]
|
8944 | * [ja][/ja]
|
8945 | * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja]Information about cross platform styling[/ja]
|
8946 | * @example
|
8947 | * <ons-page>
|
8948 | * <ons-if orientation="landscape">
|
8949 | * Landscape view!
|
8950 | * </ons-if>
|
8951 | * <ons-if platform="android">
|
8952 | * This is Android.
|
8953 | * </ons-if>
|
8954 | * <ons-if platform="ios other">
|
8955 | * This is not Android.
|
8956 | * </ons-if>
|
8957 | * </ons-page>
|
8958 | */
|
8959 |
|
8960 | var IfElement = /*#__PURE__*/function (_BaseElement) {
|
8961 | _inherits(IfElement, _BaseElement);
|
8962 |
|
8963 | var _super = _createSuper(IfElement);
|
8964 |
|
8965 | /**
|
8966 | * @attribute platform
|
8967 | * @initonly
|
8968 | * @type {string}
|
8969 | * @description
|
8970 | * [en]Space-separated platform names. Possible values are `"ios"`, `"android"`, `"windows"` and `"other"`.[/en]
|
8971 | * [ja][/ja]
|
8972 | */
|
8973 |
|
8974 | /**
|
8975 | * @attribute orientation
|
8976 | * @type {string}
|
8977 | * @description
|
8978 | * [en]Either `"portrait"` or `"landscape"`.[/en]
|
8979 | * [ja]portraitもしくはlandscapeを指定します[/ja]
|
8980 | */
|
8981 | function IfElement() {
|
8982 | var _this;
|
8983 |
|
8984 | _classCallCheck(this, IfElement);
|
8985 |
|
8986 | _this = _super.call(this);
|
8987 | contentReady(_assertThisInitialized(_this), function () {
|
8988 | if (platform._getSelectedPlatform() !== null) {
|
8989 | _this._platformUpdate();
|
8990 | } else if (!_this._isAllowedPlatform()) {
|
8991 | while (_this.childNodes[0]) {
|
8992 | _this.childNodes[0].remove();
|
8993 | }
|
8994 |
|
8995 | _this._platformUpdate();
|
8996 | }
|
8997 | });
|
8998 |
|
8999 | _this._onOrientationChange();
|
9000 |
|
9001 | return _this;
|
9002 | }
|
9003 |
|
9004 | _createClass(IfElement, [{
|
9005 | key: "connectedCallback",
|
9006 | value: function connectedCallback() {
|
9007 | orientation.on('change', this._onOrientationChange.bind(this));
|
9008 | }
|
9009 | }, {
|
9010 | key: "attributeChangedCallback",
|
9011 | value: function attributeChangedCallback(name) {
|
9012 | if (name === 'orientation') {
|
9013 | this._onOrientationChange();
|
9014 | }
|
9015 | }
|
9016 | }, {
|
9017 | key: "disconnectedCallback",
|
9018 | value: function disconnectedCallback() {
|
9019 | orientation.off('change', this._onOrientationChange);
|
9020 | }
|
9021 | }, {
|
9022 | key: "_platformUpdate",
|
9023 | value: function _platformUpdate() {
|
9024 | this.style.display = this._isAllowedPlatform() ? '' : 'none';
|
9025 | }
|
9026 | }, {
|
9027 | key: "_isAllowedPlatform",
|
9028 | value: function _isAllowedPlatform() {
|
9029 | return !this.getAttribute('platform') || this.getAttribute('platform').split(/\s+/).indexOf(platform.getMobileOS()) >= 0;
|
9030 | }
|
9031 | }, {
|
9032 | key: "_onOrientationChange",
|
9033 | value: function _onOrientationChange() {
|
9034 | if (this.hasAttribute('orientation') && this._isAllowedPlatform()) {
|
9035 | var conditionalOrientation = this.getAttribute('orientation').toLowerCase();
|
9036 | var currentOrientation = orientation.isPortrait() ? 'portrait' : 'landscape';
|
9037 | this.style.display = conditionalOrientation === currentOrientation ? '' : 'none';
|
9038 | }
|
9039 | }
|
9040 | }], [{
|
9041 | key: "observedAttributes",
|
9042 | get: function get() {
|
9043 | return ['orientation'];
|
9044 | }
|
9045 | }]);
|
9046 |
|
9047 | return IfElement;
|
9048 | }(BaseElement);
|
9049 | onsElements.If = IfElement;
|
9050 | customElements.define('ons-if', IfElement);
|
9051 |
|
9052 | var BaseAnimator = /*#__PURE__*/function () {
|
9053 | /**
|
9054 | * @param {Object} options
|
9055 | * @param {String} options.timing
|
9056 | * @param {Number} options.duration
|
9057 | * @param {Number} options.delay
|
9058 | */
|
9059 | function BaseAnimator() {
|
9060 | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
9061 |
|
9062 | _classCallCheck(this, BaseAnimator);
|
9063 |
|
9064 | this.timing = options.timing || 'linear';
|
9065 | this.duration = options.duration || 0;
|
9066 | this.delay = options.delay || 0;
|
9067 | this.def = {
|
9068 | timing: this.timing,
|
9069 | duration: this.duration,
|
9070 | delay: this.delay
|
9071 | };
|
9072 | }
|
9073 |
|
9074 | _createClass(BaseAnimator, null, [{
|
9075 | key: "extend",
|
9076 | value: function extend() {
|
9077 | var properties = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
9078 | var extendedAnimator = this;
|
9079 |
|
9080 | var newAnimator = function newAnimator() {
|
9081 | extendedAnimator.apply(this, arguments);
|
9082 | util$4.extend(this, properties);
|
9083 | };
|
9084 |
|
9085 | newAnimator.prototype = this.prototype;
|
9086 | return newAnimator;
|
9087 | }
|
9088 | }]);
|
9089 |
|
9090 | return BaseAnimator;
|
9091 | }();
|
9092 |
|
9093 | /*
|
9094 | Copyright 2013-2015 ASIAL CORPORATION
|
9095 |
|
9096 | Licensed under the Apache License, Version 2.0 (the "License");
|
9097 | you may not use this file except in compliance with the License.
|
9098 | You may obtain a copy of the License at
|
9099 |
|
9100 | http://www.apache.org/licenses/LICENSE-2.0
|
9101 |
|
9102 | Unless required by applicable law or agreed to in writing, software
|
9103 | distributed under the License is distributed on an "AS IS" BASIS,
|
9104 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
9105 | See the License for the specific language governing permissions and
|
9106 | limitations under the License.
|
9107 |
|
9108 | */
|
9109 | // This object should not be exposed to users. Please keep this private.
|
9110 | var iPhoneXPatch = {};
|
9111 |
|
9112 | iPhoneXPatch.isIPhoneXPortraitPatchActive = function () {
|
9113 | return document.documentElement.getAttribute('onsflag-iphonex-portrait') != null && window.innerWidth < window.innerHeight;
|
9114 | };
|
9115 |
|
9116 | iPhoneXPatch.isIPhoneXLandscapePatchActive = function () {
|
9117 | // If width === height, treat it as landscape
|
9118 | return document.documentElement.getAttribute('onsflag-iphonex-landscape') != null && window.innerWidth >= window.innerHeight;
|
9119 | };
|
9120 | /**
|
9121 | * Returns the safe area lengths based on the current state of the safe areas.
|
9122 | */
|
9123 |
|
9124 |
|
9125 | iPhoneXPatch.getSafeAreaLengths = function () {
|
9126 | var safeAreaLengths;
|
9127 |
|
9128 | if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
|
9129 | safeAreaLengths = {
|
9130 | top: 44,
|
9131 | right: 0,
|
9132 | bottom: 34,
|
9133 | left: 0
|
9134 | };
|
9135 | } else if (iPhoneXPatch.isIPhoneXLandscapePatchActive()) {
|
9136 | safeAreaLengths = {
|
9137 | top: 0,
|
9138 | right: 44,
|
9139 | bottom: 21,
|
9140 | left: 44
|
9141 | };
|
9142 | } else {
|
9143 | safeAreaLengths = {
|
9144 | top: 0,
|
9145 | right: 0,
|
9146 | bottom: 0,
|
9147 | left: 0
|
9148 | };
|
9149 | }
|
9150 |
|
9151 | return safeAreaLengths;
|
9152 | };
|
9153 | /**
|
9154 | * Returns the safe area rect based on the current state of the safe areas.
|
9155 | */
|
9156 |
|
9157 |
|
9158 | iPhoneXPatch.getSafeAreaDOMRect = function () {
|
9159 | var safeAreaRect;
|
9160 |
|
9161 | if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
|
9162 | safeAreaRect = {
|
9163 | x: 0,
|
9164 | y: 44,
|
9165 |
|
9166 | /* 0 + 44 (top safe area) */
|
9167 | width: window.innerWidth,
|
9168 | height: window.innerHeight - 78
|
9169 | /* height - 44 (top safe area) - 34 (bottom safe area) */
|
9170 |
|
9171 | };
|
9172 | } else if (iPhoneXPatch.isIPhoneXLandscapePatchActive()) {
|
9173 | safeAreaRect = {
|
9174 | x: 44,
|
9175 |
|
9176 | /* 0 + 44 (left safe area) */
|
9177 | y: 0,
|
9178 | width: window.innerWidth - 88,
|
9179 |
|
9180 | /* width - 44 (left safe area) - 34 (right safe area) */
|
9181 | height: window.innerHeight - 21
|
9182 | /* height - 21 (bottom safe area) */
|
9183 |
|
9184 | };
|
9185 | } else {
|
9186 | safeAreaRect = {
|
9187 | x: 0,
|
9188 | y: 0,
|
9189 | width: window.innerWidth,
|
9190 | height: window.innerHeight
|
9191 | };
|
9192 | }
|
9193 |
|
9194 | return _objectSpread2(_objectSpread2({}, safeAreaRect), {}, {
|
9195 | left: safeAreaRect.x,
|
9196 | top: safeAreaRect.y,
|
9197 | right: safeAreaRect.x + safeAreaRect.width,
|
9198 | bottom: safeAreaRect.y + safeAreaRect.height
|
9199 | });
|
9200 | };
|
9201 |
|
9202 | var ActionSheetAnimator = /*#__PURE__*/function (_BaseAnimator) {
|
9203 | _inherits(ActionSheetAnimator, _BaseAnimator);
|
9204 |
|
9205 | var _super = _createSuper(ActionSheetAnimator);
|
9206 |
|
9207 | function ActionSheetAnimator() {
|
9208 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
9209 | _ref$timing = _ref.timing,
|
9210 | timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
|
9211 | _ref$delay = _ref.delay,
|
9212 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
9213 | _ref$duration = _ref.duration,
|
9214 | duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
|
9215 |
|
9216 | _classCallCheck(this, ActionSheetAnimator);
|
9217 |
|
9218 | return _super.call(this, {
|
9219 | timing: timing,
|
9220 | delay: delay,
|
9221 | duration: duration
|
9222 | });
|
9223 | }
|
9224 | /**
|
9225 | * @param {HTMLElement} dialog
|
9226 | * @param {Function} done
|
9227 | */
|
9228 |
|
9229 |
|
9230 | _createClass(ActionSheetAnimator, [{
|
9231 | key: "show",
|
9232 | value: function show(dialog, done) {
|
9233 | done();
|
9234 | }
|
9235 | /**
|
9236 | * @param {HTMLElement} dialog
|
9237 | * @param {Function} done
|
9238 | */
|
9239 |
|
9240 | }, {
|
9241 | key: "hide",
|
9242 | value: function hide(dialog, done) {
|
9243 | done();
|
9244 | }
|
9245 | }]);
|
9246 |
|
9247 | return ActionSheetAnimator;
|
9248 | }(BaseAnimator);
|
9249 | /**
|
9250 | * Android style animator for Action Sheet.
|
9251 | */
|
9252 |
|
9253 | var MDActionSheetAnimator = /*#__PURE__*/function (_ActionSheetAnimator) {
|
9254 | _inherits(MDActionSheetAnimator, _ActionSheetAnimator);
|
9255 |
|
9256 | var _super2 = _createSuper(MDActionSheetAnimator);
|
9257 |
|
9258 | function MDActionSheetAnimator() {
|
9259 | var _this;
|
9260 |
|
9261 | var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
9262 | _ref2$timing = _ref2.timing,
|
9263 | timing = _ref2$timing === void 0 ? 'ease' : _ref2$timing,
|
9264 | _ref2$delay = _ref2.delay,
|
9265 | delay = _ref2$delay === void 0 ? 0 : _ref2$delay,
|
9266 | _ref2$duration = _ref2.duration,
|
9267 | duration = _ref2$duration === void 0 ? 0.4 : _ref2$duration;
|
9268 |
|
9269 | _classCallCheck(this, MDActionSheetAnimator);
|
9270 |
|
9271 | _this = _super2.call(this, {
|
9272 | timing: timing,
|
9273 | delay: delay,
|
9274 | duration: duration
|
9275 | });
|
9276 | _this.maskTiming = 'linear';
|
9277 | _this.maskDuration = 0.2;
|
9278 | return _this;
|
9279 | }
|
9280 | /**
|
9281 | * @param {Object} dialog
|
9282 | * @param {Function} callback
|
9283 | */
|
9284 |
|
9285 |
|
9286 | _createClass(MDActionSheetAnimator, [{
|
9287 | key: "show",
|
9288 | value: function show(dialog, callback) {
|
9289 | Animit.runAll(Animit(dialog._mask).queue({
|
9290 | opacity: 0
|
9291 | }).wait(this.delay).queue({
|
9292 | opacity: 1.0
|
9293 | }, {
|
9294 | duration: this.maskDuration,
|
9295 | timing: this.maskTiming
|
9296 | }), Animit(dialog._sheet, this.def).default({
|
9297 | transform: "translate3d(0, 80%, 0)",
|
9298 | opacity: 0
|
9299 | }, {
|
9300 | transform: 'translate3d(0, 0, 0)',
|
9301 | opacity: 1
|
9302 | }).queue(function (done) {
|
9303 | callback && callback();
|
9304 | done();
|
9305 | }));
|
9306 | }
|
9307 | /**
|
9308 | * @param {Object} dialog
|
9309 | * @param {Function} callback
|
9310 | */
|
9311 |
|
9312 | }, {
|
9313 | key: "hide",
|
9314 | value: function hide(dialog, callback) {
|
9315 | Animit.runAll(Animit(dialog._mask).queue({
|
9316 | opacity: 1
|
9317 | }).wait(this.delay).queue({
|
9318 | opacity: 0
|
9319 | }, {
|
9320 | duration: this.maskDuration,
|
9321 | timing: this.maskTiming
|
9322 | }), Animit(dialog._sheet, this.def).default({
|
9323 | transform: 'translate3d(0, 0, 0)',
|
9324 | opacity: 1
|
9325 | }, {
|
9326 | transform: "translate3d(0, 80%, 0)",
|
9327 | opacity: 0
|
9328 | }).queue(function (done) {
|
9329 | callback && callback();
|
9330 | done();
|
9331 | }));
|
9332 | }
|
9333 | }]);
|
9334 |
|
9335 | return MDActionSheetAnimator;
|
9336 | }(ActionSheetAnimator);
|
9337 | /**
|
9338 | * iOS style animator for dialog.
|
9339 | */
|
9340 |
|
9341 | var IOSActionSheetAnimator = /*#__PURE__*/function (_ActionSheetAnimator2) {
|
9342 | _inherits(IOSActionSheetAnimator, _ActionSheetAnimator2);
|
9343 |
|
9344 | var _super3 = _createSuper(IOSActionSheetAnimator);
|
9345 |
|
9346 | function IOSActionSheetAnimator() {
|
9347 | var _this2;
|
9348 |
|
9349 | var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
9350 | _ref3$timing = _ref3.timing,
|
9351 | timing = _ref3$timing === void 0 ? 'ease' : _ref3$timing,
|
9352 | _ref3$delay = _ref3.delay,
|
9353 | delay = _ref3$delay === void 0 ? 0 : _ref3$delay,
|
9354 | _ref3$duration = _ref3.duration,
|
9355 | duration = _ref3$duration === void 0 ? 0.3 : _ref3$duration;
|
9356 |
|
9357 | _classCallCheck(this, IOSActionSheetAnimator);
|
9358 |
|
9359 | _this2 = _super3.call(this, {
|
9360 | timing: timing,
|
9361 | delay: delay,
|
9362 | duration: duration
|
9363 | });
|
9364 | _this2.maskTiming = 'linear';
|
9365 | _this2.maskDuration = 0.2;
|
9366 |
|
9367 | if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
|
9368 | _this2.liftAmount = 'calc(100% + 48px)';
|
9369 | } else if (iPhoneXPatch.isIPhoneXLandscapePatchActive()) {
|
9370 | _this2.liftAmount = 'calc(100% + 33px)';
|
9371 | } else {
|
9372 | _this2.liftAmount = document.body.clientHeight / 2.0 - 1 + 'px'; // avoid Forced Synchronous Layout
|
9373 | }
|
9374 |
|
9375 | return _this2;
|
9376 | }
|
9377 | /**
|
9378 | * @param {Object} dialog
|
9379 | * @param {Function} callback
|
9380 | */
|
9381 |
|
9382 |
|
9383 | _createClass(IOSActionSheetAnimator, [{
|
9384 | key: "show",
|
9385 | value: function show(dialog, callback) {
|
9386 | Animit.runAll(Animit(dialog._mask).queue({
|
9387 | opacity: 0
|
9388 | }).wait(this.delay).queue({
|
9389 | opacity: 1
|
9390 | }, {
|
9391 | duration: this.maskDuration,
|
9392 | timing: this.maskTiming
|
9393 | }), Animit(dialog._sheet, this.def).default({
|
9394 | transform: "translate3d(0, ".concat(this.liftAmount, ", 0)")
|
9395 | }, {
|
9396 | transform: 'translate3d(0, 0, 0)'
|
9397 | }).queue(function (done) {
|
9398 | callback && callback();
|
9399 | done();
|
9400 | }));
|
9401 | }
|
9402 | /**
|
9403 | * @param {Object} dialog
|
9404 | * @param {Function} callback
|
9405 | */
|
9406 |
|
9407 | }, {
|
9408 | key: "hide",
|
9409 | value: function hide(dialog, callback) {
|
9410 | Animit.runAll(Animit(dialog._mask).queue({
|
9411 | opacity: 1
|
9412 | }).wait(this.delay).queue({
|
9413 | opacity: 0
|
9414 | }, {
|
9415 | duration: this.maskDuration,
|
9416 | timing: this.maskTiming
|
9417 | }), Animit(dialog._sheet, this.def).default({
|
9418 | transform: 'translate3d(0, 0, 0)'
|
9419 | }, {
|
9420 | transform: "translate3d(0, ".concat(this.liftAmount, ", 0)")
|
9421 | }).queue(function (done) {
|
9422 | callback && callback();
|
9423 | done();
|
9424 | }));
|
9425 | }
|
9426 | }]);
|
9427 |
|
9428 | return IOSActionSheetAnimator;
|
9429 | }(ActionSheetAnimator);
|
9430 |
|
9431 | var BaseDialogElement = /*#__PURE__*/function (_BaseElement) {
|
9432 | _inherits(BaseDialogElement, _BaseElement);
|
9433 |
|
9434 | var _super = _createSuper(BaseDialogElement);
|
9435 |
|
9436 | function BaseDialogElement() {
|
9437 | var _this;
|
9438 |
|
9439 | _classCallCheck(this, BaseDialogElement);
|
9440 |
|
9441 | _this = _super.call(this);
|
9442 |
|
9443 | if (_this.constructor === BaseDialogElement) {
|
9444 | util$4.throwAbstract();
|
9445 | }
|
9446 |
|
9447 | _this._visible = false;
|
9448 | _this._doorLock = new DoorLock();
|
9449 | _this._cancel = _this._cancel.bind(_assertThisInitialized(_this));
|
9450 | _this._selfCamelName = util$4.camelize(_this.tagName.slice(4));
|
9451 |
|
9452 | _this._defaultDBB = function (e) {
|
9453 | return _this.cancelable ? _this._cancel() : e.callParentHandler();
|
9454 | };
|
9455 |
|
9456 | _this._animatorFactory = _this._updateAnimatorFactory();
|
9457 | return _this;
|
9458 | }
|
9459 |
|
9460 | _createClass(BaseDialogElement, [{
|
9461 | key: "_scheme",
|
9462 | get: function get() {
|
9463 | // eslint-disable-line getter-return
|
9464 | util$4.throwMember();
|
9465 | }
|
9466 | }, {
|
9467 | key: "_updateAnimatorFactory",
|
9468 | value: function _updateAnimatorFactory() {
|
9469 | util$4.throwMember();
|
9470 | }
|
9471 | }, {
|
9472 | key: "_toggleStyle",
|
9473 | value: function _toggleStyle(shouldShow) {
|
9474 | this.style.display = shouldShow ? 'block' : 'none';
|
9475 | }
|
9476 | }, {
|
9477 | key: "onDeviceBackButton",
|
9478 | get: function get() {
|
9479 | return this._backButtonHandler;
|
9480 | },
|
9481 | set: function set(callback) {
|
9482 | if (this._backButtonHandler) {
|
9483 | this._backButtonHandler.destroy();
|
9484 | }
|
9485 |
|
9486 | this._backButtonCallback = callback;
|
9487 | this._backButtonHandler = deviceBackButtonDispatcher.createHandler(this, callback);
|
9488 | }
|
9489 | }, {
|
9490 | key: "_cancel",
|
9491 | value: function _cancel() {
|
9492 | var _this2 = this;
|
9493 |
|
9494 | if (this.cancelable && !this._running) {
|
9495 | this._running = true;
|
9496 | this.hide().then(function () {
|
9497 | _this2._running = false;
|
9498 | util$4.triggerElementEvent(_this2, 'dialogcancel');
|
9499 | util$4.triggerElementEvent(_this2, 'dialog-cancel'); // dialog-cancel is deprecated but still emit to avoid breaking user code
|
9500 | }, function () {
|
9501 | return _this2._running = false;
|
9502 | });
|
9503 | }
|
9504 | }
|
9505 | }, {
|
9506 | key: "show",
|
9507 | value: function show() {
|
9508 | var _this3 = this;
|
9509 |
|
9510 | for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
9511 | args[_key] = arguments[_key];
|
9512 | }
|
9513 |
|
9514 | return this._setVisible.apply(this, [true].concat(args)).then(function (dialog) {
|
9515 | _this3.visible = true;
|
9516 | return dialog;
|
9517 | });
|
9518 | }
|
9519 | }, {
|
9520 | key: "hide",
|
9521 | value: function hide() {
|
9522 | var _this4 = this;
|
9523 |
|
9524 | for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
9525 | args[_key2] = arguments[_key2];
|
9526 | }
|
9527 |
|
9528 | return this._setVisible.apply(this, [false].concat(args)).then(function (dialog) {
|
9529 | _this4.visible = false;
|
9530 | return dialog;
|
9531 | });
|
9532 | }
|
9533 | }, {
|
9534 | key: "toggle",
|
9535 | value: function toggle() {
|
9536 | var _this5 = this;
|
9537 |
|
9538 | for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
|
9539 | args[_key3] = arguments[_key3];
|
9540 | }
|
9541 |
|
9542 | return this._setVisible.apply(this, [!this.visible].concat(args)).then(function (dialog) {
|
9543 | _this5.visible = _this5._visible;
|
9544 | return dialog;
|
9545 | });
|
9546 | }
|
9547 | }, {
|
9548 | key: "_setVisible",
|
9549 | value: function _setVisible(shouldShow) {
|
9550 | var _util$triggerElementE,
|
9551 | _this6 = this;
|
9552 |
|
9553 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
9554 | var action = shouldShow ? 'show' : 'hide';
|
9555 | options = _objectSpread2({}, options);
|
9556 | options.animationOptions = util$4.extend(options.animationOptions || {}, this.animationOptions);
|
9557 | var canceled = false;
|
9558 | util$4.triggerElementEvent(this, "pre".concat(action), (_util$triggerElementE = {}, _defineProperty(_util$triggerElementE, this._selfCamelName, this), _defineProperty(_util$triggerElementE, "cancel", function cancel() {
|
9559 | return canceled = true;
|
9560 | }), _util$triggerElementE));
|
9561 |
|
9562 | if (canceled) {
|
9563 | return Promise.reject("Canceled in pre".concat(action, " event."));
|
9564 | }
|
9565 |
|
9566 | return new Promise(function (resolve) {
|
9567 | _this6._doorLock.waitUnlock(function () {
|
9568 | var unlock = _this6._doorLock.lock();
|
9569 |
|
9570 | var animator = _this6._animatorFactory.newAnimator(options);
|
9571 |
|
9572 | shouldShow && _this6._toggleStyle(true, options);
|
9573 | _this6._visible = shouldShow;
|
9574 | util$4.iosPageScrollFix(shouldShow);
|
9575 | contentReady(_this6, function () {
|
9576 | animator[action](_this6, function () {
|
9577 | !shouldShow && _this6._toggleStyle(false, options);
|
9578 | unlock();
|
9579 | util$4.propagateAction(_this6, '_' + action);
|
9580 | util$4.triggerElementEvent(_this6, 'post' + action, _defineProperty({}, _this6._selfCamelName, _this6)); // postshow posthide
|
9581 |
|
9582 | if (options.callback instanceof Function) {
|
9583 | options.callback(_this6);
|
9584 | }
|
9585 |
|
9586 | resolve(_this6);
|
9587 | });
|
9588 | });
|
9589 | });
|
9590 | });
|
9591 | }
|
9592 | }, {
|
9593 | key: "maskColor",
|
9594 | get: function get() {
|
9595 | return this.getAttribute('mask-color');
|
9596 | },
|
9597 | set: function set(value) {
|
9598 | if (value === null || value === undefined) {
|
9599 | this.removeAttribute('mask-color');
|
9600 | } else {
|
9601 | this.setAttribute('mask-color', value);
|
9602 | }
|
9603 | }
|
9604 | }, {
|
9605 | key: "animationOptions",
|
9606 | get: function get() {
|
9607 | return AnimatorFactory.parseAnimationOptionsString(this.getAttribute('animation-options'));
|
9608 | },
|
9609 | set: function set(value) {
|
9610 | if (value === undefined || value === null) {
|
9611 | this.removeAttribute('animation-options');
|
9612 | } else {
|
9613 | this.setAttribute('animation-options', JSON.stringify(value));
|
9614 | }
|
9615 | }
|
9616 | }, {
|
9617 | key: "_updateMask",
|
9618 | value: function _updateMask() {
|
9619 | var _this7 = this;
|
9620 |
|
9621 | contentReady(this, function () {
|
9622 | if (_this7._mask) {
|
9623 | _this7._mask.style.backgroundColor = _this7.maskColor;
|
9624 | }
|
9625 | });
|
9626 | }
|
9627 | }, {
|
9628 | key: "_updateAnimation",
|
9629 | value: function _updateAnimation() {
|
9630 | this._animatorFactory = this._updateAnimatorFactory();
|
9631 | }
|
9632 | }, {
|
9633 | key: "connectedCallback",
|
9634 | value: function connectedCallback() {
|
9635 | var _this8 = this;
|
9636 |
|
9637 | if (typeof this._backButtonCallback === 'function') {
|
9638 | this.onDeviceBackButton = this._backButtonCallback;
|
9639 | } else if (typeof this._defaultDBB === 'function') {
|
9640 | this.onDeviceBackButton = this._defaultDBB.bind(this);
|
9641 | }
|
9642 |
|
9643 | contentReady(this, function () {
|
9644 | if (_this8._mask) {
|
9645 | _this8._mask.addEventListener('click', _this8._cancel, false);
|
9646 | }
|
9647 | });
|
9648 | }
|
9649 | }, {
|
9650 | key: "disconnectedCallback",
|
9651 | value: function disconnectedCallback() {
|
9652 | if (this._backButtonHandler) {
|
9653 | this._backButtonHandler.destroy();
|
9654 |
|
9655 | this._backButtonHandler = null;
|
9656 | }
|
9657 |
|
9658 | if (this._mask) {
|
9659 | this._mask.removeEventListener('click', this._cancel, false);
|
9660 | }
|
9661 | }
|
9662 | }, {
|
9663 | key: "attributeChangedCallback",
|
9664 | value: function attributeChangedCallback(name, last, current) {
|
9665 | var _this9 = this;
|
9666 |
|
9667 | switch (name) {
|
9668 | case 'modifier':
|
9669 | ModifierUtil.onModifierChanged(last, current, this, this._scheme);
|
9670 | break;
|
9671 |
|
9672 | case 'animation':
|
9673 | this._updateAnimation();
|
9674 |
|
9675 | break;
|
9676 |
|
9677 | case 'mask-color':
|
9678 | this._updateMask();
|
9679 |
|
9680 | break;
|
9681 |
|
9682 | case 'visible':
|
9683 | if (this.visible !== this._visible) {
|
9684 | // update the mask and animation early in case `visible` attribute
|
9685 | // changed callback is called before `animation` or `mask-color`
|
9686 | this._updateMask();
|
9687 |
|
9688 | this._updateAnimation();
|
9689 |
|
9690 | contentReady(this, function () {
|
9691 | _this9._setVisible(_this9.visible);
|
9692 | });
|
9693 | }
|
9694 |
|
9695 | break;
|
9696 | }
|
9697 | }
|
9698 | }], [{
|
9699 | key: "observedAttributes",
|
9700 | get: function get() {
|
9701 | return ['modifier', 'animation', 'mask-color', 'visible'];
|
9702 | }
|
9703 | }, {
|
9704 | key: "events",
|
9705 | get: function get() {
|
9706 | return ['preshow', 'postshow', 'prehide', 'posthide', 'dialogcancel', 'dialog-cancel'];
|
9707 | }
|
9708 | }]);
|
9709 |
|
9710 | return BaseDialogElement;
|
9711 | }(BaseElement);
|
9712 | util$4.defineBooleanProperties(BaseDialogElement, ['visible', 'disabled', 'cancelable']);
|
9713 |
|
9714 | var scheme$v = {
|
9715 | '.action-sheet': 'action-sheet--*',
|
9716 | '.action-sheet-mask': 'action-sheet-mask--*',
|
9717 | '.action-sheet-title': 'action-sheet-title--*'
|
9718 | };
|
9719 | var _animatorDict$8 = {
|
9720 | 'default': function _default() {
|
9721 | return platform.isAndroid() ? MDActionSheetAnimator : IOSActionSheetAnimator;
|
9722 | },
|
9723 | 'none': ActionSheetAnimator
|
9724 | };
|
9725 | /**
|
9726 | * @element ons-action-sheet
|
9727 | * @category dialog
|
9728 | * @description
|
9729 | * [en]
|
9730 | * Action/bottom sheet that is displayed on top of current screen.
|
9731 | *
|
9732 | * This element can either be attached directly to the `<body>` or dynamically created from a template using the `ons.createElement(template, { append: true })` utility function and the `<template>` tag.
|
9733 | *
|
9734 | * The action sheet is useful for displaying a list of options and asking the user to make a decision. A `ons-action-sheet-button` is provided for this purpose, although it can contain any type of content.
|
9735 | *
|
9736 | * It will automatically be displayed as Material Design (bottom sheet) when running on an Android device.
|
9737 | * [/en]
|
9738 | * [ja]
|
9739 | * アクションシート、もしくはボトムシートを現在のスクリーン上に表示します。
|
9740 | *
|
9741 | * この要素は、`<body>`要素に直接アタッチされるか、もしくは`ons.createElement(template, { append: true })`と`<template>`タグを使ってテンプレートから動的に生成されます。
|
9742 | *
|
9743 | * アクションシートは、選択肢のリストを表示してユーザーに尋ねるのに便利です。`ons-action-sheet-button`は、この要素の中に置くために提供されていますが、それ以外にも他のどのような要素を含むことができます。
|
9744 | *
|
9745 | * Androidデバイスで実行されるときには、自動的にマテリアルデザイン(ボトムシート)として表示されます。
|
9746 | * [/ja]
|
9747 | * @modifier material
|
9748 | * [en]Display a Material Design bottom sheet.[/en]
|
9749 | * [ja]マテリアルデザインのボトムシートを表示します。[/ja]
|
9750 | * @tutorial vanilla/reference/action-sheet
|
9751 | * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
|
9752 | * @seealso ons-popover
|
9753 | * [en]`<ons-popover>` component[/en]
|
9754 | * [ja]ons-popoverコンポーネント[/ja]
|
9755 | * @seealso ons-modal
|
9756 | * [en]`<ons-modal>` component[/en]
|
9757 | * [ja]ons-modalコンポーネント[/ja]
|
9758 | * @example
|
9759 | * <ons-action-sheet id="sheet">
|
9760 | * <ons-action-sheet-button>Label</ons-action-sheet-button>
|
9761 | * <ons-action-sheet-button>Label</ons-action-sheet-button>
|
9762 | * </ons-action-sheet>
|
9763 | *
|
9764 | * <script>
|
9765 | * document.getElementById('sheet').show();
|
9766 | * </script>
|
9767 | */
|
9768 |
|
9769 | var ActionSheetElement = /*#__PURE__*/function (_BaseDialogElement) {
|
9770 | _inherits(ActionSheetElement, _BaseDialogElement);
|
9771 |
|
9772 | var _super = _createSuper(ActionSheetElement);
|
9773 |
|
9774 | /**
|
9775 | * @event preshow
|
9776 | * @description
|
9777 | * [en]Fired just before the action sheet is displayed.[/en]
|
9778 | * [ja]ダイアログが表示される直前に発火します。[/ja]
|
9779 | * @param {Object} event [en]Event object.[/en]
|
9780 | * @param {Object} event.actionSheet
|
9781 | * [en]Component object.[/en]
|
9782 | * [ja]コンポーネントのオブジェクト。[/ja]
|
9783 | * @param {Function} event.cancel
|
9784 | * [en]Execute this function to stop the action sheet from being shown.[/en]
|
9785 | * [ja]この関数を実行すると、ダイアログの表示がキャンセルされます。[/ja]
|
9786 | */
|
9787 |
|
9788 | /**
|
9789 | * @event postshow
|
9790 | * @description
|
9791 | * [en]Fired just after the action sheet is displayed.[/en]
|
9792 | * [ja]ダイアログが表示された直後に発火します。[/ja]
|
9793 | * @param {Object} event [en]Event object.[/en]
|
9794 | * @param {Object} event.actionSheet
|
9795 | * [en]Component object.[/en]
|
9796 | * [ja]コンポーネントのオブジェクト。[/ja]
|
9797 | */
|
9798 |
|
9799 | /**
|
9800 | * @event prehide
|
9801 | * @description
|
9802 | * [en]Fired just before the action sheet is hidden.[/en]
|
9803 | * [ja]ダイアログが隠れる直前に発火します。[/ja]
|
9804 | * @param {Object} event [en]Event object.[/en]
|
9805 | * @param {Object} event.actionSheet
|
9806 | * [en]Component object.[/en]
|
9807 | * [ja]コンポーネントのオブジェクト。[/ja]
|
9808 | * @param {Function} event.cancel
|
9809 | * [en]Execute this function to stop the action sheet from being hidden.[/en]
|
9810 | * [ja]この関数を実行すると、ダイアログの非表示がキャンセルされます。[/ja]
|
9811 | */
|
9812 |
|
9813 | /**
|
9814 | * @event posthide
|
9815 | * @description
|
9816 | * [en]Fired just after the action sheet is hidden.[/en]
|
9817 | * [ja]ダイアログが隠れた後に発火します。[/ja]
|
9818 | * @param {Object} event [en]Event object.[/en]
|
9819 | * @param {Object} event.actionSheet
|
9820 | * [en]Component object.[/en]
|
9821 | * [ja]コンポーネントのオブジェクト。[/ja]
|
9822 | */
|
9823 |
|
9824 | /**
|
9825 | * @event dialogcancel
|
9826 | * @description
|
9827 | * [en]Fired when the action sheet is canceled.[/en]
|
9828 | * [ja][/ja]
|
9829 | */
|
9830 |
|
9831 | /**
|
9832 | * @attribute title
|
9833 | * @type {String}
|
9834 | * @description
|
9835 | * [en]Optional title of the action sheet. A new element will be created containing this string.[/en]
|
9836 | * [ja]アクションシートのタイトルを指定します。ここで指定した文字列を含む新しい要素が作成されます。[/ja]
|
9837 | */
|
9838 |
|
9839 | /**
|
9840 | * @property title
|
9841 | * @type {String}
|
9842 | * @description
|
9843 | * [en]Optional title of the action sheet. A new element will be created containing this string.[/en]
|
9844 | * [ja]アクションシートのタイトルを指定します。ここで指定した文字列を含む新しい要素が作成されます。[/ja]
|
9845 | */
|
9846 |
|
9847 | /**
|
9848 | * @attribute modifier
|
9849 | * @type {String}
|
9850 | * @description
|
9851 | * [en]The appearance of the action sheet.[/en]
|
9852 | * [ja]ダイアログの表現を指定します。[/ja]
|
9853 | */
|
9854 |
|
9855 | /**
|
9856 | * @attribute cancelable
|
9857 | * @description
|
9858 | * [en]If this attribute is set the action sheet can be closed by tapping the background or by pressing the back button on Android devices.[/en]
|
9859 | * [ja]この属性が設定されると、アクションシートの背景やAndroidデバイスのバックボタンを推すことでアクションシートが閉じるようになります。[/ja]
|
9860 | */
|
9861 |
|
9862 | /**
|
9863 | * @attribute disabled
|
9864 | * @description
|
9865 | * [en]If this attribute is set the action sheet is disabled.[/en]
|
9866 | * [ja]この属性がある時、ダイアログはdisabled状態になります。[/ja]
|
9867 | */
|
9868 |
|
9869 | /**
|
9870 | * @attribute animation
|
9871 | * @type {String}
|
9872 | * @default default
|
9873 | * @description
|
9874 | * [en]The animation used when showing and hiding the action sheet. Can be either `"none"` or `"default"`.[/en]
|
9875 | * [ja]ダイアログを表示する際のアニメーション名を指定します。"none"もしくは"default"を指定できます。[/ja]
|
9876 | */
|
9877 |
|
9878 | /**
|
9879 | * @attribute animation-options
|
9880 | * @type {Expression}
|
9881 | * @description
|
9882 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
9883 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/ja]
|
9884 | */
|
9885 |
|
9886 | /**
|
9887 | * @property animationOptions
|
9888 | * @type {Object}
|
9889 | * @description
|
9890 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
9891 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
|
9892 | */
|
9893 |
|
9894 | /**
|
9895 | * @attribute mask-color
|
9896 | * @type {String}
|
9897 | * @default rgba(0, 0, 0, 0.2)
|
9898 | * @description
|
9899 | * [en]Color of the background mask. Default is `"rgba(0, 0, 0, 0.2)"`.[/en]
|
9900 | * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
|
9901 | */
|
9902 |
|
9903 | /**
|
9904 | * @attribute visible
|
9905 | * @type {Boolean}
|
9906 | * @description
|
9907 | * [en]Whether the action sheet is visible or not.[/en]
|
9908 | * [ja]要素が見える場合に`true`。[/ja]
|
9909 | */
|
9910 | function ActionSheetElement() {
|
9911 | var _this;
|
9912 |
|
9913 | _classCallCheck(this, ActionSheetElement);
|
9914 |
|
9915 | _this = _super.call(this);
|
9916 | contentReady(_assertThisInitialized(_this), function () {
|
9917 | return _this._compile();
|
9918 | });
|
9919 | return _this;
|
9920 | }
|
9921 |
|
9922 | _createClass(ActionSheetElement, [{
|
9923 | key: "_scheme",
|
9924 | get: function get() {
|
9925 | return scheme$v;
|
9926 | }
|
9927 | }, {
|
9928 | key: "_mask",
|
9929 | get: function get() {
|
9930 | return util$4.findChild(this, '.action-sheet-mask');
|
9931 | }
|
9932 | }, {
|
9933 | key: "_sheet",
|
9934 | get: function get() {
|
9935 | return util$4.findChild(this, '.action-sheet');
|
9936 | }
|
9937 | }, {
|
9938 | key: "_title",
|
9939 | get: function get() {
|
9940 | return this.querySelector('.action-sheet-title');
|
9941 | }
|
9942 | }, {
|
9943 | key: "_updateAnimatorFactory",
|
9944 | value: function _updateAnimatorFactory() {
|
9945 | return new AnimatorFactory({
|
9946 | animators: _animatorDict$8,
|
9947 | baseClass: ActionSheetAnimator,
|
9948 | baseClassName: 'ActionSheetAnimator',
|
9949 | defaultAnimation: this.getAttribute('animation')
|
9950 | });
|
9951 | }
|
9952 | }, {
|
9953 | key: "_compile",
|
9954 | value: function _compile() {
|
9955 | autoStyle.prepare(this);
|
9956 | this.style.display = 'none';
|
9957 | this.style.zIndex = 10001;
|
9958 | /* Expected result:
|
9959 | * <ons-action-sheet>
|
9960 | * <div class="action-sheet-mask"></div>
|
9961 | * <div class="action-sheet">
|
9962 | * <div class="action-sheet-title></div>
|
9963 | * ...
|
9964 | * </div>
|
9965 | * </ons-action-sheet>
|
9966 | */
|
9967 |
|
9968 | if (!this._sheet) {
|
9969 | var sheet = document.createElement('div');
|
9970 | sheet.classList.add('action-sheet');
|
9971 |
|
9972 | while (this.firstChild) {
|
9973 | sheet.appendChild(this.firstChild);
|
9974 | }
|
9975 |
|
9976 | this.appendChild(sheet);
|
9977 | }
|
9978 |
|
9979 | if (!this._title) {
|
9980 | var title = document.createElement('div');
|
9981 | title.classList.add('action-sheet-title');
|
9982 |
|
9983 | if (this.title) {
|
9984 | title.innerHTML = this.title;
|
9985 | } else {
|
9986 | title.hidden = true;
|
9987 | }
|
9988 |
|
9989 | this._sheet.insertBefore(title, this._sheet.firstChild);
|
9990 | }
|
9991 |
|
9992 | if (!this._mask) {
|
9993 | var mask = document.createElement('div');
|
9994 | mask.classList.add('action-sheet-mask');
|
9995 | this.insertBefore(mask, this.firstChild);
|
9996 | }
|
9997 |
|
9998 | this._sheet.style.zIndex = 20001;
|
9999 | this._mask.style.zIndex = 20000;
|
10000 | ModifierUtil.initModifier(this, this._scheme);
|
10001 | }
|
10002 | }, {
|
10003 | key: "_updateTitle",
|
10004 | value: function _updateTitle() {
|
10005 | if (this._title) {
|
10006 | if (!this.title) {
|
10007 | this._title.hidden = true;
|
10008 | } else {
|
10009 | this._title.innerHTML = this.title;
|
10010 | this._title.hidden = false;
|
10011 | }
|
10012 | }
|
10013 | }
|
10014 | }, {
|
10015 | key: "title",
|
10016 | get: function get() {
|
10017 | return this.getAttribute('title');
|
10018 | },
|
10019 | set: function set(value) {
|
10020 | if (value === null || value === undefined) {
|
10021 | this.removeAttribute('title');
|
10022 | } else {
|
10023 | this.setAttribute('title', value);
|
10024 | }
|
10025 | }
|
10026 | /**
|
10027 | * @property onDeviceBackButton
|
10028 | * @type {Object}
|
10029 | * @description
|
10030 | * [en]Back-button handler.[/en]
|
10031 | * [ja]バックボタンハンドラ。[/ja]
|
10032 | */
|
10033 |
|
10034 | /**
|
10035 | * @property maskColor
|
10036 | * @type {String}
|
10037 | * @default rgba(0, 0, 0, 0.2)
|
10038 | * @description
|
10039 | * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)".[/en]
|
10040 | * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
|
10041 | */
|
10042 |
|
10043 | /**
|
10044 | * @method show
|
10045 | * @signature show([options])
|
10046 | * @param {Object} [options]
|
10047 | * [en]Parameter object.[/en]
|
10048 | * [ja]オプションを指定するオブジェクト。[/ja]
|
10049 | * @param {String} [options.animation]
|
10050 | * [en]Animation name. Available animations are `"none"` and `"slide"`.[/en]
|
10051 | * [ja]アニメーション名を指定します。"none", "slide"のいずれかを指定します。[/ja]
|
10052 | * @param {String} [options.animationOptions]
|
10053 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
|
10054 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}` [/ja]
|
10055 | * @param {Function} [options.callback]
|
10056 | * [en]This function is called after the action sheet has been revealed.[/en]
|
10057 | * [ja]ダイアログが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
|
10058 | * @description
|
10059 | * [en]Show the action sheet.[/en]
|
10060 | * [ja]ダイアログを開きます。[/ja]
|
10061 | * @return {Promise} Resolves to the displayed element.
|
10062 | */
|
10063 |
|
10064 | /**
|
10065 | * @method hide
|
10066 | * @signature hide([options])
|
10067 | * @param {Object} [options]
|
10068 | * [en]Parameter object.[/en]
|
10069 | * [ja]オプションを指定するオブジェクト。[/ja]
|
10070 | * @param {String} [options.animation]
|
10071 | * [en]Animation name. Available animations are `"none"` and `"slide"`.[/en]
|
10072 | * [ja]アニメーション名を指定します。"none", "slide"のいずれかを指定できます。[/ja]
|
10073 | * @param {String} [options.animationOptions]
|
10074 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
|
10075 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`[/ja]
|
10076 | * @param {Function} [options.callback]
|
10077 | * [en]This functions is called after the action sheet has been hidden.[/en]
|
10078 | * [ja]ダイアログが隠れた後に呼び出される関数オブジェクトを指定します。[/ja]
|
10079 | * @description
|
10080 | * [en]Hide the action sheet.[/en]
|
10081 | * [ja]ダイアログを閉じます。[/ja]
|
10082 | * @return {Promise}
|
10083 | * [en]Resolves to the hidden element[/en]
|
10084 | * [ja]隠れた要素を解決します。[/ja]
|
10085 | */
|
10086 |
|
10087 | /**
|
10088 | * @property visible
|
10089 | * @type {Boolean}
|
10090 | * @description
|
10091 | * [en]Whether the action sheet is visible or not.[/en]
|
10092 | * [ja]要素が見える場合に`true`。[/ja]
|
10093 | */
|
10094 |
|
10095 | /**
|
10096 | * @property disabled
|
10097 | * @type {Boolean}
|
10098 | * @description
|
10099 | * [en]Whether the action sheet is disabled or not.[/en]
|
10100 | * [ja]無効化されている場合に`true`。[/ja]
|
10101 | */
|
10102 |
|
10103 | /**
|
10104 | * @property cancelable
|
10105 | * @type {Boolean}
|
10106 | * @description
|
10107 | * [en]Whether the action sheet is cancelable or not. A cancelable action sheet can be closed by tapping the background or by pressing the back button on Android devices.[/en]
|
10108 | * [ja]アクションシートがキャンセル可能かどうかを設定します。キャンセル可能なアクションシートは、背景をタップしたりAndroidデバイスのバックボタンを推すことで閉じるようになります。[/ja]
|
10109 | */
|
10110 |
|
10111 | }, {
|
10112 | key: "attributeChangedCallback",
|
10113 | value: function attributeChangedCallback(name, last, current) {
|
10114 | if (name === 'title') {
|
10115 | this._updateTitle();
|
10116 | } else {
|
10117 | _get(_getPrototypeOf(ActionSheetElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
|
10118 | }
|
10119 | }
|
10120 | /**
|
10121 | * @param {String} name
|
10122 | * @param {ActionSheetAnimator} Animator
|
10123 | */
|
10124 |
|
10125 | }], [{
|
10126 | key: "observedAttributes",
|
10127 | get: function get() {
|
10128 | return [].concat(_toConsumableArray(_get(_getPrototypeOf(ActionSheetElement), "observedAttributes", this)), ['title']);
|
10129 | }
|
10130 | }, {
|
10131 | key: "registerAnimator",
|
10132 | value: function registerAnimator(name, Animator) {
|
10133 | if (!(Animator.prototype instanceof ActionSheetAnimator)) {
|
10134 | util$4.throwAnimator('ActionSheet');
|
10135 | }
|
10136 |
|
10137 | _animatorDict$8[name] = Animator;
|
10138 | }
|
10139 | }, {
|
10140 | key: "animators",
|
10141 | get: function get() {
|
10142 | return _animatorDict$8;
|
10143 | }
|
10144 | }, {
|
10145 | key: "ActionSheetAnimator",
|
10146 | get: function get() {
|
10147 | return ActionSheetAnimator;
|
10148 | }
|
10149 | }]);
|
10150 |
|
10151 | return ActionSheetElement;
|
10152 | }(BaseDialogElement);
|
10153 | onsElements.ActionSheet = ActionSheetElement;
|
10154 | customElements.define('ons-action-sheet', ActionSheetElement);
|
10155 |
|
10156 | /**
|
10157 | * @class AnimatorCSS - implementation of Animator class using css transitions
|
10158 | */
|
10159 |
|
10160 | var AnimatorCSS = /*#__PURE__*/function () {
|
10161 | function AnimatorCSS() {
|
10162 | _classCallCheck(this, AnimatorCSS);
|
10163 |
|
10164 | this._queue = [];
|
10165 | this._index = 0;
|
10166 | }
|
10167 |
|
10168 | _createClass(AnimatorCSS, [{
|
10169 | key: "animate",
|
10170 | value:
|
10171 | /**
|
10172 | * @method animate
|
10173 | * @desc main animation function
|
10174 | * @param {Element} element
|
10175 | * @param {Object} finalCSS
|
10176 | * @param {number} [duration=200] - duration in milliseconds
|
10177 | * @return {Object} result
|
10178 | * @return {Function} result.then(callback) - sets a callback to be executed after the animation has stopped
|
10179 | * @return {Function} result.stop(options) - stops the animation; if options.stopNext is true then it doesn't call the callback
|
10180 | * @return {Function} result.finish(ms) - finishes the animation in the specified time in milliseconds
|
10181 | * @return {Function} result.speed(ms) - sets the animation speed so that it finishes as if the original duration was the one specified here
|
10182 | * @example
|
10183 | * ````
|
10184 | * var result = animator.animate(el, {opacity: 0.5}, 1000);
|
10185 | *
|
10186 | * el.addEventListener('click', function(e){
|
10187 | * result.speed(200).then(function(){
|
10188 | * console.log('done');
|
10189 | * });
|
10190 | * }, 300);
|
10191 | * ````
|
10192 | */
|
10193 | function animate(el, final) {
|
10194 | var duration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 200;
|
10195 | var start = new Date().getTime(),
|
10196 | initial = {},
|
10197 | stopped = false,
|
10198 | next = false,
|
10199 | timeout = false,
|
10200 | properties = Object.keys(final);
|
10201 |
|
10202 | var updateStyles = function updateStyles() {
|
10203 | var s = window.getComputedStyle(el);
|
10204 | properties.forEach(s.getPropertyValue.bind(s));
|
10205 | s = el.offsetHeight;
|
10206 | };
|
10207 |
|
10208 | var result = {
|
10209 | stop: function stop() {
|
10210 | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
10211 | timeout && clearTimeout(timeout);
|
10212 | var k = Math.min(1, (new Date().getTime() - start) / duration);
|
10213 | properties.forEach(function (i) {
|
10214 | el.style[i] = (1 - k) * initial[i] + k * final[i] + (i == 'opacity' ? '' : 'px');
|
10215 | });
|
10216 | el.style.transitionDuration = '0s';
|
10217 |
|
10218 | if (options.stopNext) {
|
10219 | next = false;
|
10220 | } else if (!stopped) {
|
10221 | stopped = true;
|
10222 | next && next();
|
10223 | }
|
10224 |
|
10225 | return result;
|
10226 | },
|
10227 | then: function then(cb) {
|
10228 | next = cb;
|
10229 |
|
10230 | if (stopped) {
|
10231 | next && next();
|
10232 | }
|
10233 |
|
10234 | return result;
|
10235 | },
|
10236 | speed: function speed(newDuration) {
|
10237 | if (internal$1.config.animationsDisabled) {
|
10238 | newDuration = 0;
|
10239 | }
|
10240 |
|
10241 | if (!stopped) {
|
10242 | timeout && clearTimeout(timeout);
|
10243 | var passed = new Date().getTime() - start;
|
10244 | var k = passed / duration;
|
10245 | var remaining = newDuration * (1 - k);
|
10246 | properties.forEach(function (i) {
|
10247 | el.style[i] = (1 - k) * initial[i] + k * final[i] + (i == 'opacity' ? '' : 'px');
|
10248 | });
|
10249 | updateStyles();
|
10250 | start = el.speedUpTime;
|
10251 | duration = remaining;
|
10252 | el.style.transitionDuration = duration / 1000 + 's';
|
10253 | properties.forEach(function (i) {
|
10254 | el.style[i] = final[i] + (i == 'opacity' ? '' : 'px');
|
10255 | });
|
10256 | timeout = setTimeout(result.stop, remaining);
|
10257 | }
|
10258 |
|
10259 | return result;
|
10260 | },
|
10261 | finish: function finish() {
|
10262 | var milliseconds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 50;
|
10263 | var k = (new Date().getTime() - start) / duration;
|
10264 | result.speed(milliseconds / (1 - k));
|
10265 | return result;
|
10266 | }
|
10267 | };
|
10268 |
|
10269 | if (el.hasAttribute('disabled') || stopped || internal$1.config.animationsDisabled) {
|
10270 | return result;
|
10271 | }
|
10272 |
|
10273 | var style = window.getComputedStyle(el);
|
10274 | properties.forEach(function (e) {
|
10275 | var v = parseFloat(style.getPropertyValue(e));
|
10276 | initial[e] = isNaN(v) ? 0 : v;
|
10277 | });
|
10278 |
|
10279 | if (!stopped) {
|
10280 | el.style.transitionProperty = properties.join(',');
|
10281 | el.style.transitionDuration = duration / 1000 + 's';
|
10282 | properties.forEach(function (e) {
|
10283 | el.style[e] = final[e] + (e == 'opacity' ? '' : 'px');
|
10284 | });
|
10285 | }
|
10286 |
|
10287 | timeout = setTimeout(result.stop, duration);
|
10288 |
|
10289 | this._onStopAnimations(el, result.stop);
|
10290 |
|
10291 | return result;
|
10292 | }
|
10293 | }, {
|
10294 | key: "_onStopAnimations",
|
10295 | value: function _onStopAnimations(el, listener) {
|
10296 | var queue = this._queue;
|
10297 | var i = this._index++;
|
10298 | queue[el] = queue[el] || [];
|
10299 |
|
10300 | queue[el][i] = function (options) {
|
10301 | delete queue[el][i];
|
10302 |
|
10303 | if (queue[el] && queue[el].length == 0) {
|
10304 | delete queue[el];
|
10305 | }
|
10306 |
|
10307 | return listener(options);
|
10308 | };
|
10309 | }
|
10310 | /**
|
10311 | * @method stopAnimations
|
10312 | * @desc stops active animations on a specified element
|
10313 | * @param {Element|Array} element - element or array of elements
|
10314 | * @param {Object} [options={}]
|
10315 | * @param {Boolean} [options.stopNext] - the callbacks after the animations won't be called if this option is true
|
10316 | */
|
10317 |
|
10318 | }, {
|
10319 | key: "stopAnimations",
|
10320 | value: function stopAnimations(el) {
|
10321 | var _this = this;
|
10322 |
|
10323 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
10324 |
|
10325 | if (Array.isArray(el)) {
|
10326 | return el.forEach(function (el) {
|
10327 | _this.stopAnimations(el, options);
|
10328 | });
|
10329 | }
|
10330 |
|
10331 | (this._queue[el] || []).forEach(function (e) {
|
10332 | e(options || {});
|
10333 | });
|
10334 | }
|
10335 | /**
|
10336 | * @method stopAll
|
10337 | * @desc stops all active animations
|
10338 | * @param {Object} [options={}]
|
10339 | * @param {Boolean} [options.stopNext] - the callbacks after the animations won't be called if this option is true
|
10340 | */
|
10341 |
|
10342 | }, {
|
10343 | key: "stopAll",
|
10344 | value: function stopAll() {
|
10345 | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
10346 | this.stopAnimations(Object.keys(this._queue), options);
|
10347 | }
|
10348 | /**
|
10349 | * @method fade
|
10350 | * @desc fades the element (short version for animate(el, {opacity: 0}))
|
10351 | * @param {Element} element
|
10352 | * @param {number} [duration=200]
|
10353 | */
|
10354 |
|
10355 | }, {
|
10356 | key: "fade",
|
10357 | value: function fade(el) {
|
10358 | var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;
|
10359 | return this.animate(el, {
|
10360 | opacity: 0
|
10361 | }, duration);
|
10362 | }
|
10363 | }]);
|
10364 |
|
10365 | return AnimatorCSS;
|
10366 | }();
|
10367 |
|
10368 | var defaultClassName$h = 'ripple';
|
10369 | var scheme$u = {
|
10370 | '': 'ripple--*',
|
10371 | '.ripple__wave': 'ripple--*__wave',
|
10372 | '.ripple__background': 'ripple--*__background'
|
10373 | };
|
10374 | /**
|
10375 | * @element ons-ripple
|
10376 | * @category visual
|
10377 | * @description
|
10378 | * [en]
|
10379 | * Adds a Material Design "ripple" effect to an element. The ripple effect will spread from the position where the user taps.
|
10380 | *
|
10381 | * Some elements such as `<ons-button>` and `<ons-fab>` support a `ripple` attribute.
|
10382 | * [/en]
|
10383 | * [ja]マテリアルデザインのリップル効果をDOM要素に追加します。[/ja]
|
10384 | * @codepen wKQWdZ
|
10385 | * @tutorial vanilla/Reference/ripple
|
10386 | * @modifier light-gray
|
10387 | * [en]Change the color of effects to light gray.[/en]
|
10388 | * [ja]エフェクトの色が明るい灰色になります。[/ja]
|
10389 | * @guide theming.html#cross-platform-styling-autostyling
|
10390 | * [en]Cross platform styling[/en]
|
10391 | * [ja]Cross platform styling[/ja]
|
10392 | * @example
|
10393 | * <div class="my-div">
|
10394 | * <ons-ripple></ons-ripple>
|
10395 | * </div>
|
10396 | *
|
10397 | * @example
|
10398 | * <ons-button ripple>Click me!</ons-button>
|
10399 | */
|
10400 |
|
10401 | var RippleElement = /*#__PURE__*/function (_BaseElement) {
|
10402 | _inherits(RippleElement, _BaseElement);
|
10403 |
|
10404 | var _super = _createSuper(RippleElement);
|
10405 |
|
10406 | /**
|
10407 | * @attribute color
|
10408 | * @type {String}
|
10409 | * @description
|
10410 | * [en]Color of the ripple effect.[/en]
|
10411 | * [ja]リップルエフェクトの色を指定します。[/ja]
|
10412 | */
|
10413 |
|
10414 | /**
|
10415 | * @attribute modifier
|
10416 | * @type {String}
|
10417 | * @description
|
10418 | * [en]The appearance of the ripple effect.[/en]
|
10419 | * [ja]エフェクトの表現を指定します。[/ja]
|
10420 | */
|
10421 |
|
10422 | /**
|
10423 | * @attribute background
|
10424 | * @type {String}
|
10425 | * @description
|
10426 | * [en]Color of the background.[/en]
|
10427 | * [ja]背景の色を設定します。[/ja]
|
10428 | */
|
10429 |
|
10430 | /**
|
10431 | * @attribute size
|
10432 | * @type {String}
|
10433 | * @description
|
10434 | * [en]Sizing of the wave on ripple effect. Set "cover" or "contain". Default is "cover".[/en]
|
10435 | * [ja]エフェクトのサイズを指定します。"cover"もしくは"contain"を指定します。デフォルトは"cover"です。[/ja]
|
10436 | */
|
10437 |
|
10438 | /**
|
10439 | * @attribute center
|
10440 | * @type {Boolean}
|
10441 | * @description
|
10442 | * [en]If this attribute presents, change the position of wave effect to center of the target element.[/en]
|
10443 | * [ja]この要素を設定すると、エフェクトの位置が要素の真ん中から始まります。[/ja]
|
10444 | */
|
10445 |
|
10446 | /**
|
10447 | * @property center
|
10448 | * @type {Boolean}
|
10449 | * @description
|
10450 | * [en]If this attribute presents, change the position of wave effect to center of the target element.[/en]
|
10451 | * [ja]この要素を設定すると、エフェクトの位置が要素の真ん中から始まります。[/ja]
|
10452 | */
|
10453 |
|
10454 | /**
|
10455 | * @attribute disabled
|
10456 | * @description
|
10457 | * [en]If this attribute is set, the ripple effect will be disabled.[/en]
|
10458 | * [ja]この属性が設定された場合、リップルエフェクトは無効になります。[/ja]
|
10459 | */
|
10460 | function RippleElement() {
|
10461 | var _this;
|
10462 |
|
10463 | _classCallCheck(this, RippleElement);
|
10464 |
|
10465 | _this = _super.call(this);
|
10466 | _this._onTap = _this._onTap.bind(_assertThisInitialized(_this));
|
10467 | _this._onHold = _this._onHold.bind(_assertThisInitialized(_this));
|
10468 | _this._onDragStart = _this._onDragStart.bind(_assertThisInitialized(_this));
|
10469 | _this._onRelease = _this._onRelease.bind(_assertThisInitialized(_this));
|
10470 | contentReady(_assertThisInitialized(_this), function () {
|
10471 | return _this._compile();
|
10472 | });
|
10473 | _this._animator = new AnimatorCSS();
|
10474 | ['color', 'center', 'start-radius', 'background', 'modifier'].forEach(function (e) {
|
10475 | _this.attributeChangedCallback(e, null, _this.getAttribute(e));
|
10476 | });
|
10477 | return _this;
|
10478 | }
|
10479 |
|
10480 | _createClass(RippleElement, [{
|
10481 | key: "_compile",
|
10482 | value: function _compile() {
|
10483 | this.classList.add(defaultClassName$h);
|
10484 | this._wave = this.getElementsByClassName('ripple__wave')[0];
|
10485 | this._background = this.getElementsByClassName('ripple__background')[0];
|
10486 |
|
10487 | if (!(this._background && this._wave)) {
|
10488 | this._wave = util$4.create('.ripple__wave');
|
10489 | this._background = util$4.create('.ripple__background');
|
10490 | this.appendChild(this._wave);
|
10491 | this.appendChild(this._background);
|
10492 | }
|
10493 |
|
10494 | ModifierUtil.initModifier(this, scheme$u);
|
10495 | }
|
10496 | }, {
|
10497 | key: "_getEffectSize",
|
10498 | value: function _getEffectSize() {
|
10499 | var sizes = ['cover', 'contain'];
|
10500 |
|
10501 | if (this.hasAttribute('size')) {
|
10502 | var size = this.getAttribute('size');
|
10503 |
|
10504 | if (sizes.indexOf(size) !== -1) {
|
10505 | return size;
|
10506 | }
|
10507 | }
|
10508 |
|
10509 | return 'cover';
|
10510 | }
|
10511 | }, {
|
10512 | key: "_calculateCoords",
|
10513 | value: function _calculateCoords(e) {
|
10514 | var x, y, h, w, r;
|
10515 | var b = this.getBoundingClientRect();
|
10516 |
|
10517 | var size = this._getEffectSize();
|
10518 |
|
10519 | var error = function error() {
|
10520 | return util$4.throw('Ripple invalid state');
|
10521 | };
|
10522 |
|
10523 | if (this._center) {
|
10524 | x = b.width / 2;
|
10525 | y = b.height / 2;
|
10526 |
|
10527 | if (size === 'cover') {
|
10528 | r = Math.sqrt(x * x + y * y);
|
10529 | } else if (size === 'contain') {
|
10530 | r = Math.min(x, y);
|
10531 | } else {
|
10532 | error();
|
10533 | }
|
10534 | } else {
|
10535 | x = (typeof e.clientX === 'number' ? e.clientX : e.changedTouches[0].clientX) - b.left;
|
10536 | y = (typeof e.clientY === 'number' ? e.clientY : e.changedTouches[0].clientY) - b.top;
|
10537 | h = Math.max(y, b.height - y);
|
10538 | w = Math.max(x, b.width - x);
|
10539 |
|
10540 | if (size === 'cover') {
|
10541 | r = Math.sqrt(h * h + w * w);
|
10542 | } else if (size === 'contain') {
|
10543 | r = Math.min(Math.round(h / 2), Math.round(w / 2));
|
10544 | } else {
|
10545 | error();
|
10546 | }
|
10547 | }
|
10548 |
|
10549 | return {
|
10550 | x: x,
|
10551 | y: y,
|
10552 | r: r
|
10553 | };
|
10554 | }
|
10555 | }, {
|
10556 | key: "_rippleAnimation",
|
10557 | value: function _rippleAnimation(e) {
|
10558 | var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 300;
|
10559 | var _animator = this._animator,
|
10560 | _wave = this._wave,
|
10561 | _background = this._background,
|
10562 | _minR = this._minR;
|
10563 |
|
10564 | var _this$_calculateCoord = this._calculateCoords(e),
|
10565 | x = _this$_calculateCoord.x,
|
10566 | y = _this$_calculateCoord.y,
|
10567 | r = _this$_calculateCoord.r;
|
10568 |
|
10569 | _animator.stopAll({
|
10570 | stopNext: 1
|
10571 | });
|
10572 |
|
10573 | _animator.animate(_background, {
|
10574 | opacity: 1
|
10575 | }, duration);
|
10576 |
|
10577 | util$4.extend(_wave.style, {
|
10578 | opacity: 1,
|
10579 | top: y - _minR + 'px',
|
10580 | left: x - _minR + 'px',
|
10581 | width: 2 * _minR + 'px',
|
10582 | height: 2 * _minR + 'px'
|
10583 | });
|
10584 | return _animator.animate(_wave, {
|
10585 | top: y - r,
|
10586 | left: x - r,
|
10587 | height: 2 * r,
|
10588 | width: 2 * r
|
10589 | }, duration);
|
10590 | }
|
10591 | }, {
|
10592 | key: "_updateParent",
|
10593 | value: function _updateParent() {
|
10594 | if (!this._parentUpdated && this.parentNode) {
|
10595 | var computedStyle = window.getComputedStyle(this.parentNode);
|
10596 |
|
10597 | if (computedStyle.getPropertyValue('position') === 'static') {
|
10598 | this.parentNode.style.position = 'relative';
|
10599 | }
|
10600 |
|
10601 | this._parentUpdated = true;
|
10602 | }
|
10603 | }
|
10604 | }, {
|
10605 | key: "_onTap",
|
10606 | value: function _onTap(e) {
|
10607 | var _this2 = this;
|
10608 |
|
10609 | if (!this.disabled && !e.ripple) {
|
10610 | e.ripple = true;
|
10611 |
|
10612 | this._updateParent();
|
10613 |
|
10614 | this._rippleAnimation(e.gesture.srcEvent).then(function () {
|
10615 | _this2._animator.fade(_this2._wave);
|
10616 |
|
10617 | _this2._animator.fade(_this2._background);
|
10618 | });
|
10619 | }
|
10620 | }
|
10621 | }, {
|
10622 | key: "_onHold",
|
10623 | value: function _onHold(e) {
|
10624 | if (!this.disabled && !e.ripple) {
|
10625 | e.ripple = true;
|
10626 |
|
10627 | this._updateParent();
|
10628 |
|
10629 | this._holding = this._rippleAnimation(e.gesture.srcEvent, 2000);
|
10630 | document.addEventListener('release', this._onRelease);
|
10631 | }
|
10632 | }
|
10633 | }, {
|
10634 | key: "_onRelease",
|
10635 | value: function _onRelease(e) {
|
10636 | var _this3 = this;
|
10637 |
|
10638 | if (this._holding && !e.ripple) {
|
10639 | e.ripple = true;
|
10640 |
|
10641 | this._holding.speed(300).then(function () {
|
10642 | _this3._animator.stopAll({
|
10643 | stopNext: true
|
10644 | });
|
10645 |
|
10646 | _this3._animator.fade(_this3._wave);
|
10647 |
|
10648 | _this3._animator.fade(_this3._background);
|
10649 | });
|
10650 |
|
10651 | this._holding = false;
|
10652 | }
|
10653 |
|
10654 | document.removeEventListener('release', this._onRelease);
|
10655 | }
|
10656 | }, {
|
10657 | key: "_onDragStart",
|
10658 | value: function _onDragStart(e) {
|
10659 | if (this._holding) {
|
10660 | return this._onRelease(e);
|
10661 | }
|
10662 |
|
10663 | if (['left', 'right'].indexOf(e.gesture.direction) != -1) {
|
10664 | this._onTap(e);
|
10665 | }
|
10666 | }
|
10667 | }, {
|
10668 | key: "connectedCallback",
|
10669 | value: function connectedCallback() {
|
10670 | this._parentNode = this.parentNode;
|
10671 |
|
10672 | if (internal$1.config.animationsDisabled) {
|
10673 | this.disabled = true;
|
10674 | } else {
|
10675 | this._parentNode.addEventListener('tap', this._onTap);
|
10676 |
|
10677 | this._parentNode.addEventListener('hold', this._onHold);
|
10678 |
|
10679 | this._parentNode.addEventListener('dragstart', this._onDragStart);
|
10680 | }
|
10681 | }
|
10682 | }, {
|
10683 | key: "disconnectedCallback",
|
10684 | value: function disconnectedCallback() {
|
10685 | var pn = this._parentNode || this.parentNode;
|
10686 | pn.removeEventListener('tap', this._onTap);
|
10687 | pn.removeEventListener('hold', this._onHold);
|
10688 | pn.removeEventListener('dragstart', this._onDragStart);
|
10689 | }
|
10690 | }, {
|
10691 | key: "attributeChangedCallback",
|
10692 | value: function attributeChangedCallback(name, last, current) {
|
10693 | var _this4 = this;
|
10694 |
|
10695 | switch (name) {
|
10696 | case 'class':
|
10697 | util$4.restoreClass(this, defaultClassName$h, scheme$u);
|
10698 | break;
|
10699 |
|
10700 | case 'modifier':
|
10701 | ModifierUtil.onModifierChanged(last, current, this, scheme$u);
|
10702 | break;
|
10703 |
|
10704 | case 'start-radius':
|
10705 | this._minR = Math.max(0, parseFloat(current) || 0);
|
10706 | break;
|
10707 |
|
10708 | case 'color':
|
10709 | if (current) {
|
10710 | contentReady(this, function () {
|
10711 | _this4._wave.style.background = current;
|
10712 |
|
10713 | if (!_this4.hasAttribute('background')) {
|
10714 | _this4._background.style.background = current;
|
10715 | }
|
10716 | });
|
10717 | }
|
10718 |
|
10719 | break;
|
10720 |
|
10721 | case 'background':
|
10722 | if (current || last) {
|
10723 | if (current === 'none') {
|
10724 | contentReady(this, function () {
|
10725 | _this4._background.setAttribute('disabled', 'disabled');
|
10726 |
|
10727 | _this4._background.style.background = 'transparent';
|
10728 | });
|
10729 | } else {
|
10730 | contentReady(this, function () {
|
10731 | if (_this4._background.hasAttribute('disabled')) {
|
10732 | _this4._background.removeAttribute('disabled');
|
10733 | }
|
10734 |
|
10735 | _this4._background.style.background = current;
|
10736 | });
|
10737 | }
|
10738 | }
|
10739 |
|
10740 | break;
|
10741 |
|
10742 | case 'center':
|
10743 | if (name === 'center') {
|
10744 | this._center = current != null && current != 'false';
|
10745 | }
|
10746 |
|
10747 | break;
|
10748 | }
|
10749 | }
|
10750 | /**
|
10751 | * @property disabled
|
10752 | * @type {Boolean}
|
10753 | * @description
|
10754 | * [en]Whether the element is disabled or not.[/en]
|
10755 | * [ja]無効化されている場合に`true`。[/ja]
|
10756 | */
|
10757 |
|
10758 | }], [{
|
10759 | key: "observedAttributes",
|
10760 | get: function get() {
|
10761 | return ['start-radius', 'color', 'background', 'center', 'class', 'modifier'];
|
10762 | }
|
10763 | }]);
|
10764 |
|
10765 | return RippleElement;
|
10766 | }(BaseElement);
|
10767 | util$4.defineBooleanProperties(RippleElement, ['disabled', 'center']);
|
10768 | onsElements.Ripple = RippleElement;
|
10769 | customElements.define('ons-ripple', RippleElement);
|
10770 |
|
10771 | var BaseButtonElement = /*#__PURE__*/function (_BaseElement) {
|
10772 | _inherits(BaseButtonElement, _BaseElement);
|
10773 |
|
10774 | var _super = _createSuper(BaseButtonElement);
|
10775 |
|
10776 | function BaseButtonElement() {
|
10777 | var _this;
|
10778 |
|
10779 | _classCallCheck(this, BaseButtonElement);
|
10780 |
|
10781 | _this = _super.call(this);
|
10782 |
|
10783 | if (_this.constructor === BaseButtonElement) {
|
10784 | util$4.throwAbstract();
|
10785 | }
|
10786 |
|
10787 | contentReady(_assertThisInitialized(_this), function () {
|
10788 | return _this._compile();
|
10789 | });
|
10790 | return _this;
|
10791 | }
|
10792 |
|
10793 | _createClass(BaseButtonElement, [{
|
10794 | key: "_scheme",
|
10795 | get: function get() {
|
10796 | // eslint-disable-line getter-return
|
10797 | util$4.throwMember();
|
10798 | }
|
10799 | }, {
|
10800 | key: "_defaultClassName",
|
10801 | get: function get() {
|
10802 | // eslint-disable-line getter-return
|
10803 | util$4.throwMember();
|
10804 | }
|
10805 | }, {
|
10806 | key: "_rippleOpt",
|
10807 | get: function get() {
|
10808 | return [this];
|
10809 | }
|
10810 | }, {
|
10811 | key: "_icon",
|
10812 | get: function get() {
|
10813 | return util$4.findChild(this, 'ons-icon');
|
10814 | }
|
10815 | }, {
|
10816 | key: "_hiddenButton",
|
10817 | get: function get() {
|
10818 | return util$4.findChild(this, 'button');
|
10819 | }
|
10820 | }, {
|
10821 | key: "_compile",
|
10822 | value: function _compile() {
|
10823 | autoStyle.prepare(this);
|
10824 | this.classList.add(this._defaultClassName);
|
10825 |
|
10826 | if (!this._icon && this.hasAttribute('icon')) {
|
10827 | util$4.checkMissingImport('Icon');
|
10828 | var icon = util$4.createElement("<ons-icon icon=\"".concat(this.getAttribute('icon'), "\"></ons-icon>"));
|
10829 | icon.classList.add(this._defaultClassName.replace('button', 'icon'));
|
10830 | this.insertBefore(icon, this.firstChild);
|
10831 | } // Add hidden button to allow form submission
|
10832 |
|
10833 |
|
10834 | if (!this._hiddenButton) {
|
10835 | var button = util$4.createElement('<button hidden></button>');
|
10836 | this.appendChild(button);
|
10837 | }
|
10838 |
|
10839 | this._updateRipple();
|
10840 |
|
10841 | ModifierUtil.initModifier(this, this._scheme);
|
10842 | }
|
10843 | }, {
|
10844 | key: "_updateIcon",
|
10845 | value: function _updateIcon() {
|
10846 | if (this._icon) {
|
10847 | this._icon.setAttribute('icon', this.getAttribute('icon'));
|
10848 | }
|
10849 | }
|
10850 | }, {
|
10851 | key: "_updateRipple",
|
10852 | value: function _updateRipple() {
|
10853 | this._rippleOpt && util$4.updateRipple.apply(util$4, _toConsumableArray(this._rippleOpt));
|
10854 | }
|
10855 | }, {
|
10856 | key: "attributeChangedCallback",
|
10857 | value: function attributeChangedCallback(name, last, current) {
|
10858 | switch (name) {
|
10859 | case 'class':
|
10860 | util$4.restoreClass(this, this._defaultClassName, this._scheme);
|
10861 | break;
|
10862 |
|
10863 | case 'modifier':
|
10864 | ModifierUtil.onModifierChanged(last, current, this, this._scheme);
|
10865 | break;
|
10866 |
|
10867 | case 'icon':
|
10868 | this._updateIcon();
|
10869 |
|
10870 | break;
|
10871 |
|
10872 | case 'ripple':
|
10873 | this.classList.contains(this._defaultClassName) && this._updateRipple();
|
10874 | break;
|
10875 | }
|
10876 | }
|
10877 | }], [{
|
10878 | key: "observedAttributes",
|
10879 | get: function get() {
|
10880 | return ['modifier', 'class', 'icon', 'ripple'];
|
10881 | }
|
10882 | }]);
|
10883 |
|
10884 | return BaseButtonElement;
|
10885 | }(BaseElement);
|
10886 | util$4.defineBooleanProperties(BaseButtonElement, ['ripple', 'disabled']);
|
10887 |
|
10888 | /**
|
10889 | * @element ons-action-sheet-button
|
10890 | * @category dialog
|
10891 | * @modifier destructive
|
10892 | * [en]Shows a "destructive" button (only for iOS).[/en]
|
10893 | * [ja]"destructive"なボタンを表示します(iOSでのみ有効)。[/ja]
|
10894 | * @description
|
10895 | * [en]Component that represent each button of the action sheet.[/en]
|
10896 | * [ja]アクションシートに表示される各ボタンを表現するコンポーネントです。[/ja]
|
10897 | * @seealso ons-action-sheet
|
10898 | * [en]The `<ons-action-sheet>` component[/en]
|
10899 | * [ja]ons-action-sheetコンポーネント[/ja]
|
10900 | * @seealso ons-list-item
|
10901 | * [en]The `<ons-list-item>` component[/en]
|
10902 | * [ja]ons-list-itemコンポーネント[/ja]
|
10903 | * @seealso ons-icon
|
10904 | * [en]The `<ons-icon>` component[/en]
|
10905 | * [ja]ons-iconコンポーネント[/ja]
|
10906 | * @tutorial vanilla/Reference/action-sheet
|
10907 | * @guide appsize.html#removing-icon-packs [en]Removing icon packs.[/en][ja][/ja]
|
10908 | * @guide faq.html#how-can-i-use-custom-icon-packs [en]Adding custom icon packs.[/en][ja][/ja]
|
10909 | * @modifier material
|
10910 | * [en]Display a Material Design action sheet button.[/en]
|
10911 | * [ja]マテリアルデザインのアクションシート用のボタンを表示します。[/ja]
|
10912 | * @example
|
10913 | * <ons-action-sheet id="sheet">
|
10914 | * <ons-action-sheet-button>Label</ons-action-sheet-button>
|
10915 | * <ons-action-sheet-button>Label</ons-action-sheet-button>
|
10916 | * </ons-action-sheet>
|
10917 | *
|
10918 | * <script>
|
10919 | * document.getElementById('sheet').show();
|
10920 | * </script>
|
10921 | */
|
10922 |
|
10923 | var ActionSheetButtonElement = /*#__PURE__*/function (_BaseButtonElement) {
|
10924 | _inherits(ActionSheetButtonElement, _BaseButtonElement);
|
10925 |
|
10926 | var _super = _createSuper(ActionSheetButtonElement);
|
10927 |
|
10928 | function ActionSheetButtonElement() {
|
10929 | _classCallCheck(this, ActionSheetButtonElement);
|
10930 |
|
10931 | return _super.apply(this, arguments);
|
10932 | }
|
10933 |
|
10934 | _createClass(ActionSheetButtonElement, [{
|
10935 | key: "_scheme",
|
10936 | get:
|
10937 | /**
|
10938 | * @attribute icon
|
10939 | * @type {String}
|
10940 | * @description
|
10941 | * [en]Creates an `ons-icon` component with this string. Only visible on Android. Check [See also](#seealso) section for more information.[/en]
|
10942 | * [ja]`ons-icon`コンポーネントを悪性します。Androidでのみ表示されます。[/ja]
|
10943 | */
|
10944 |
|
10945 | /**
|
10946 | * @attribute modifier
|
10947 | * @type {String}
|
10948 | * @description
|
10949 | * [en]The appearance of the action sheet button.[/en]
|
10950 | * [ja]アクションシートボタンの見た目を設定します。[/ja]
|
10951 | */
|
10952 | function get() {
|
10953 | return {
|
10954 | '': 'action-sheet-button--*',
|
10955 | '.action-sheet-icon': 'action-sheet-icon--*'
|
10956 | };
|
10957 | }
|
10958 | }, {
|
10959 | key: "_defaultClassName",
|
10960 | get: function get() {
|
10961 | return 'action-sheet-button';
|
10962 | }
|
10963 | }, {
|
10964 | key: "_rippleOpt",
|
10965 | get: function get() {
|
10966 | return undefined;
|
10967 | }
|
10968 | }]);
|
10969 |
|
10970 | return ActionSheetButtonElement;
|
10971 | }(BaseButtonElement);
|
10972 | onsElements.ActionSheetButton = ActionSheetButtonElement;
|
10973 | customElements.define('ons-action-sheet-button', ActionSheetButtonElement);
|
10974 |
|
10975 | var AlertDialogAnimator = /*#__PURE__*/function (_BaseAnimator) {
|
10976 | _inherits(AlertDialogAnimator, _BaseAnimator);
|
10977 |
|
10978 | var _super = _createSuper(AlertDialogAnimator);
|
10979 |
|
10980 | function AlertDialogAnimator() {
|
10981 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
10982 | _ref$timing = _ref.timing,
|
10983 | timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
|
10984 | _ref$delay = _ref.delay,
|
10985 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
10986 | _ref$duration = _ref.duration,
|
10987 | duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
|
10988 |
|
10989 | _classCallCheck(this, AlertDialogAnimator);
|
10990 |
|
10991 | return _super.call(this, {
|
10992 | timing: timing,
|
10993 | delay: delay,
|
10994 | duration: duration
|
10995 | });
|
10996 | }
|
10997 | /**
|
10998 | * @param {HTMLElement} dialog
|
10999 | * @param {Function} done
|
11000 | */
|
11001 |
|
11002 |
|
11003 | _createClass(AlertDialogAnimator, [{
|
11004 | key: "show",
|
11005 | value: function show(dialog, done) {
|
11006 | done();
|
11007 | }
|
11008 | /**
|
11009 | * @param {HTMLElement} dialog
|
11010 | * @param {Function} done
|
11011 | */
|
11012 |
|
11013 | }, {
|
11014 | key: "hide",
|
11015 | value: function hide(dialog, done) {
|
11016 | done();
|
11017 | }
|
11018 | }]);
|
11019 |
|
11020 | return AlertDialogAnimator;
|
11021 | }(BaseAnimator);
|
11022 | /**
|
11023 | * Android style animator for alert dialog.
|
11024 | */
|
11025 |
|
11026 | var AndroidAlertDialogAnimator = /*#__PURE__*/function (_AlertDialogAnimator) {
|
11027 | _inherits(AndroidAlertDialogAnimator, _AlertDialogAnimator);
|
11028 |
|
11029 | var _super2 = _createSuper(AndroidAlertDialogAnimator);
|
11030 |
|
11031 | function AndroidAlertDialogAnimator() {
|
11032 | var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
11033 | _ref2$timing = _ref2.timing,
|
11034 | timing = _ref2$timing === void 0 ? 'cubic-bezier(.1, .7, .4, 1)' : _ref2$timing,
|
11035 | _ref2$duration = _ref2.duration,
|
11036 | duration = _ref2$duration === void 0 ? 0.2 : _ref2$duration,
|
11037 | _ref2$delay = _ref2.delay,
|
11038 | delay = _ref2$delay === void 0 ? 0 : _ref2$delay;
|
11039 |
|
11040 | _classCallCheck(this, AndroidAlertDialogAnimator);
|
11041 |
|
11042 | return _super2.call(this, {
|
11043 | duration: duration,
|
11044 | timing: timing,
|
11045 | delay: delay
|
11046 | });
|
11047 | }
|
11048 | /**
|
11049 | * @param {Object} dialog
|
11050 | * @param {Function} callback
|
11051 | */
|
11052 |
|
11053 |
|
11054 | _createClass(AndroidAlertDialogAnimator, [{
|
11055 | key: "show",
|
11056 | value: function show(dialog, callback) {
|
11057 | callback = callback ? callback : function () {};
|
11058 | Animit.runAll(Animit(dialog._mask, this.def).default({
|
11059 | opacity: 0
|
11060 | }, {
|
11061 | opacity: 1
|
11062 | }), Animit(dialog._dialog, this.def).default({
|
11063 | transform: 'translate3d(-50%, -50%, 0) scale3d(.9, .9, 1)',
|
11064 | opacity: 0
|
11065 | }, {
|
11066 | transform: 'translate3d(-50%, -50%, 0) scale3d(1, 1, 1)',
|
11067 | opacity: 1
|
11068 | }).queue(function (done) {
|
11069 | callback();
|
11070 | done();
|
11071 | }));
|
11072 | }
|
11073 | /**
|
11074 | * @param {Object} dialog
|
11075 | * @param {Function} callback
|
11076 | */
|
11077 |
|
11078 | }, {
|
11079 | key: "hide",
|
11080 | value: function hide(dialog, callback) {
|
11081 | callback = callback ? callback : function () {};
|
11082 | Animit.runAll(Animit(dialog._mask, this.def).default({
|
11083 | opacity: 1
|
11084 | }, {
|
11085 | opacity: 0
|
11086 | }), Animit(dialog._dialog, this.def).default({
|
11087 | transform: 'translate3d(-50%, -50%, 0) scale3d(1, 1, 1)',
|
11088 | opacity: 1
|
11089 | }, {
|
11090 | transform: 'translate3d(-50%, -50%, 0) scale3d(.9, .9, 1)',
|
11091 | opacity: 0
|
11092 | }).queue(function (done) {
|
11093 | callback();
|
11094 | done();
|
11095 | }));
|
11096 | }
|
11097 | }]);
|
11098 |
|
11099 | return AndroidAlertDialogAnimator;
|
11100 | }(AlertDialogAnimator);
|
11101 | /**
|
11102 | * iOS style animator for alert dialog.
|
11103 | */
|
11104 |
|
11105 | var IOSAlertDialogAnimator = /*#__PURE__*/function (_AlertDialogAnimator2) {
|
11106 | _inherits(IOSAlertDialogAnimator, _AlertDialogAnimator2);
|
11107 |
|
11108 | var _super3 = _createSuper(IOSAlertDialogAnimator);
|
11109 |
|
11110 | function IOSAlertDialogAnimator() {
|
11111 | var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
11112 | _ref3$timing = _ref3.timing,
|
11113 | timing = _ref3$timing === void 0 ? 'cubic-bezier(.1, .7, .4, 1)' : _ref3$timing,
|
11114 | _ref3$duration = _ref3.duration,
|
11115 | duration = _ref3$duration === void 0 ? 0.2 : _ref3$duration,
|
11116 | _ref3$delay = _ref3.delay,
|
11117 | delay = _ref3$delay === void 0 ? 0 : _ref3$delay;
|
11118 |
|
11119 | _classCallCheck(this, IOSAlertDialogAnimator);
|
11120 |
|
11121 | return _super3.call(this, {
|
11122 | duration: duration,
|
11123 | timing: timing,
|
11124 | delay: delay
|
11125 | });
|
11126 | }
|
11127 | /*
|
11128 | * @param {Object} dialog
|
11129 | * @param {Function} callback
|
11130 | */
|
11131 |
|
11132 |
|
11133 | _createClass(IOSAlertDialogAnimator, [{
|
11134 | key: "show",
|
11135 | value: function show(dialog, callback) {
|
11136 | callback = callback ? callback : function () {};
|
11137 | Animit.runAll(Animit(dialog._mask, this.def).default({
|
11138 | opacity: 0
|
11139 | }, {
|
11140 | opacity: 1
|
11141 | }), Animit(dialog._dialog, this.def).default({
|
11142 | transform: 'translate3d(-50%, -50%, 0) scale3d(1.3, 1.3, 1)',
|
11143 | opacity: 0
|
11144 | }, {
|
11145 | transform: 'translate3d(-50%, -50%, 0) scale3d(1, 1, 1)',
|
11146 | opacity: 1
|
11147 | }).queue(function (done) {
|
11148 | callback();
|
11149 | done();
|
11150 | }));
|
11151 | }
|
11152 | /**
|
11153 | * @param {Object} dialog
|
11154 | * @param {Function} callback
|
11155 | */
|
11156 |
|
11157 | }, {
|
11158 | key: "hide",
|
11159 | value: function hide(dialog, callback) {
|
11160 | callback = callback ? callback : function () {};
|
11161 | Animit.runAll(Animit(dialog._mask, this.def).default({
|
11162 | opacity: 1
|
11163 | }, {
|
11164 | opacity: 0
|
11165 | }), Animit(dialog._dialog, this.def).default({
|
11166 | opacity: 1
|
11167 | }, {
|
11168 | opacity: 0
|
11169 | }).queue(function (done) {
|
11170 | callback();
|
11171 | done();
|
11172 | }));
|
11173 | }
|
11174 | }]);
|
11175 |
|
11176 | return IOSAlertDialogAnimator;
|
11177 | }(AlertDialogAnimator);
|
11178 |
|
11179 | var scheme$t = {
|
11180 | '.alert-dialog': 'alert-dialog--*',
|
11181 | '.alert-dialog-container': 'alert-dialog-container--*',
|
11182 | '.alert-dialog-title': 'alert-dialog-title--*',
|
11183 | '.alert-dialog-content': 'alert-dialog-content--*',
|
11184 | '.alert-dialog-footer': 'alert-dialog-footer--*',
|
11185 | '.alert-dialog-footer--rowfooter': 'alert-dialog-footer--rowfooter--*',
|
11186 | '.alert-dialog-button--rowfooter': 'alert-dialog-button--rowfooter--*',
|
11187 | '.alert-dialog-button--primal': 'alert-dialog-button--primal--*',
|
11188 | '.alert-dialog-button': 'alert-dialog-button--*',
|
11189 | 'ons-alert-dialog-button': 'alert-dialog-button--*',
|
11190 | '.alert-dialog-mask': 'alert-dialog-mask--*',
|
11191 | '.text-input': 'text-input--*'
|
11192 | };
|
11193 | var _animatorDict$7 = {
|
11194 | 'none': AlertDialogAnimator,
|
11195 | 'default': function _default() {
|
11196 | return platform.isAndroid() ? AndroidAlertDialogAnimator : IOSAlertDialogAnimator;
|
11197 | },
|
11198 | 'fade': function fade() {
|
11199 | return platform.isAndroid() ? AndroidAlertDialogAnimator : IOSAlertDialogAnimator;
|
11200 | }
|
11201 | };
|
11202 | /**
|
11203 | * @element ons-alert-dialog
|
11204 | * @category dialog
|
11205 | * @description
|
11206 | * [en]
|
11207 | * Alert dialog that is displayed on top of the current screen. Useful for displaying questions, warnings or error messages to the user. The title, content and buttons can be easily customized and it will automatically switch style based on the platform.
|
11208 | *
|
11209 | * To use the element it can either be attached directly to the `<body>` element or dynamically created from a template using the `ons.createAlertDialog(template)` utility function and the `<template>` tag.
|
11210 | * [/en]
|
11211 | * [ja]
|
11212 | * 現在のスクリーンの上に表示するアラートダイアログです。ユーザに対する問いかけ、警告、エラーメッセージを表示するのに利用できます。タイトルやコンテンツやボタンは簡単にカスタマイズでき、実行しているプラットフォームに併せてスタイルが自動的に切り替わります。
|
11213 | * [/ja]
|
11214 | * @codepen Qwwxyp
|
11215 | * @tutorial vanilla/Reference/alert-dialog
|
11216 | * @modifier material
|
11217 | * [en]Material Design style[/en]
|
11218 | * [ja]マテリアルデザインのスタイル[/ja]
|
11219 | * @modifier rowfooter
|
11220 | * [en]Horizontally aligns the footer buttons.[/en]
|
11221 | * [ja]フッターの複数のボタンを水平に配置[/ja]
|
11222 | * @seealso ons-dialog
|
11223 | * [en]ons-dialog component[/en]
|
11224 | * [ja]ons-dialogコンポーネント[/ja]
|
11225 | * @seealso ons-popover
|
11226 | * [en]ons-popover component[/en]
|
11227 | * [ja]ons-dialogコンポーネント[/ja]
|
11228 | * @seealso ons.notification
|
11229 | * [en]Using ons.notification utility functions.[/en]
|
11230 | * [ja]アラートダイアログを表示するには、ons.notificationオブジェクトのメソッドを使うこともできます。[/ja]
|
11231 | * @example
|
11232 | * <ons-alert-dialog id="alert-dialog">
|
11233 | * <div class="alert-dialog-title">Warning!</div>
|
11234 | * <div class="alert-dialog-content">
|
11235 | * An error has occurred!
|
11236 | * </div>
|
11237 | * <div class="alert-dialog-footer">
|
11238 | * <button id="alert-dialog-button" class="alert-dialog-button">OK</button>
|
11239 | * </div>
|
11240 | * </ons-alert-dialog>
|
11241 | * <script>
|
11242 | * document.getElementById('alert-dialog').show();
|
11243 | * </script>
|
11244 | */
|
11245 |
|
11246 | var AlertDialogElement = /*#__PURE__*/function (_BaseDialogElement) {
|
11247 | _inherits(AlertDialogElement, _BaseDialogElement);
|
11248 |
|
11249 | var _super = _createSuper(AlertDialogElement);
|
11250 |
|
11251 | /**
|
11252 | * @event preshow
|
11253 | * @description
|
11254 | * [en]Fired just before the alert dialog is displayed.[/en]
|
11255 | * [ja]アラートダイアログが表示される直前に発火します。[/ja]
|
11256 | * @param {Object} event [en]Event object.[/en]
|
11257 | * @param {Object} event.alertDialog
|
11258 | * [en]Alert dialog object.[/en]
|
11259 | * [ja]アラートダイアログのオブジェクト。[/ja]
|
11260 | * @param {Function} event.cancel
|
11261 | * [en]Execute to stop the dialog from showing.[/en]
|
11262 | * [ja]この関数を実行すると、アラートダイアログの表示を止めます。[/ja]
|
11263 | */
|
11264 |
|
11265 | /**
|
11266 | * @event postshow
|
11267 | * @description
|
11268 | * [en]Fired just after the alert dialog is displayed.[/en]
|
11269 | * [ja]アラートダイアログが表示された直後に発火します。[/ja]
|
11270 | * @param {Object} event [en]Event object.[/en]
|
11271 | * @param {Object} event.alertDialog
|
11272 | * [en]Alert dialog object.[/en]
|
11273 | * [ja]アラートダイアログのオブジェクト。[/ja]
|
11274 | */
|
11275 |
|
11276 | /**
|
11277 | * @event prehide
|
11278 | * @description
|
11279 | * [en]Fired just before the alert dialog is hidden.[/en]
|
11280 | * [ja]アラートダイアログが隠れる直前に発火します。[/ja]
|
11281 | * @param {Object} event [en]Event object.[/en]
|
11282 | * @param {Object} event.alertDialog
|
11283 | * [en]Alert dialog object.[/en]
|
11284 | * [ja]アラートダイアログのオブジェクト。[/ja]
|
11285 | * @param {Function} event.cancel
|
11286 | * [en]Execute to stop the dialog from hiding.[/en]
|
11287 | * [ja]この関数を実行すると、アラートダイアログが閉じようとするのを止めます。[/ja]
|
11288 | */
|
11289 |
|
11290 | /**
|
11291 | * @event posthide
|
11292 | * @description
|
11293 | * [en]Fired just after the alert dialog is hidden.[/en]
|
11294 | * [ja]アラートダイアログが隠れた後に発火します。[/ja]
|
11295 | * @param {Object} event [en]Event object.[/en]
|
11296 | * @param {Object} event.alertDialog
|
11297 | * [en]Alert dialog object.[/en]
|
11298 | * [ja]アラートダイアログのオブジェクト。[/ja]
|
11299 | */
|
11300 |
|
11301 | /**
|
11302 | * @event dialogcancel
|
11303 | * @description
|
11304 | * [en]Fired when the dialog is canceled.[/en]
|
11305 | * [ja][/ja]
|
11306 | */
|
11307 |
|
11308 | /**
|
11309 | * @attribute modifier
|
11310 | * @type {String}
|
11311 | * @description
|
11312 | * [en]The appearance of the dialog.[/en]
|
11313 | * [ja]ダイアログの見た目を指定します。[/ja]
|
11314 | */
|
11315 |
|
11316 | /**
|
11317 | * @attribute cancelable
|
11318 | * @description
|
11319 | * [en]If this attribute is set the dialog can be closed by tapping the background or by pressing the back button on Android devices.[/en]
|
11320 | * [ja]この属性を設定すると、ダイアログの背景をタップしたりAndroidデバイスのバックボタンを押すとダイアログが閉じるようになります。[/ja]
|
11321 | */
|
11322 |
|
11323 | /**
|
11324 | * @attribute disabled
|
11325 | * @description
|
11326 | * [en]If this attribute is set the dialog is disabled.[/en]
|
11327 | * [ja]この属性がある時、アラートダイアログはdisabled状態になります。[/ja]
|
11328 | */
|
11329 |
|
11330 | /**
|
11331 | * @attribute animation
|
11332 | * @type {String}
|
11333 | * @default default
|
11334 | * @description
|
11335 | * [en]The animation used when showing and hiding the dialog. Can be either `"none"` or `"default"`.[/en]
|
11336 | * [ja]ダイアログを表示する際のアニメーション名を指定します。デフォルトでは"none"か"default"が指定できます。[/ja]
|
11337 | */
|
11338 |
|
11339 | /**
|
11340 | * @attribute animation-options
|
11341 | * @type {Expression}
|
11342 | * @description
|
11343 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
11344 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
|
11345 | */
|
11346 |
|
11347 | /**
|
11348 | * @attribute mask-color
|
11349 | * @type {String}
|
11350 | * @default rgba(0, 0, 0, 0.2)
|
11351 | * @description
|
11352 | * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)".[/en]
|
11353 | * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
|
11354 | */
|
11355 |
|
11356 | /**
|
11357 | * @attribute visible
|
11358 | * @type {Boolean}
|
11359 | * @description
|
11360 | * [en]Whether the alert dialog is visible or not.[/en]
|
11361 | * [ja]要素が見える場合に`true`。[/ja]
|
11362 | */
|
11363 | function AlertDialogElement() {
|
11364 | var _this;
|
11365 |
|
11366 | _classCallCheck(this, AlertDialogElement);
|
11367 |
|
11368 | _this = _super.call(this);
|
11369 | contentReady(_assertThisInitialized(_this), function () {
|
11370 | return _this._compile();
|
11371 | });
|
11372 | return _this;
|
11373 | }
|
11374 |
|
11375 | _createClass(AlertDialogElement, [{
|
11376 | key: "_scheme",
|
11377 | get: function get() {
|
11378 | return scheme$t;
|
11379 | }
|
11380 | /**
|
11381 | * @return {Element}
|
11382 | */
|
11383 |
|
11384 | }, {
|
11385 | key: "_mask",
|
11386 | get: function get() {
|
11387 | return util$4.findChild(this, '.alert-dialog-mask');
|
11388 | }
|
11389 | /**
|
11390 | * @return {Element}
|
11391 | */
|
11392 |
|
11393 | }, {
|
11394 | key: "_dialog",
|
11395 | get: function get() {
|
11396 | return util$4.findChild(this, '.alert-dialog');
|
11397 | }
|
11398 | /**
|
11399 | * @return {Element}
|
11400 | */
|
11401 |
|
11402 | }, {
|
11403 | key: "_titleElement",
|
11404 | get: function get() {
|
11405 | return util$4.findChild(this._dialog.children[0], '.alert-dialog-title');
|
11406 | }
|
11407 | /**
|
11408 | * @return {Element}
|
11409 | */
|
11410 |
|
11411 | }, {
|
11412 | key: "_contentElement",
|
11413 | get: function get() {
|
11414 | return util$4.findChild(this._dialog.children[0], '.alert-dialog-content');
|
11415 | }
|
11416 | }, {
|
11417 | key: "_updateAnimatorFactory",
|
11418 | value: function _updateAnimatorFactory() {
|
11419 | return new AnimatorFactory({
|
11420 | animators: _animatorDict$7,
|
11421 | baseClass: AlertDialogAnimator,
|
11422 | baseClassName: 'AlertDialogAnimator',
|
11423 | defaultAnimation: this.getAttribute('animation')
|
11424 | });
|
11425 | }
|
11426 | }, {
|
11427 | key: "_compile",
|
11428 | value: function _compile() {
|
11429 | autoStyle.prepare(this);
|
11430 | this.style.display = 'none';
|
11431 | this.style.zIndex = 10001;
|
11432 | /**
|
11433 | * Expected result after compile:
|
11434 | *
|
11435 | * <ons-alert-dialog style="none">
|
11436 | * <div class="alert-dialog-mask"></div>
|
11437 | * <div class="alert-dialog">
|
11438 | * <div class="alert-dialog-container">...</div>
|
11439 | * </div>
|
11440 | * </ons-alert-dialog>
|
11441 | */
|
11442 |
|
11443 | var content = document.createDocumentFragment();
|
11444 |
|
11445 | if (!this._mask && !this._dialog) {
|
11446 | while (this.firstChild) {
|
11447 | content.appendChild(this.firstChild);
|
11448 | }
|
11449 | }
|
11450 |
|
11451 | if (!this._mask) {
|
11452 | var mask = document.createElement('div');
|
11453 | mask.classList.add('alert-dialog-mask');
|
11454 | this.insertBefore(mask, this.children[0]);
|
11455 | }
|
11456 |
|
11457 | if (!this._dialog) {
|
11458 | var dialog = document.createElement('div');
|
11459 | dialog.classList.add('alert-dialog');
|
11460 | this.insertBefore(dialog, null);
|
11461 | }
|
11462 |
|
11463 | if (!util$4.findChild(this._dialog, '.alert-dialog-container')) {
|
11464 | var container = document.createElement('div');
|
11465 | container.classList.add('alert-dialog-container');
|
11466 |
|
11467 | this._dialog.appendChild(container);
|
11468 | }
|
11469 |
|
11470 | this._dialog.children[0].appendChild(content);
|
11471 |
|
11472 | this._dialog.style.zIndex = 20001;
|
11473 | this._mask.style.zIndex = 20000;
|
11474 | ModifierUtil.initModifier(this, this._scheme);
|
11475 | }
|
11476 | /**
|
11477 | * @property disabled
|
11478 | * @type {Boolean}
|
11479 | * @description
|
11480 | * [en]Whether the element is disabled or not.[/en]
|
11481 | * [ja]無効化されている場合に`true`。[/ja]
|
11482 | */
|
11483 |
|
11484 | /**
|
11485 | * @property cancelable
|
11486 | * @type {Boolean}
|
11487 | * @description
|
11488 | * [en]Whether the dialog is cancelable or not. A cancelable dialog can be closed by tapping the background or by pressing the back button on Android devices.[/en]
|
11489 | * [ja]そのダイアログがキャンセル可能かどうかを表します。キャンセル可能なダイアログは、背景をタップするかAndroidデバイスのバックボタンを押すことで閉じることが出来るようになります。[/ja]
|
11490 | */
|
11491 |
|
11492 | /**
|
11493 | * @property maskColor
|
11494 | * @type {String}
|
11495 | * @default rgba(0, 0, 0, 0.2)
|
11496 | * @description
|
11497 | * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)".[/en]
|
11498 | * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
|
11499 | */
|
11500 |
|
11501 | /**
|
11502 | * @method show
|
11503 | * @signature show([options])
|
11504 | * @param {Object} [options]
|
11505 | * [en]Parameter object.[/en]
|
11506 | * [ja]オプションを指定するオブジェクトです。[/ja]
|
11507 | * @param {String} [options.animation]
|
11508 | * [en]Animation name. Available animations are `"fade"` and `"none"`.[/en]
|
11509 | * [ja]アニメーション名を指定します。指定できるのは、"fade", "none"のいずれかです。[/ja]
|
11510 | * @param {String} [options.animationOptions]
|
11511 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
|
11512 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. <code>{duration: 0.2, delay: 0.4, timing: 'ease-in'}</code> [/ja]
|
11513 | * @param {Function} [options.callback]
|
11514 | * [en]Function to execute after the dialog has been revealed.[/en]
|
11515 | * [ja]ダイアログが表示され終わった時に呼び出されるコールバックを指定します。[/ja]
|
11516 | * @description
|
11517 | * [en]Show the alert dialog.[/en]
|
11518 | * [ja]ダイアログを表示します。[/ja]
|
11519 | * @return {Promise}
|
11520 | * [en]A `Promise` object that resolves to the displayed element.[/en]
|
11521 | * [ja]表示される要素を解決する`Promise`オブジェクトを返します。[/ja]
|
11522 | */
|
11523 |
|
11524 | /**
|
11525 | * @method hide
|
11526 | * @signature hide([options])
|
11527 | * @param {Object} [options]
|
11528 | * [en]Parameter object.[/en]
|
11529 | * [ja]オプションを指定するオブジェクト。[/ja]
|
11530 | * @param {String} [options.animation]
|
11531 | * [en]Animation name. Available animations are `"fade"` and `"none"`.[/en]
|
11532 | * [ja]アニメーション名を指定します。"fade", "none"のいずれかを指定します。[/ja]
|
11533 | * @param {String} [options.animationOptions]
|
11534 | * [en]Specify the animation's duration, delay and timing. E.g. <code>{duration: 0.2, delay: 0.4, timing: 'ease-in'}</code>[/en]
|
11535 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. <code>{duration: 0.2, delay: 0.4, timing: 'ease-in'}</code> [/ja]
|
11536 | * @param {Function} [options.callback]
|
11537 | * [en]Function to execute after the dialog has been hidden.[/en]
|
11538 | * [ja]このダイアログが閉じた時に呼び出されるコールバックを指定します。[/ja]
|
11539 | * @description
|
11540 | * [en]Hide the alert dialog.[/en]
|
11541 | * [ja]ダイアログを閉じます。[/ja]
|
11542 | * @return {Promise}
|
11543 | * [en]Resolves to the hidden element[/en]
|
11544 | * [ja]隠れた要素を解決する`Promise`オブジェクトを返します。[/ja]
|
11545 | */
|
11546 |
|
11547 | /**
|
11548 | * @property visible
|
11549 | * @type {Boolean}
|
11550 | * @description
|
11551 | * [en]Whether the dialog is visible or not.[/en]
|
11552 | * [ja]要素が見える場合に`true`。[/ja]
|
11553 | */
|
11554 |
|
11555 | /**
|
11556 | * @property onDeviceBackButton
|
11557 | * @type {Object}
|
11558 | * @description
|
11559 | * [en]Back-button handler.[/en]
|
11560 | * [ja]バックボタンハンドラ。[/ja]
|
11561 | */
|
11562 |
|
11563 | /**
|
11564 | * @property animationOptions
|
11565 | * @type {Object}
|
11566 | * @description
|
11567 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
11568 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
|
11569 | */
|
11570 |
|
11571 | /**
|
11572 | * @param {String} name
|
11573 | * @param {DialogAnimator} Animator
|
11574 | */
|
11575 |
|
11576 | }], [{
|
11577 | key: "registerAnimator",
|
11578 | value: function registerAnimator(name, Animator) {
|
11579 | if (!(Animator.prototype instanceof AlertDialogAnimator)) {
|
11580 | util$4.throwAnimator('AlertDialog');
|
11581 | }
|
11582 |
|
11583 | _animatorDict$7[name] = Animator;
|
11584 | }
|
11585 | }, {
|
11586 | key: "animators",
|
11587 | get: function get() {
|
11588 | return _animatorDict$7;
|
11589 | }
|
11590 | }, {
|
11591 | key: "AlertDialogAnimator",
|
11592 | get: function get() {
|
11593 | return AlertDialogAnimator;
|
11594 | }
|
11595 | }]);
|
11596 |
|
11597 | return AlertDialogElement;
|
11598 | }(BaseDialogElement);
|
11599 | onsElements.AlertDialog = AlertDialogElement;
|
11600 | customElements.define('ons-alert-dialog', AlertDialogElement);
|
11601 |
|
11602 | /**
|
11603 | * @element ons-alert-dialog-button
|
11604 | * @modifier material
|
11605 | * [en]Material Design alert-dialog button.[/en]
|
11606 | * [ja]マテリアルデザインのボタンを表示します。[/ja]
|
11607 | * @description
|
11608 | * [en][/en]
|
11609 | * [ja][/ja]
|
11610 | * @seealso ons-alert-dialog
|
11611 | * [en]The `<ons-alert-dialog>` component displays a alert dialog.[/en]
|
11612 | * [ja]ons-alert-dialogコンポーネント[/ja]
|
11613 | * @example
|
11614 | * <ons-alert-dialog>
|
11615 | * <div class="alert-dialog-title">Warning!</div>
|
11616 | * <div class="alert-dialog-content">
|
11617 | * An error has occurred!
|
11618 | * </div>
|
11619 | * <div class="alert-dialog-footer">
|
11620 | * <alert-dialog-button onclick="app.close()">Cancel</alert-dialog-button>
|
11621 | * <alert-dialog-button class="alert-dialog-button" onclick="app.close()">OK</alert-dialog-button>
|
11622 | * </div>
|
11623 | * </ons-alert-dialog>
|
11624 | */
|
11625 |
|
11626 | var AlertDialogButtonElement = /*#__PURE__*/function (_BaseButtonElement) {
|
11627 | _inherits(AlertDialogButtonElement, _BaseButtonElement);
|
11628 |
|
11629 | var _super = _createSuper(AlertDialogButtonElement);
|
11630 |
|
11631 | function AlertDialogButtonElement() {
|
11632 | _classCallCheck(this, AlertDialogButtonElement);
|
11633 |
|
11634 | return _super.apply(this, arguments);
|
11635 | }
|
11636 |
|
11637 | _createClass(AlertDialogButtonElement, [{
|
11638 | key: "_scheme",
|
11639 | get:
|
11640 | /**
|
11641 | * @attribute modifier
|
11642 | * @type {String}
|
11643 | * @description
|
11644 | * [en]The appearance of the button.[/en]
|
11645 | * [ja]ボタンの表現を指定します。[/ja]
|
11646 | */
|
11647 |
|
11648 | /**
|
11649 | * @attribute disabled
|
11650 | * @description
|
11651 | * [en]Specify if button should be disabled.[/en]
|
11652 | * [ja]ボタンを無効化する場合は指定してください。[/ja]
|
11653 | */
|
11654 |
|
11655 | /**
|
11656 | * @property disabled
|
11657 | * @type {Boolean}
|
11658 | * @description
|
11659 | * [en]Whether the element is disabled or not.[/en]
|
11660 | * [ja]無効化されている場合に`true`。[/ja]
|
11661 | */
|
11662 | function get() {
|
11663 | return {
|
11664 | '': 'alert-dialog-button--*'
|
11665 | };
|
11666 | }
|
11667 | }, {
|
11668 | key: "_defaultClassName",
|
11669 | get: function get() {
|
11670 | return 'alert-dialog-button';
|
11671 | }
|
11672 | }, {
|
11673 | key: "_rippleOpt",
|
11674 | get: function get() {
|
11675 | return [this, undefined, {
|
11676 | 'modifier': 'light-gray'
|
11677 | }];
|
11678 | }
|
11679 | }]);
|
11680 |
|
11681 | return AlertDialogButtonElement;
|
11682 | }(BaseButtonElement);
|
11683 | onsElements.AlertDialogButton = AlertDialogButtonElement;
|
11684 | customElements.define('ons-alert-dialog-button', AlertDialogButtonElement);
|
11685 |
|
11686 | var defaultClassName$g = 'back-button';
|
11687 | var scheme$s = {
|
11688 | '': 'back-button--*',
|
11689 | '.back-button__icon': 'back-button--*__icon',
|
11690 | '.back-button__label': 'back-button--*__label'
|
11691 | }; // original image file at misc/images/ios-back-button-icon.svg
|
11692 |
|
11693 | var iosBackButtonIcon = "\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <svg width=\"13px\" height=\"21px\" viewBox=\"0 0 13 21\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <title>ios-back-button-icon</title>\n <desc>Created with Sketch.</desc>\n <defs></defs>\n <g id=\"toolbar-back-button\" stroke=\"none\" stroke-width=\"1\" fill-rule=\"evenodd\">\n <g id=\"ios\" transform=\"translate(-34.000000, -30.000000)\">\n <polygon id=\"ios-back-button-icon\" points=\"34 40.5 44.5 30 46.5 32 38 40.5 46.5 49 44.5 51\"></polygon>\n </g>\n </g>\n </svg>\n"; // original image file at misc/images/md-back-button-icon.svg
|
11694 |
|
11695 | var mdBackButtonIcon = "\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <svg width=\"16px\" height=\"16px\" viewBox=\"0 0 16 16\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <title>md-back-button-icon</title>\n <desc>Created with Sketch.</desc>\n <defs></defs>\n <g id=\"toolbar-back-button\" stroke=\"none\" stroke-width=\"1\" fill-rule=\"evenodd\">\n <g id=\"android\" transform=\"translate(-32.000000, -32.000000)\" fill-rule=\"nonzero\">\n <polygon id=\"md-back-button-icon\" points=\"48 39 35.83 39 41.42 33.41 40 32 32 40 40 48 41.41 46.59 35.83 41 48 41\"></polygon>\n </g>\n </g>\n </svg>\n";
|
11696 | /**
|
11697 | * @element ons-back-button
|
11698 | * @category navigation
|
11699 | * @description
|
11700 | * [en]
|
11701 | * Back button component for `<ons-toolbar>`. Put it in the left part of the `<ons-toolbar>`.
|
11702 | *
|
11703 | * It will find the parent `<ons-navigator>` element and pop a page when clicked. This behavior can be overriden by specifying the `onClick` property and calling event.preventDefault in its callback.
|
11704 | * [/en]
|
11705 | * [ja][/ja]
|
11706 | * @codepen aHmGL
|
11707 | * @tutorial vanilla/Reference/back-button
|
11708 | * @modifier material
|
11709 | * [en]Material Design style[/en]
|
11710 | * [ja][/ja]
|
11711 | * @seealso ons-toolbar
|
11712 | * [en]ons-toolbar component[/en]
|
11713 | * [ja]ons-toolbarコンポーネント[/ja]
|
11714 | * @seealso ons-navigator
|
11715 | * [en]ons-navigator component[/en]
|
11716 | * [ja]ons-navigatorコンポーネント[/ja]
|
11717 | * @example
|
11718 | * <ons-toolbar>
|
11719 | * <div class="left">
|
11720 | * <ons-back-button>Back</ons-back-button>
|
11721 | * </div>
|
11722 | * <div class="center">
|
11723 | * Title
|
11724 | * <div>
|
11725 | * </ons-toolbar>
|
11726 | */
|
11727 |
|
11728 | var BackButtonElement = /*#__PURE__*/function (_BaseElement) {
|
11729 | _inherits(BackButtonElement, _BaseElement);
|
11730 |
|
11731 | var _super = _createSuper(BackButtonElement);
|
11732 |
|
11733 | /**
|
11734 | * @attribute modifier
|
11735 | * @type {String}
|
11736 | * @description
|
11737 | * [en]The appearance of the back button.[/en]
|
11738 | * [ja]バックボタンの見た目を指定します。[/ja]
|
11739 | */
|
11740 | function BackButtonElement() {
|
11741 | var _this;
|
11742 |
|
11743 | _classCallCheck(this, BackButtonElement);
|
11744 |
|
11745 | _this = _super.call(this);
|
11746 | contentReady(_assertThisInitialized(_this), function () {
|
11747 | _this._compile();
|
11748 | });
|
11749 | _this._options = {};
|
11750 | _this._boundOnClick = _this._onClick.bind(_assertThisInitialized(_this));
|
11751 |
|
11752 | var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'click'),
|
11753 | onConnected = _util$defineListenerP.onConnected,
|
11754 | onDisconnected = _util$defineListenerP.onDisconnected;
|
11755 |
|
11756 | _this._connectOnClick = onConnected;
|
11757 | _this._disconnectOnClick = onDisconnected;
|
11758 | return _this;
|
11759 | }
|
11760 |
|
11761 | _createClass(BackButtonElement, [{
|
11762 | key: "_updateIcon",
|
11763 | value: function _updateIcon() {
|
11764 | var icon = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : util$4.findChild(this, '.back-button__icon');
|
11765 | icon.innerHTML = autoStyle.getPlatform(this) === 'android' || util$4.hasModifier(this, 'material') ? mdBackButtonIcon : iosBackButtonIcon;
|
11766 | }
|
11767 | }, {
|
11768 | key: "_compile",
|
11769 | value: function _compile() {
|
11770 | autoStyle.prepare(this);
|
11771 | this.classList.add(defaultClassName$g);
|
11772 |
|
11773 | if (!util$4.findChild(this, '.back-button__label')) {
|
11774 | var label = util$4.create('span.back-button__label');
|
11775 |
|
11776 | while (this.childNodes[0]) {
|
11777 | label.appendChild(this.childNodes[0]);
|
11778 | }
|
11779 |
|
11780 | this.appendChild(label);
|
11781 | }
|
11782 |
|
11783 | if (!util$4.findChild(this, '.back-button__icon')) {
|
11784 | var icon = util$4.create('span.back-button__icon');
|
11785 |
|
11786 | this._updateIcon(icon);
|
11787 |
|
11788 | this.insertBefore(icon, this.children[0]);
|
11789 | }
|
11790 |
|
11791 | util$4.updateRipple(this, undefined, {
|
11792 | center: '',
|
11793 | 'size': 'contain',
|
11794 | 'background': 'transparent'
|
11795 | });
|
11796 | ModifierUtil.initModifier(this, scheme$s);
|
11797 | }
|
11798 | /**
|
11799 | * @property options
|
11800 | * @type {Object}
|
11801 | * @description
|
11802 | * [en]Options object.[/en]
|
11803 | * [ja]オプションを指定するオブジェクト。[/ja]
|
11804 | */
|
11805 |
|
11806 | /**
|
11807 | * @property options.animation
|
11808 | * @type {String}
|
11809 | * @description
|
11810 | * [en]Animation name. Available animations are "slide", "lift", "fade" and "none".
|
11811 | * These are platform based animations. For fixed animations, add "-ios" or "-md"
|
11812 | * suffix to the animation name. E.g. "lift-ios", "lift-md". Defaults values are "slide-ios" and "fade-md".
|
11813 | * [/en]
|
11814 | * [ja][/ja]
|
11815 | */
|
11816 |
|
11817 | /**
|
11818 | * @property options.animationOptions
|
11819 | * @type {String}
|
11820 | * @description
|
11821 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`[/en]
|
11822 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}` [/ja]
|
11823 | */
|
11824 |
|
11825 | /**
|
11826 | * @property options.callback
|
11827 | * @type {String}
|
11828 | * @description
|
11829 | * [en]Function that is called when the transition has ended.[/en]
|
11830 | * [ja]このメソッドによる画面遷移が終了した際に呼び出される関数オブジェクトを指定します。[/ja]
|
11831 | */
|
11832 |
|
11833 | }, {
|
11834 | key: "options",
|
11835 | get: function get() {
|
11836 | return this._options;
|
11837 | },
|
11838 | set: function set(object) {
|
11839 | this._options = object;
|
11840 | }
|
11841 | /**
|
11842 | * @property onClick
|
11843 | * @type {Function}
|
11844 | * @description
|
11845 | * [en]Used to override the default back button behavior.[/en]
|
11846 | * [ja][/ja]
|
11847 | */
|
11848 |
|
11849 | }, {
|
11850 | key: "_onClick",
|
11851 | value: function _onClick(event) {
|
11852 | var _this2 = this;
|
11853 |
|
11854 | setTimeout(function () {
|
11855 | if (!event.defaultPrevented) {
|
11856 | var navigator = util$4.findParent(_this2, 'ons-navigator');
|
11857 |
|
11858 | if (navigator) {
|
11859 | navigator.popPage(_objectSpread2(_objectSpread2({}, _this2.options), {}, {
|
11860 | onsBackButton: true
|
11861 | }));
|
11862 | }
|
11863 | }
|
11864 | });
|
11865 | }
|
11866 | }, {
|
11867 | key: "connectedCallback",
|
11868 | value: function connectedCallback() {
|
11869 | this.addEventListener('click', this._boundOnClick, false);
|
11870 |
|
11871 | this._connectOnClick();
|
11872 | }
|
11873 | }, {
|
11874 | key: "attributeChangedCallback",
|
11875 | value: function attributeChangedCallback(name, last, current) {
|
11876 | switch (name) {
|
11877 | case 'class':
|
11878 | util$4.restoreClass(this, defaultClassName$g, scheme$s);
|
11879 | break;
|
11880 |
|
11881 | case 'modifier':
|
11882 | {
|
11883 | ModifierUtil.onModifierChanged(last, current, this, scheme$s) && this._updateIcon();
|
11884 | break;
|
11885 | }
|
11886 | }
|
11887 | }
|
11888 | }, {
|
11889 | key: "disconnectedCallback",
|
11890 | value: function disconnectedCallback() {
|
11891 | this.removeEventListener('click', this._boundOnClick, false);
|
11892 |
|
11893 | this._disconnectOnClick();
|
11894 | }
|
11895 | }, {
|
11896 | key: "show",
|
11897 | value: function show() {
|
11898 | this.style.display = 'inline-block';
|
11899 | }
|
11900 | }, {
|
11901 | key: "hide",
|
11902 | value: function hide() {
|
11903 | this.style.display = 'none';
|
11904 | }
|
11905 | }], [{
|
11906 | key: "observedAttributes",
|
11907 | get: function get() {
|
11908 | return ['modifier', 'class'];
|
11909 | }
|
11910 | }]);
|
11911 |
|
11912 | return BackButtonElement;
|
11913 | }(BaseElement);
|
11914 | onsElements.BackButton = BackButtonElement;
|
11915 | customElements.define('ons-back-button', BackButtonElement);
|
11916 |
|
11917 | var defaultClassName$f = 'bottom-bar';
|
11918 | var scheme$r = {
|
11919 | '': 'bottom-bar--*'
|
11920 | };
|
11921 | /**
|
11922 | * @element ons-bottom-toolbar
|
11923 | * @category page
|
11924 | * @description
|
11925 | * [en]Toolbar component that is positioned at the bottom of the page. Since bottom toolbars are very versatile elements, `ons-bottom-toolbar` does not provide any specific layout syntax for its children. Modifiers or custom CSS must be used.[/en]
|
11926 | * [ja]ページ下部に配置されるツールバー用コンポーネントです。[/ja]
|
11927 | * @modifier transparent
|
11928 | * [en]Make the toolbar transparent.[/en]
|
11929 | * [ja]ツールバーの背景を透明にして表示します。[/ja]
|
11930 | * @modifier aligned
|
11931 | * [en]Vertically aligns its children and applies flexbox for block elements. `justify-content` CSS rule can be used to change horizontal align.[/en]
|
11932 | * [ja]ツールバーの背景を透明にして表示します。[/ja]
|
11933 | * @seealso ons-toolbar [en]ons-toolbar component[/en][ja]ons-toolbarコンポーネント[/ja]
|
11934 | * @example
|
11935 | * <ons-bottom-toolbar>
|
11936 | * Content
|
11937 | * </ons-bottom-toolbar>
|
11938 | */
|
11939 |
|
11940 | var BottomToolbarElement = /*#__PURE__*/function (_BaseElement) {
|
11941 | _inherits(BottomToolbarElement, _BaseElement);
|
11942 |
|
11943 | var _super = _createSuper(BottomToolbarElement);
|
11944 |
|
11945 | /**
|
11946 | * @attribute modifier
|
11947 | * @type {String}
|
11948 | * @description
|
11949 | * [en]The appearance of the toolbar.[/en]
|
11950 | * [ja]ツールバーの見た目の表現を指定します。[/ja]
|
11951 | */
|
11952 | function BottomToolbarElement() {
|
11953 | var _this;
|
11954 |
|
11955 | _classCallCheck(this, BottomToolbarElement);
|
11956 |
|
11957 | _this = _super.call(this);
|
11958 |
|
11959 | _this.classList.add(defaultClassName$f);
|
11960 |
|
11961 | ModifierUtil.initModifier(_assertThisInitialized(_this), scheme$r);
|
11962 | return _this;
|
11963 | }
|
11964 |
|
11965 | _createClass(BottomToolbarElement, [{
|
11966 | key: "attributeChangedCallback",
|
11967 | value: function attributeChangedCallback(name, last, current) {
|
11968 | switch (name) {
|
11969 | case 'class':
|
11970 | util$4.restoreClass(this, defaultClassName$f, scheme$r);
|
11971 | break;
|
11972 |
|
11973 | case 'modifier':
|
11974 | ModifierUtil.onModifierChanged(last, current, this, scheme$r);
|
11975 | break;
|
11976 | }
|
11977 | }
|
11978 | }], [{
|
11979 | key: "observedAttributes",
|
11980 | get: function get() {
|
11981 | return ['modifier', 'class'];
|
11982 | }
|
11983 | }]);
|
11984 |
|
11985 | return BottomToolbarElement;
|
11986 | }(BaseElement);
|
11987 | onsElements.BottomToolbar = BottomToolbarElement;
|
11988 | customElements.define('ons-bottom-toolbar', BottomToolbarElement);
|
11989 |
|
11990 | /**
|
11991 | * @element ons-button
|
11992 | * @category form
|
11993 | * @modifier outline
|
11994 | * [en]Button with outline and transparent background[/en]
|
11995 | * [ja]アウトラインを持ったボタンを表示します。[/ja]
|
11996 | * @modifier light
|
11997 | * [en]Button that doesn't stand out.[/en]
|
11998 | * [ja]目立たないボタンを表示します。[/ja]
|
11999 | * @modifier quiet
|
12000 | * [en]Button with no outline and or background..[/en]
|
12001 | * [ja]枠線や背景が無い文字だけのボタンを表示します。[/ja]
|
12002 | * @modifier cta
|
12003 | * [en]Button that really stands out.[/en]
|
12004 | * [ja]目立つボタンを表示します。[/ja]
|
12005 | * @modifier large
|
12006 | * [en]Large button that covers the width of the screen.[/en]
|
12007 | * [ja]横いっぱいに広がる大きなボタンを表示します。[/ja]
|
12008 | * @modifier large--quiet
|
12009 | * [en]Large quiet button.[/en]
|
12010 | * [ja]横いっぱいに広がるquietボタンを表示します。[/ja]
|
12011 | * @modifier large--cta
|
12012 | * [en]Large call to action button.[/en]
|
12013 | * [ja]横いっぱいに広がるctaボタンを表示します。[/ja]
|
12014 | * @modifier material
|
12015 | * [en]Material Design button[/en]
|
12016 | * [ja]マテリアルデザインのボタン[/ja]
|
12017 | * @modifier material--flat
|
12018 | * [en]Material Design flat button[/en]
|
12019 | * [ja]マテリアルデザインのフラットボタン[/ja]
|
12020 | * @description
|
12021 | * [en]
|
12022 | * Button component. If you want to place a button in a toolbar, use `<ons-toolbar-button>` or `<ons-back-button>` instead.
|
12023 | *
|
12024 | * Will automatically display as a Material Design button with a ripple effect on Android.
|
12025 | * [/en]
|
12026 | * [ja]ボタン用コンポーネント。ツールバーにボタンを設置する場合は、ons-toolbar-buttonもしくはons-back-buttonコンポーネントを使用します。[/ja]
|
12027 | * @codepen hLayx
|
12028 | * @tutorial vanilla/Reference/button
|
12029 | * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
|
12030 | * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja]Information about cross platform styling[/ja]
|
12031 | * @example
|
12032 | * <ons-button modifier="large--cta">
|
12033 | * Tap Me
|
12034 | * </ons-button>
|
12035 | */
|
12036 |
|
12037 | var ButtonElement = /*#__PURE__*/function (_BaseButtonElement) {
|
12038 | _inherits(ButtonElement, _BaseButtonElement);
|
12039 |
|
12040 | var _super = _createSuper(ButtonElement);
|
12041 |
|
12042 | function ButtonElement() {
|
12043 | _classCallCheck(this, ButtonElement);
|
12044 |
|
12045 | return _super.apply(this, arguments);
|
12046 | }
|
12047 |
|
12048 | _createClass(ButtonElement, [{
|
12049 | key: "_scheme",
|
12050 | get:
|
12051 | /**
|
12052 | * @attribute modifier
|
12053 | * @type {String}
|
12054 | * @description
|
12055 | * [en]The appearance of the button.[/en]
|
12056 | * [ja]ボタンの表現を指定します。[/ja]
|
12057 | */
|
12058 |
|
12059 | /**
|
12060 | * @attribute ripple
|
12061 | * @description
|
12062 | * [en]If this attribute is defined, the button will have a ripple effect.[/en]
|
12063 | * [ja][/ja]
|
12064 | */
|
12065 |
|
12066 | /**
|
12067 | * @property ripple
|
12068 | * @type {Boolean}
|
12069 | * @description
|
12070 | * [en]Whether the button has a ripple effect or not.[/en]
|
12071 | * [ja][/ja]
|
12072 | */
|
12073 |
|
12074 | /**
|
12075 | * @attribute disabled
|
12076 | * @description
|
12077 | * [en]Specify if button should be disabled.[/en]
|
12078 | * [ja]ボタンを無効化する場合は指定します。[/ja]
|
12079 | */
|
12080 |
|
12081 | /**
|
12082 | * @property disabled
|
12083 | * @type {Boolean}
|
12084 | * @description
|
12085 | * [en]Whether the button is disabled or not.[/en]
|
12086 | * [ja]無効化されている場合に`true`。[/ja]
|
12087 | */
|
12088 | function get() {
|
12089 | return {
|
12090 | '': 'button--*'
|
12091 | };
|
12092 | }
|
12093 | }, {
|
12094 | key: "_defaultClassName",
|
12095 | get: function get() {
|
12096 | return 'button';
|
12097 | }
|
12098 | }]);
|
12099 |
|
12100 | return ButtonElement;
|
12101 | }(BaseButtonElement);
|
12102 | onsElements.Button = ButtonElement;
|
12103 | customElements.define('ons-button', ButtonElement);
|
12104 |
|
12105 | var defaultClassName$e = 'card';
|
12106 | var scheme$q = {
|
12107 | '': 'card--*',
|
12108 | '.card__title': 'card--*__title',
|
12109 | '.card__content': 'card--*__content'
|
12110 | };
|
12111 | /**
|
12112 | * @element ons-card
|
12113 | * @category visual
|
12114 | * @modifier material
|
12115 | * [en]A card with material design.[/en]
|
12116 | * [ja]リストの上下のボーダーが無いリストを表示します。[/ja]
|
12117 | * @description
|
12118 | * [en]
|
12119 | * Component to create a card that displays some information.
|
12120 | *
|
12121 | * The card may be composed by divs with specially prepared classes `title` and/or `content`. You can also add your own content as you please.[/en]
|
12122 | * [ja][/ja]
|
12123 | * @tutorial vanilla/Reference/card
|
12124 | * @example
|
12125 | * <ons-card>
|
12126 | * <p>Some content</p>
|
12127 | * </ons-card>
|
12128 | */
|
12129 |
|
12130 | var CardElement = /*#__PURE__*/function (_BaseElement) {
|
12131 | _inherits(CardElement, _BaseElement);
|
12132 |
|
12133 | var _super = _createSuper(CardElement);
|
12134 |
|
12135 | /**
|
12136 | * @attribute modifier
|
12137 | * @type {String}
|
12138 | * @description
|
12139 | * [en]The appearance of the card.[/en]
|
12140 | * [ja]リストの表現を指定します。[/ja]
|
12141 | */
|
12142 | function CardElement() {
|
12143 | var _this;
|
12144 |
|
12145 | _classCallCheck(this, CardElement);
|
12146 |
|
12147 | _this = _super.call(this);
|
12148 | contentReady(_assertThisInitialized(_this), function () {
|
12149 | _this._compile();
|
12150 | });
|
12151 | return _this;
|
12152 | }
|
12153 |
|
12154 | _createClass(CardElement, [{
|
12155 | key: "_compile",
|
12156 | value: function _compile() {
|
12157 |
|
12158 | for (var i = 0; i < this.children.length; i++) {
|
12159 | var el = this.children[i];
|
12160 |
|
12161 | if (el.classList.contains('title')) {
|
12162 | el.classList.add('card__title');
|
12163 | } else if (el.classList.contains('content')) {
|
12164 | el.classList.add('card__content');
|
12165 | }
|
12166 | }
|
12167 |
|
12168 | autoStyle.prepare(this);
|
12169 | this.classList.add(defaultClassName$e);
|
12170 | ModifierUtil.initModifier(this, scheme$q);
|
12171 | }
|
12172 | }, {
|
12173 | key: "attributeChangedCallback",
|
12174 | value: function attributeChangedCallback(name, last, current) {
|
12175 | switch (name) {
|
12176 | case 'class':
|
12177 | util$4.restoreClass(this, defaultClassName$e, scheme$q);
|
12178 | break;
|
12179 |
|
12180 | case 'modifier':
|
12181 | ModifierUtil.onModifierChanged(last, current, this, scheme$q);
|
12182 | break;
|
12183 | }
|
12184 | }
|
12185 | }], [{
|
12186 | key: "observedAttributes",
|
12187 | get: function get() {
|
12188 | return ['modifier', 'class'];
|
12189 | }
|
12190 | }]);
|
12191 |
|
12192 | return CardElement;
|
12193 | }(BaseElement);
|
12194 | onsElements.Card = CardElement;
|
12195 | customElements.define('ons-card', CardElement);
|
12196 |
|
12197 | var scheme$p = {
|
12198 | '': 'carousel-item--*'
|
12199 | };
|
12200 | /**
|
12201 | * @element ons-carousel-item
|
12202 | * @category carousel
|
12203 | * @description
|
12204 | * [en]
|
12205 | * Carousel item component. Used as a child of the `<ons-carousel>` element.
|
12206 | * [/en]
|
12207 | * [ja][/ja]
|
12208 | * @codepen xbbzOQ
|
12209 | * @tutorial vanilla/Reference/carousel
|
12210 | * @seealso ons-carousel
|
12211 | * [en]`<ons-carousel>` components[/en]
|
12212 | * [ja]<ons-carousel>コンポーネント[/ja]
|
12213 | * @example
|
12214 | * <ons-carousel style="width: 100%; height: 200px">
|
12215 | * <ons-carousel-item>
|
12216 | * ...
|
12217 | * </ons-carousel-item>
|
12218 | * <ons-carousel-item>
|
12219 | * ...
|
12220 | * </ons-carousel-item>
|
12221 | * </ons-carousel>
|
12222 | */
|
12223 |
|
12224 | var CarouselItemElement = /*#__PURE__*/function (_BaseElement) {
|
12225 | _inherits(CarouselItemElement, _BaseElement);
|
12226 |
|
12227 | var _super = _createSuper(CarouselItemElement);
|
12228 |
|
12229 | function CarouselItemElement() {
|
12230 | var _this;
|
12231 |
|
12232 | _classCallCheck(this, CarouselItemElement);
|
12233 |
|
12234 | _this = _super.call(this);
|
12235 | _this.style.width = '100%';
|
12236 | ModifierUtil.initModifier(_assertThisInitialized(_this), scheme$p);
|
12237 | return _this;
|
12238 | }
|
12239 |
|
12240 | _createClass(CarouselItemElement, [{
|
12241 | key: "attributeChangedCallback",
|
12242 | value: function attributeChangedCallback(name, last, current) {
|
12243 | if (name === 'modifier') {
|
12244 | return ModifierUtil.onModifierChanged(last, current, this, scheme$p);
|
12245 | }
|
12246 | }
|
12247 | }], [{
|
12248 | key: "observedAttributes",
|
12249 | get: function get() {
|
12250 | return ['modifier'];
|
12251 | }
|
12252 | }]);
|
12253 |
|
12254 | return CarouselItemElement;
|
12255 | }(BaseElement);
|
12256 | onsElements.CarouselItem = CarouselItemElement;
|
12257 | customElements.define('ons-carousel-item', CarouselItemElement);
|
12258 |
|
12259 | var directionMap = {
|
12260 | vertical: {
|
12261 | axis: 'Y',
|
12262 | size: 'Height',
|
12263 | dir: ['up', 'down'],
|
12264 | t3d: ['0px, ', 'px, 0px']
|
12265 | },
|
12266 | horizontal: {
|
12267 | axis: 'X',
|
12268 | size: 'Width',
|
12269 | dir: ['left', 'right'],
|
12270 | t3d: ['', 'px, 0px, 0px']
|
12271 | }
|
12272 | };
|
12273 |
|
12274 | var Swiper = /*#__PURE__*/function () {
|
12275 | function Swiper(params) {
|
12276 | var _this = this;
|
12277 |
|
12278 | _classCallCheck(this, Swiper);
|
12279 |
|
12280 | // Parameters
|
12281 | var FALSE = function FALSE() {
|
12282 | return false;
|
12283 | };
|
12284 |
|
12285 | "getInitialIndex getBubbleWidth isVertical isOverScrollable isCentered\n isAutoScrollable refreshHook preChangeHook postChangeHook overScrollHook".split(/\s+/).forEach(function (key) {
|
12286 | return _this[key] = params[key] || FALSE;
|
12287 | });
|
12288 | this.getElement = params.getElement; // Required
|
12289 |
|
12290 | this.scrollHook = params.scrollHook; // Optional
|
12291 |
|
12292 | this.itemSize = params.itemSize || '100%';
|
12293 |
|
12294 | this.getAutoScrollRatio = function () {
|
12295 | var ratio = params.getAutoScrollRatio && params.getAutoScrollRatio.apply(params, arguments);
|
12296 | ratio = typeof ratio === 'number' && ratio === ratio ? ratio : .5;
|
12297 |
|
12298 | if (ratio < 0.0 || ratio > 1.0) {
|
12299 | util$4.throw('Invalid auto-scroll-ratio ' + ratio + '. Must be between 0 and 1');
|
12300 | }
|
12301 |
|
12302 | return ratio;
|
12303 | }; // Prevent clicks only on desktop
|
12304 |
|
12305 |
|
12306 | this.shouldBlock = util$4.globals.actualMobileOS === 'other'; // Bind handlers
|
12307 |
|
12308 | this.onDragStart = this.onDragStart.bind(this);
|
12309 | this.onDrag = this.onDrag.bind(this);
|
12310 | this.onDragEnd = this.onDragEnd.bind(this);
|
12311 | this.onResize = this.onResize.bind(this);
|
12312 | this._shouldFixScroll = util$4.globals.actualMobileOS === 'ios';
|
12313 | }
|
12314 |
|
12315 | _createClass(Swiper, [{
|
12316 | key: "init",
|
12317 | value: function init() {
|
12318 | var _this2 = this;
|
12319 |
|
12320 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
12321 | swipeable = _ref.swipeable,
|
12322 | autoRefresh = _ref.autoRefresh;
|
12323 |
|
12324 | this.initialized = true;
|
12325 | this.target = this.getElement().children[0];
|
12326 | this.blocker = this.getElement().children[1];
|
12327 |
|
12328 | if (!this.target || !this.blocker) {
|
12329 | util$4.throw('Expected "target" and "blocker" elements to exist before initializing Swiper');
|
12330 | }
|
12331 |
|
12332 | if (!this.shouldBlock) {
|
12333 | this.blocker.style.display = 'none';
|
12334 | } // Add classes
|
12335 |
|
12336 |
|
12337 | this.getElement().classList.add('ons-swiper');
|
12338 | this.target.classList.add('ons-swiper-target');
|
12339 | this.blocker.classList.add('ons-swiper-blocker'); // Setup listeners
|
12340 |
|
12341 | this._gestureDetector = new GestureDetector(this.getElement(), {
|
12342 | dragMinDistance: 1,
|
12343 | dragLockToAxis: true,
|
12344 | passive: !this._shouldFixScroll
|
12345 | });
|
12346 | this._mutationObserver = new MutationObserver(function () {
|
12347 | return _this2.refresh();
|
12348 | });
|
12349 | this.updateSwipeable(swipeable);
|
12350 | this.updateAutoRefresh(autoRefresh); // Setup initial layout
|
12351 |
|
12352 | this._scroll = this._offset = this._lastActiveIndex = 0;
|
12353 |
|
12354 | this._updateLayout();
|
12355 |
|
12356 | this._setupInitialIndex();
|
12357 |
|
12358 | setImmediate(function () {
|
12359 | return _this2.initialized && _this2._setupInitialIndex();
|
12360 | }); // Fix rendering glitch on Android 4.1
|
12361 | // Fix for iframes where the width is inconsistent at the beginning
|
12362 |
|
12363 | if (window !== window.parent || this.offsetHeight === 0) {
|
12364 | window.requestAnimationFrame(function () {
|
12365 | return _this2.initialized && _this2.onResize();
|
12366 | });
|
12367 | }
|
12368 | }
|
12369 | }, {
|
12370 | key: "dispose",
|
12371 | value: function dispose() {
|
12372 | this.initialized = false;
|
12373 | this.updateSwipeable(false);
|
12374 | this.updateAutoRefresh(false);
|
12375 | this._gestureDetector && this._gestureDetector.dispose();
|
12376 | this.target = this.blocker = this._gestureDetector = this._mutationObserver = null;
|
12377 | this.setupResize(false);
|
12378 | }
|
12379 | }, {
|
12380 | key: "onResize",
|
12381 | value: function onResize() {
|
12382 | var i = this._scroll / this.itemNumSize;
|
12383 |
|
12384 | this._reset();
|
12385 |
|
12386 | this.setActiveIndex(i);
|
12387 | this.refresh();
|
12388 | }
|
12389 | }, {
|
12390 | key: "itemCount",
|
12391 | get: function get() {
|
12392 | return this.target.children.length;
|
12393 | }
|
12394 | }, {
|
12395 | key: "itemNumSize",
|
12396 | get: function get() {
|
12397 | if (typeof this._itemNumSize !== 'number' || this._itemNumSize !== this._itemNumSize) {
|
12398 | this._itemNumSize = this._calculateItemSize();
|
12399 | }
|
12400 |
|
12401 | return this._itemNumSize;
|
12402 | }
|
12403 | }, {
|
12404 | key: "maxScroll",
|
12405 | get: function get() {
|
12406 | var max = this.itemCount * this.itemNumSize - this.targetSize;
|
12407 | return Math.ceil(max < 0 ? 0 : max); // Need to return an integer value.
|
12408 | }
|
12409 | }, {
|
12410 | key: "_calculateItemSize",
|
12411 | value: function _calculateItemSize() {
|
12412 | var matches = this.itemSize.match(/^(\d+)(px|%)/);
|
12413 |
|
12414 | if (!matches) {
|
12415 | util$4.throw("Invalid state: swiper's size unit must be '%' or 'px'");
|
12416 | }
|
12417 |
|
12418 | var value = parseInt(matches[1], 10);
|
12419 | return matches[2] === '%' ? Math.round(value / 100 * this.targetSize) : value;
|
12420 | }
|
12421 | }, {
|
12422 | key: "_setupInitialIndex",
|
12423 | value: function _setupInitialIndex() {
|
12424 | this._reset();
|
12425 |
|
12426 | this._lastActiveIndex = Math.max(Math.min(Number(this.getInitialIndex()), this.itemCount), 0);
|
12427 | this._scroll = this._offset + this.itemNumSize * this._lastActiveIndex;
|
12428 |
|
12429 | this._scrollTo(this._scroll);
|
12430 | }
|
12431 | }, {
|
12432 | key: "_setSwiping",
|
12433 | value: function _setSwiping(toggle) {
|
12434 | this.target.classList.toggle('swiping', toggle); // Hides everything except shown pages
|
12435 | }
|
12436 | }, {
|
12437 | key: "setActiveIndex",
|
12438 | value: function setActiveIndex(index) {
|
12439 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
12440 |
|
12441 | this._setSwiping(true);
|
12442 |
|
12443 | index = Math.max(0, Math.min(index, this.itemCount - 1));
|
12444 | var scroll = Math.max(0, Math.min(this.maxScroll, this._offset + this.itemNumSize * index));
|
12445 | return this._changeTo(scroll, options);
|
12446 | }
|
12447 | }, {
|
12448 | key: "getActiveIndex",
|
12449 | value: function getActiveIndex() {
|
12450 | var scroll = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._scroll;
|
12451 | scroll -= this._offset;
|
12452 | var count = this.itemCount,
|
12453 | size = this.itemNumSize;
|
12454 |
|
12455 | if (this.itemNumSize === 0 || !util$4.isInteger(scroll)) {
|
12456 | return this._lastActiveIndex;
|
12457 | }
|
12458 |
|
12459 | if (scroll <= 0) {
|
12460 | return 0;
|
12461 | }
|
12462 |
|
12463 | for (var i = 0; i < count; i++) {
|
12464 | if (size * i <= scroll && size * (i + 1) > scroll) {
|
12465 | return i;
|
12466 | }
|
12467 | }
|
12468 |
|
12469 | return count - 1;
|
12470 | }
|
12471 | }, {
|
12472 | key: "setupResize",
|
12473 | value: function setupResize(add) {
|
12474 | window[(add ? 'add' : 'remove') + 'EventListener']('resize', this.onResize, true);
|
12475 | }
|
12476 | }, {
|
12477 | key: "show",
|
12478 | value: function show() {
|
12479 | var _this3 = this;
|
12480 |
|
12481 | this.setupResize(true);
|
12482 | this.onResize();
|
12483 | setTimeout(function () {
|
12484 | return _this3.target && _this3.target.classList.add('active');
|
12485 | }, 1000 / 60); // Hide elements after animations
|
12486 | }
|
12487 | }, {
|
12488 | key: "hide",
|
12489 | value: function hide() {
|
12490 | this.setupResize(false);
|
12491 | this.target.classList.remove('active'); // Show elements before animations
|
12492 | }
|
12493 | }, {
|
12494 | key: "updateSwipeable",
|
12495 | value: function updateSwipeable(shouldUpdate) {
|
12496 | if (this._gestureDetector) {
|
12497 | var action = shouldUpdate ? 'on' : 'off';
|
12498 |
|
12499 | this._gestureDetector[action]('drag', this.onDrag);
|
12500 |
|
12501 | this._gestureDetector[action]('dragstart', this.onDragStart);
|
12502 |
|
12503 | this._gestureDetector[action]('dragend', this.onDragEnd);
|
12504 | }
|
12505 | }
|
12506 | }, {
|
12507 | key: "updateAutoRefresh",
|
12508 | value: function updateAutoRefresh(shouldWatch) {
|
12509 | if (this._mutationObserver) {
|
12510 | shouldWatch ? this._mutationObserver.observe(this.target, {
|
12511 | childList: true
|
12512 | }) : this._mutationObserver.disconnect();
|
12513 | }
|
12514 | }
|
12515 | }, {
|
12516 | key: "updateItemSize",
|
12517 | value: function updateItemSize(newSize) {
|
12518 | this.itemSize = newSize || '100%';
|
12519 | this.refresh();
|
12520 | }
|
12521 | }, {
|
12522 | key: "toggleBlocker",
|
12523 | value: function toggleBlocker(block) {
|
12524 | this.blocker.style.pointerEvents = block ? 'auto' : 'none';
|
12525 | }
|
12526 | }, {
|
12527 | key: "_canConsumeGesture",
|
12528 | value: function _canConsumeGesture(gesture) {
|
12529 | var d = gesture.direction;
|
12530 | var isFirst = this._scroll === 0 && !this.isOverScrollable();
|
12531 | var isLast = this._scroll === this.maxScroll && !this.isOverScrollable();
|
12532 | return this.isVertical() ? d === 'down' && !isFirst || d === 'up' && !isLast : d === 'right' && !isFirst || d === 'left' && !isLast;
|
12533 | }
|
12534 | }, {
|
12535 | key: "onDragStart",
|
12536 | value: function onDragStart(event) {
|
12537 | var _this4 = this;
|
12538 |
|
12539 | this._ignoreDrag = event.consumed || !util$4.isValidGesture(event);
|
12540 |
|
12541 | if (!this._ignoreDrag) {
|
12542 | var consume = event.consume;
|
12543 |
|
12544 | event.consume = function () {
|
12545 | consume && consume();
|
12546 | _this4._ignoreDrag = true;
|
12547 | };
|
12548 |
|
12549 | if (this._canConsumeGesture(event.gesture)) {
|
12550 | var startX = event.gesture.center && event.gesture.center.clientX || 0,
|
12551 | distFromEdge = this.getBubbleWidth() || 0,
|
12552 | start = function start() {
|
12553 | consume && consume();
|
12554 | event.consumed = true;
|
12555 | _this4._started = true; // Avoid starting drag from outside
|
12556 |
|
12557 | _this4.shouldBlock && _this4.toggleBlocker(true);
|
12558 |
|
12559 | _this4._setSwiping(true);
|
12560 |
|
12561 | util$4.iosPreventScroll(_this4._gestureDetector);
|
12562 | }; // Let parent elements consume the gesture or consume it right away
|
12563 |
|
12564 |
|
12565 | startX < distFromEdge || startX > this.targetSize - distFromEdge ? setImmediate(function () {
|
12566 | return !_this4._ignoreDrag && start();
|
12567 | }) : start();
|
12568 | }
|
12569 | }
|
12570 | }
|
12571 | }, {
|
12572 | key: "onDrag",
|
12573 | value: function onDrag(event) {
|
12574 | if (!event.gesture || this._ignoreDrag || !this._started) {
|
12575 | return;
|
12576 | }
|
12577 |
|
12578 | this._continued = true; // Fix for random 'dragend' without 'drag'
|
12579 |
|
12580 | event.stopPropagation();
|
12581 |
|
12582 | this._scrollTo(this._scroll - this._getDelta(event), {
|
12583 | throttle: true
|
12584 | });
|
12585 | }
|
12586 | }, {
|
12587 | key: "onDragEnd",
|
12588 | value: function onDragEnd(event) {
|
12589 | this._started = false;
|
12590 |
|
12591 | if (!event.gesture || this._ignoreDrag || !this._continued) {
|
12592 | this._ignoreDrag = true; // onDragEnd might fire before onDragStart's setImmediate
|
12593 |
|
12594 | return;
|
12595 | }
|
12596 |
|
12597 | this._continued = false;
|
12598 | event.stopPropagation();
|
12599 |
|
12600 | var scroll = this._scroll - this._getDelta(event);
|
12601 |
|
12602 | var normalizedScroll = this._normalizeScroll(scroll);
|
12603 |
|
12604 | scroll === normalizedScroll ? this._startMomentumScroll(scroll, event) : this._killOverScroll(normalizedScroll);
|
12605 | this.shouldBlock && this.toggleBlocker(false);
|
12606 | }
|
12607 | }, {
|
12608 | key: "_startMomentumScroll",
|
12609 | value: function _startMomentumScroll(scroll, event) {
|
12610 | var velocity = this._getVelocity(event),
|
12611 | matchesDirection = event.gesture.interimDirection === this.dM.dir[this._getDelta(event) < 0 ? 0 : 1];
|
12612 |
|
12613 | var nextScroll = this._getAutoScroll(scroll, velocity, matchesDirection);
|
12614 |
|
12615 | var duration = Math.abs(nextScroll - scroll) / (velocity + 0.01) / 1000;
|
12616 | duration = Math.min(.25, Math.max(.1, duration));
|
12617 |
|
12618 | this._changeTo(nextScroll, {
|
12619 | swipe: true,
|
12620 | animationOptions: {
|
12621 | duration: duration,
|
12622 | timing: 'cubic-bezier(.4, .7, .5, 1)'
|
12623 | }
|
12624 | });
|
12625 | }
|
12626 | }, {
|
12627 | key: "_killOverScroll",
|
12628 | value: function _killOverScroll(scroll) {
|
12629 | var _this5 = this;
|
12630 |
|
12631 | this._scroll = scroll;
|
12632 | var direction = this.dM.dir[Number(scroll > 0)];
|
12633 |
|
12634 | var killOverScroll = function killOverScroll() {
|
12635 | return _this5._changeTo(scroll, {
|
12636 | animationOptions: {
|
12637 | duration: .4,
|
12638 | timing: 'cubic-bezier(.1, .4, .1, 1)'
|
12639 | }
|
12640 | });
|
12641 | };
|
12642 |
|
12643 | this.overScrollHook({
|
12644 | direction: direction,
|
12645 | killOverScroll: killOverScroll
|
12646 | }) || killOverScroll();
|
12647 | }
|
12648 | }, {
|
12649 | key: "_changeTo",
|
12650 | value: function _changeTo(scroll) {
|
12651 | var _this6 = this;
|
12652 |
|
12653 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
12654 | var e = {
|
12655 | activeIndex: this.getActiveIndex(scroll),
|
12656 | lastActiveIndex: this._lastActiveIndex,
|
12657 | swipe: options.swipe || false
|
12658 | };
|
12659 | var change = e.activeIndex !== e.lastActiveIndex;
|
12660 | var canceled = change ? this.preChangeHook(e) : false;
|
12661 | this._scroll = canceled ? this._offset + e.lastActiveIndex * this.itemNumSize : scroll;
|
12662 | this._lastActiveIndex = canceled ? e.lastActiveIndex : e.activeIndex;
|
12663 | return this._scrollTo(this._scroll, options).then(function () {
|
12664 | if (scroll === _this6._scroll && !canceled) {
|
12665 | _this6._setSwiping(false);
|
12666 |
|
12667 | change && _this6.postChangeHook(e);
|
12668 | } else if (options.reject) {
|
12669 | _this6._setSwiping(false);
|
12670 |
|
12671 | return Promise.reject('Canceled');
|
12672 | }
|
12673 | });
|
12674 | }
|
12675 | }, {
|
12676 | key: "_scrollTo",
|
12677 | value: function _scrollTo(scroll) {
|
12678 | var _this7 = this;
|
12679 |
|
12680 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
12681 |
|
12682 | if (options.throttle) {
|
12683 | var ratio = 0.35;
|
12684 |
|
12685 | if (scroll < 0) {
|
12686 | scroll = this.isOverScrollable() ? Math.round(scroll * ratio) : 0;
|
12687 | } else {
|
12688 | var maxScroll = this.maxScroll;
|
12689 |
|
12690 | if (maxScroll < scroll) {
|
12691 | scroll = this.isOverScrollable() ? maxScroll + Math.round((scroll - maxScroll) * ratio) : maxScroll;
|
12692 | }
|
12693 | }
|
12694 | }
|
12695 |
|
12696 | var opt = options.animation === 'none' ? {} : options.animationOptions;
|
12697 | this.scrollHook && this.itemNumSize > 0 && this.scrollHook((scroll / this.itemNumSize).toFixed(2), options.animationOptions || {});
|
12698 | return new Promise(function (resolve) {
|
12699 | return Animit(_this7.target).queue({
|
12700 | transform: _this7._getTransform(scroll)
|
12701 | }, opt).play(resolve);
|
12702 | });
|
12703 | }
|
12704 | }, {
|
12705 | key: "_getAutoScroll",
|
12706 | value: function _getAutoScroll(scroll, velocity, matchesDirection) {
|
12707 | var max = this.maxScroll,
|
12708 | offset = this._offset,
|
12709 | size = this.itemNumSize;
|
12710 |
|
12711 | if (!this.isAutoScrollable()) {
|
12712 | return Math.max(0, Math.min(max, scroll));
|
12713 | }
|
12714 |
|
12715 | var arr = [];
|
12716 |
|
12717 | for (var s = offset; s < max; s += size) {
|
12718 | arr.push(s);
|
12719 | }
|
12720 |
|
12721 | arr.push(max);
|
12722 | arr = arr.sort(function (left, right) {
|
12723 | return Math.abs(left - scroll) - Math.abs(right - scroll);
|
12724 | }).filter(function (item, pos) {
|
12725 | return !pos || item !== arr[pos - 1];
|
12726 | });
|
12727 | var result = arr[0];
|
12728 | var lastScroll = this._lastActiveIndex * size + offset;
|
12729 | var scrollRatio = Math.abs(scroll - lastScroll) / size;
|
12730 |
|
12731 | if (scrollRatio <= this.getAutoScrollRatio(matchesDirection, velocity, size)) {
|
12732 | result = lastScroll;
|
12733 | } else {
|
12734 | if (scrollRatio < 1.0 && arr[0] === lastScroll && arr.length > 1) {
|
12735 | result = arr[1];
|
12736 | }
|
12737 | }
|
12738 |
|
12739 | return Math.max(0, Math.min(max, result));
|
12740 | }
|
12741 | }, {
|
12742 | key: "_reset",
|
12743 | value: function _reset() {
|
12744 | this._targetSize = this._itemNumSize = undefined;
|
12745 | }
|
12746 | }, {
|
12747 | key: "_normalizeScroll",
|
12748 | value: function _normalizeScroll(scroll) {
|
12749 | return Math.max(Math.min(scroll, this.maxScroll), 0);
|
12750 | }
|
12751 | }, {
|
12752 | key: "refresh",
|
12753 | value: function refresh() {
|
12754 | this._reset();
|
12755 |
|
12756 | this._updateLayout();
|
12757 |
|
12758 | if (util$4.isInteger(this._scroll)) {
|
12759 | var scroll = this._normalizeScroll(this._scroll);
|
12760 |
|
12761 | scroll !== this._scroll ? this._killOverScroll(scroll) : this._changeTo(scroll);
|
12762 | } else {
|
12763 | this._setupInitialIndex();
|
12764 | }
|
12765 |
|
12766 | this.refreshHook();
|
12767 | }
|
12768 | }, {
|
12769 | key: "targetSize",
|
12770 | get: function get() {
|
12771 | if (!this._targetSize) {
|
12772 | this._targetSize = this.target["offset".concat(this.dM.size)];
|
12773 | }
|
12774 |
|
12775 | return this._targetSize;
|
12776 | }
|
12777 | }, {
|
12778 | key: "_getDelta",
|
12779 | value: function _getDelta(event) {
|
12780 | return event.gesture["delta".concat(this.dM.axis)];
|
12781 | }
|
12782 | }, {
|
12783 | key: "_getVelocity",
|
12784 | value: function _getVelocity(event) {
|
12785 | return event.gesture["velocity".concat(this.dM.axis)];
|
12786 | }
|
12787 | }, {
|
12788 | key: "_getTransform",
|
12789 | value: function _getTransform(scroll) {
|
12790 | return "translate3d(".concat(this.dM.t3d[0]).concat(-scroll).concat(this.dM.t3d[1], ")");
|
12791 | }
|
12792 | }, {
|
12793 | key: "_updateLayout",
|
12794 | value: function _updateLayout() {
|
12795 | this.dM = directionMap[this.isVertical() ? 'vertical' : 'horizontal'];
|
12796 | this.target.classList.toggle('ons-swiper-target--vertical', this.isVertical());
|
12797 |
|
12798 | for (var c = this.target.children[0]; c; c = c.nextElementSibling) {
|
12799 | c.style[this.dM.size.toLowerCase()] = this.itemSize;
|
12800 | }
|
12801 |
|
12802 | if (this.isCentered()) {
|
12803 | this._offset = (this.targetSize - this.itemNumSize) / -2 || 0;
|
12804 | }
|
12805 | }
|
12806 | }]);
|
12807 |
|
12808 | return Swiper;
|
12809 | }();
|
12810 |
|
12811 | /**
|
12812 | * @element ons-carousel
|
12813 | * @category carousel
|
12814 | * @description
|
12815 | * [en]
|
12816 | * Carousel component. A carousel can be used to display several items in the same space.
|
12817 | *
|
12818 | * The component supports displaying content both horizontally and vertically. The user can scroll through the items by dragging and it can also be controller programmatically.
|
12819 | * [/en]
|
12820 | * [ja][/ja]
|
12821 | * @codepen xbbzOQ
|
12822 | * @tutorial vanilla/Reference/carousel
|
12823 | * @seealso ons-carousel-item
|
12824 | * [en]`<ons-carousel-item>` component[/en]
|
12825 | * [ja]ons-carousel-itemコンポーネント[/ja]
|
12826 | * @example
|
12827 | * <ons-carousel style="width: 100%; height: 200px">
|
12828 | * <ons-carousel-item>
|
12829 | * ...
|
12830 | * </ons-carousel-item>
|
12831 | * <ons-carousel-item>
|
12832 | * ...
|
12833 | * </ons-carousel-item>
|
12834 | * </ons-carousel>
|
12835 | */
|
12836 |
|
12837 | var CarouselElement = /*#__PURE__*/function (_BaseElement) {
|
12838 | _inherits(CarouselElement, _BaseElement);
|
12839 |
|
12840 | var _super = _createSuper(CarouselElement);
|
12841 |
|
12842 | /**
|
12843 | * @event postchange
|
12844 | * @description
|
12845 | * [en]Fired just after the current carousel item has changed.[/en]
|
12846 | * [ja]現在表示しているカルーセルの要素が変わった時に発火します。[/ja]
|
12847 | * @param {Object} event
|
12848 | * [en]Event object.[/en]
|
12849 | * [ja]イベントオブジェクトです。[/ja]
|
12850 | * @param {Object} event.carousel
|
12851 | * [en]Carousel object.[/en]
|
12852 | * [ja]イベントが発火したCarouselオブジェクトです。[/ja]
|
12853 | * @param {Number} event.activeIndex
|
12854 | * [en]Current active index.[/en]
|
12855 | * [ja]現在アクティブになっている要素のインデックス。[/ja]
|
12856 | * @param {Number} event.lastActiveIndex
|
12857 | * [en]Previous active index.[/en]
|
12858 | * [ja]以前アクティブだった要素のインデックス。[/ja]
|
12859 | */
|
12860 |
|
12861 | /**
|
12862 | * @event prechange
|
12863 | * @description
|
12864 | * [en]Fired just before the current carousel item changes.[/en]
|
12865 | * [ja][/ja]
|
12866 | * @param {Object} event
|
12867 | * [en]Event object.[/en]
|
12868 | * [ja]イベントオブジェクトです。[/ja]
|
12869 | * @param {Object} event.carousel
|
12870 | * [en]Carousel object.[/en]
|
12871 | * [ja]イベントが発火したCarouselオブジェクトです。[/ja]
|
12872 | * @param {Number} event.activeIndex
|
12873 | * [en]Current active index.[/en]
|
12874 | * [ja]現在アクティブになっている要素のインデックス。[/ja]
|
12875 | * @param {Number} event.lastActiveIndex
|
12876 | * [en]Previous active index.[/en]
|
12877 | * [ja]以前アクティブだった要素のインデックス。[/ja]
|
12878 | */
|
12879 |
|
12880 | /**
|
12881 | * @event refresh
|
12882 | * @description
|
12883 | * [en]Fired when the carousel has been refreshed.[/en]
|
12884 | * [ja]カルーセルが更新された時に発火します。[/ja]
|
12885 | * @param {Object} event
|
12886 | * [en]Event object.[/en]
|
12887 | * [ja]イベントオブジェクトです。[/ja]
|
12888 | * @param {Object} event.carousel
|
12889 | * [en]Carousel object.[/en]
|
12890 | * [ja]イベントが発火したCarouselオブジェクトです。[/ja]
|
12891 | */
|
12892 |
|
12893 | /**
|
12894 | * @event overscroll
|
12895 | * @description
|
12896 | * [en]Fired when the carousel has been overscrolled.[/en]
|
12897 | * [ja]カルーセルがオーバースクロールした時に発火します。[/ja]
|
12898 | * @param {Object} event
|
12899 | * [en]Event object.[/en]
|
12900 | * [ja]イベントオブジェクトです。[/ja]
|
12901 | * @param {Object} event.carousel
|
12902 | * [en]Fired when the carousel has been refreshed.[/en]
|
12903 | * [ja]カルーセルが更新された時に発火します。[/ja]
|
12904 | * @param {Number} event.activeIndex
|
12905 | * [en]Current active index.[/en]
|
12906 | * [ja]現在アクティブになっている要素のインデックス。[/ja]
|
12907 | * @param {String} event.direction
|
12908 | * [en]Can be one of either "up", "down", "left" or "right".[/en]
|
12909 | * [ja]オーバースクロールされた方向が得られます。"up", "down", "left", "right"のいずれかの方向が渡されます。[/ja]
|
12910 | * @param {Function} event.waitToReturn
|
12911 | * [en]Takes a <code>Promise</code> object as an argument. The carousel will not scroll back until the promise has been resolved or rejected.[/en]
|
12912 | * [ja]この関数はPromiseオブジェクトを引数として受け取ります。渡したPromiseオブジェクトがresolveされるかrejectされるまで、カルーセルはスクロールバックしません。[/ja]
|
12913 | */
|
12914 |
|
12915 | /**
|
12916 | * @event swipe
|
12917 | * @description
|
12918 | * [en]Fires when the carousel swipes.[/en]
|
12919 | * [ja][/ja]
|
12920 | * @param {Object} event
|
12921 | * [en]Event object.[/en]
|
12922 | * [ja]イベントオブジェクト。[/ja]
|
12923 | * @param {Number} event.index
|
12924 | * [en]Current index.[/en]
|
12925 | * [ja]現在アクティブになっているons-carouselのインデックスを返します。[/ja]
|
12926 | * @param {Object} event.options
|
12927 | * [en]Animation options object.[/en]
|
12928 | * [ja][/ja]
|
12929 | */
|
12930 |
|
12931 | /**
|
12932 | * @attribute direction
|
12933 | * @type {String}
|
12934 | * @description
|
12935 | * [en]The direction of the carousel. Can be either "horizontal" or "vertical". Default is "horizontal".[/en]
|
12936 | * [ja]カルーセルの方向を指定します。"horizontal"か"vertical"を指定できます。"horizontal"がデフォルト値です。[/ja]
|
12937 | */
|
12938 |
|
12939 | /**
|
12940 | * @attribute fullscreen
|
12941 | * @description
|
12942 | * [en]If this attribute is set the carousel will cover the whole screen.[/en]
|
12943 | * [ja]この属性があると、absoluteポジションを使ってカルーセルが自動的に画面いっぱいに広がります。[/ja]
|
12944 | */
|
12945 |
|
12946 | /**
|
12947 | * @property fullscreen
|
12948 | * @type {Boolean}
|
12949 | * @description
|
12950 | * [en]If this property is set the carousel will cover the whole screen.[/en]
|
12951 | * [ja]この属性があると、absoluteポジションを使ってカルーセルが自動的に画面いっぱいに広がります。[/ja]
|
12952 | */
|
12953 |
|
12954 | /**
|
12955 | * @attribute overscrollable
|
12956 | * @description
|
12957 | * [en]If this attribute is set the carousel will be scrollable over the edge. It will bounce back when released.[/en]
|
12958 | * [ja]この属性がある時、タッチやドラッグで端までスクロールした時に、バウンドするような効果が当たります。[/ja]
|
12959 | */
|
12960 |
|
12961 | /**
|
12962 | * @attribute centered
|
12963 | * @description
|
12964 | * [en]If this attribute is set the carousel then the selected item will be in the center of the carousel instead of the beginning. Useful only when the items are smaller than the carousel. [/en]
|
12965 | * [ja]この属性がある時、選んでいるons-carousel-itemはカルーセルの真ん中へ行きます。項目がカルーセルよりも小さい場合にのみ、これは便利です。[/ja]
|
12966 | */
|
12967 |
|
12968 | /**
|
12969 | * @attribute item-width
|
12970 | * @type {String}
|
12971 | * @description
|
12972 | * [en]ons-carousel-item's width. Only works when the direction is set to "horizontal".[/en]
|
12973 | * [ja]ons-carousel-itemの幅を指定します。この属性は、direction属性に"horizontal"を指定した時のみ有効になります。[/ja]
|
12974 | */
|
12975 |
|
12976 | /**
|
12977 | * @attribute item-height
|
12978 | * @type {String}
|
12979 | * @description
|
12980 | * [en]ons-carousel-item's height. Only works when the direction is set to "vertical".[/en]
|
12981 | * [ja]ons-carousel-itemの高さを指定します。この属性は、direction属性に"vertical"を指定した時のみ有効になります。[/ja]
|
12982 | */
|
12983 |
|
12984 | /**
|
12985 | * @attribute auto-scroll
|
12986 | * @description
|
12987 | * [en]If this attribute is set the carousel will be automatically scrolled to the closest item border when released.[/en]
|
12988 | * [ja]この属性がある時、一番近いcarousel-itemの境界まで自動的にスクロールするようになります。[/ja]
|
12989 | */
|
12990 |
|
12991 | /**
|
12992 | * @attribute auto-scroll-ratio
|
12993 | * @type {Number}
|
12994 | * @description
|
12995 | * [en]A number between 0.0 and 1.0 that specifies how much the user must drag the carousel in order for it to auto scroll to the next item.[/en]
|
12996 | * [ja]0.0から1.0までの値を指定します。カルーセルの要素をどれぐらいの割合までドラッグすると次の要素に自動的にスクロールするかを指定します。[/ja]
|
12997 | */
|
12998 |
|
12999 | /**
|
13000 | * @attribute swipeable
|
13001 | * @description
|
13002 | * [en]If this attribute is set the carousel can be scrolled by drag or swipe.[/en]
|
13003 | * [ja]この属性がある時、カルーセルをスワイプやドラッグで移動できるようになります。[/ja]
|
13004 | */
|
13005 |
|
13006 | /**
|
13007 | * @attribute disabled
|
13008 | * @description
|
13009 | * [en]If this attribute is set the carousel is disabled.[/en]
|
13010 | * [ja]この属性がある時、dragやtouchやswipeを受け付けなくなります。[/ja]
|
13011 | */
|
13012 |
|
13013 | /**
|
13014 | * @attribute initial-index
|
13015 | * @initonly
|
13016 | * @default 0
|
13017 | * @type {Number}
|
13018 | * @description
|
13019 | * [en]Specify the index of the ons-carousel-item to show initially. Default is 0. If active-index is set, initial-index is ignored.[/en]
|
13020 | * [ja]最初に表示するons-carousel-itemを0始まりのインデックスで指定します。デフォルト値は 0 です。[/ja]
|
13021 | */
|
13022 |
|
13023 | /**
|
13024 | * @attribute auto-refresh
|
13025 | * @description
|
13026 | * [en]When this attribute is set the carousel will automatically refresh when the number of child nodes change.[/en]
|
13027 | * [ja]この属性がある時、子要素の数が変わるとカルーセルは自動的に更新されるようになります。[/ja]
|
13028 | */
|
13029 |
|
13030 | /**
|
13031 | * @property autoRefresh
|
13032 | * @type {Boolean}
|
13033 | * @description
|
13034 | * [en]When this property is set the carousel will automatically refresh when the number of child nodes change.[/en]
|
13035 | * [ja]この属性がある時、子要素の数が変わるとカルーセルは自動的に更新されるようになります。[/ja]
|
13036 | */
|
13037 |
|
13038 | /**
|
13039 | * @attribute animation
|
13040 | * @type {String}
|
13041 | * @description
|
13042 | * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
|
13043 | * [ja][/ja]
|
13044 | */
|
13045 |
|
13046 | /**
|
13047 | * @attribute animation-options
|
13048 | * @type {Expression}
|
13049 | * @description
|
13050 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
13051 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
|
13052 | */
|
13053 | function CarouselElement() {
|
13054 | var _this;
|
13055 |
|
13056 | _classCallCheck(this, CarouselElement);
|
13057 |
|
13058 | _this = _super.call(this);
|
13059 |
|
13060 | var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'swipe'),
|
13061 | onConnected = _util$defineListenerP.onConnected,
|
13062 | onDisconnected = _util$defineListenerP.onDisconnected;
|
13063 |
|
13064 | _this._connectOnSwipe = onConnected;
|
13065 | _this._disconnectOnSwipe = onDisconnected;
|
13066 | contentReady(_assertThisInitialized(_this), function () {
|
13067 | return _this._compile();
|
13068 | });
|
13069 | return _this;
|
13070 | }
|
13071 |
|
13072 | _createClass(CarouselElement, [{
|
13073 | key: "_compile",
|
13074 | value: function _compile() {
|
13075 | var target = this.children[0] && this.children[0].tagName !== 'ONS-CAROUSEL-ITEM' && this.children[0] || document.createElement('div');
|
13076 |
|
13077 | if (!target.parentNode) {
|
13078 | while (this.firstChild) {
|
13079 | target.appendChild(this.firstChild);
|
13080 | }
|
13081 |
|
13082 | this.appendChild(target);
|
13083 | }
|
13084 |
|
13085 | !this.children[1] && this.appendChild(document.createElement('div'));
|
13086 | this.appendChild = this.appendChild.bind(target);
|
13087 | this.insertBefore = this.insertBefore.bind(target);
|
13088 | }
|
13089 | }, {
|
13090 | key: "connectedCallback",
|
13091 | value: function connectedCallback() {
|
13092 | var _this2 = this;
|
13093 |
|
13094 | if (!this._swiper) {
|
13095 | this._swiper = new Swiper({
|
13096 | getElement: function getElement() {
|
13097 | return _this2;
|
13098 | },
|
13099 | getInitialIndex: function getInitialIndex() {
|
13100 | return _this2.getAttribute('active-index') || _this2.getAttribute('initial-index');
|
13101 | },
|
13102 | getAutoScrollRatio: function getAutoScrollRatio() {
|
13103 | return _this2.autoScrollRatio;
|
13104 | },
|
13105 | isVertical: function isVertical() {
|
13106 | return _this2.vertical;
|
13107 | },
|
13108 | isOverScrollable: function isOverScrollable() {
|
13109 | return _this2.overscrollable;
|
13110 | },
|
13111 | isCentered: function isCentered() {
|
13112 | return _this2.centered;
|
13113 | },
|
13114 | isAutoScrollable: function isAutoScrollable() {
|
13115 | return _this2.autoScroll;
|
13116 | },
|
13117 | itemSize: this.itemSize,
|
13118 | overScrollHook: this._onOverScroll.bind(this),
|
13119 | preChangeHook: this._onPreChange.bind(this),
|
13120 | postChangeHook: this._onPostChange.bind(this),
|
13121 | refreshHook: this._onRefresh.bind(this),
|
13122 | scrollHook: function scrollHook(index, options) {
|
13123 | return util$4.triggerElementEvent(_this2, 'swipe', {
|
13124 | index: index,
|
13125 | options: options
|
13126 | });
|
13127 | }
|
13128 | });
|
13129 | contentReady(this, function () {
|
13130 | return _this2._swiper.init({
|
13131 | swipeable: _this2.hasAttribute('swipeable'),
|
13132 | autoRefresh: _this2.hasAttribute('auto-refresh')
|
13133 | });
|
13134 | });
|
13135 | }
|
13136 |
|
13137 | this._connectOnSwipe();
|
13138 | }
|
13139 | }, {
|
13140 | key: "disconnectedCallback",
|
13141 | value: function disconnectedCallback() {
|
13142 | if (this._swiper && this._swiper.initialized) {
|
13143 | this._swiper.dispose();
|
13144 |
|
13145 | this._swiper = null;
|
13146 | }
|
13147 |
|
13148 | this._disconnectOnSwipe();
|
13149 | }
|
13150 | }, {
|
13151 | key: "attributeChangedCallback",
|
13152 | value: function attributeChangedCallback(name, last, current) {
|
13153 | if (!this._swiper) {
|
13154 | return;
|
13155 | }
|
13156 |
|
13157 | switch (name) {
|
13158 | case 'swipeable':
|
13159 | this._swiper.updateSwipeable(this.hasAttribute('swipeable'));
|
13160 |
|
13161 | break;
|
13162 |
|
13163 | case 'auto-refresh':
|
13164 | this._swiper.updateAutoRefresh(this.hasAttribute('auto-refresh'));
|
13165 |
|
13166 | break;
|
13167 |
|
13168 | case 'item-height':
|
13169 | this.vertical && this._swiper.updateItemSize(this.itemSize);
|
13170 | break;
|
13171 |
|
13172 | case 'item-width':
|
13173 | this.vertical || this._swiper.updateItemSize(this.itemSize);
|
13174 | break;
|
13175 |
|
13176 | case 'direction':
|
13177 | this._swiper.refresh();
|
13178 |
|
13179 | break;
|
13180 |
|
13181 | case 'active-index':
|
13182 | if (this.getActiveIndex() !== this.activeIndex) {
|
13183 | this.setActiveIndex(this.activeIndex);
|
13184 | }
|
13185 |
|
13186 | break;
|
13187 | }
|
13188 | }
|
13189 | }, {
|
13190 | key: "_show",
|
13191 | value: function _show() {
|
13192 | this._swiper.show();
|
13193 | }
|
13194 | }, {
|
13195 | key: "_hide",
|
13196 | value: function _hide() {
|
13197 | this._swiper.hide();
|
13198 | }
|
13199 | }, {
|
13200 | key: "_onOverScroll",
|
13201 | value: function _onOverScroll(_ref) {
|
13202 | var direction = _ref.direction,
|
13203 | killOverScroll = _ref.killOverScroll;
|
13204 | var waitForAction = false;
|
13205 | util$4.triggerElementEvent(this, 'overscroll', {
|
13206 | carousel: this,
|
13207 | activeIndex: this.getActiveIndex(),
|
13208 | direction: direction,
|
13209 | waitToReturn: function waitToReturn(promise) {
|
13210 | waitForAction = true;
|
13211 | promise.then(killOverScroll);
|
13212 | }
|
13213 | });
|
13214 | return waitForAction;
|
13215 | }
|
13216 | }, {
|
13217 | key: "_onPreChange",
|
13218 | value: function _onPreChange(_ref2) {
|
13219 | var activeIndex = _ref2.activeIndex,
|
13220 | lastActiveIndex = _ref2.lastActiveIndex;
|
13221 | util$4.triggerElementEvent(this, 'prechange', {
|
13222 | carousel: this,
|
13223 | activeIndex: activeIndex,
|
13224 | lastActiveIndex: lastActiveIndex
|
13225 | });
|
13226 | }
|
13227 | }, {
|
13228 | key: "_onPostChange",
|
13229 | value: function _onPostChange(_ref3) {
|
13230 | var activeIndex = _ref3.activeIndex,
|
13231 | lastActiveIndex = _ref3.lastActiveIndex;
|
13232 | this.activeIndex = activeIndex;
|
13233 | util$4.triggerElementEvent(this, 'postchange', {
|
13234 | carousel: this,
|
13235 | activeIndex: activeIndex,
|
13236 | lastActiveIndex: lastActiveIndex
|
13237 | });
|
13238 | }
|
13239 | }, {
|
13240 | key: "_onRefresh",
|
13241 | value: function _onRefresh() {
|
13242 | util$4.triggerElementEvent(this, 'refresh', {
|
13243 | carousel: this
|
13244 | });
|
13245 | }
|
13246 | /**
|
13247 | * @method setActiveIndex
|
13248 | * @signature setActiveIndex(index, [options])
|
13249 | * @param {Number} index
|
13250 | * [en]The index that the carousel should be set to.[/en]
|
13251 | * [ja]carousel要素のインデックスを指定します。[/ja]
|
13252 | * @param {Object} [options]
|
13253 | * [en]Parameter object.[/en]
|
13254 | * [ja][/ja]
|
13255 | * @param {Function} [options.callback]
|
13256 | * [en]A function that will be called after the animation is finished.[/en]
|
13257 | * [ja][/ja]
|
13258 | * @param {String} [options.animation]
|
13259 | * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
|
13260 | * [ja][/ja]
|
13261 | * @param {Object} [options.animationOptions]
|
13262 | * [en]An object that can be used to specify duration, delay and timing function of the animation.[/en]
|
13263 | * [ja][/ja]
|
13264 | * @description
|
13265 | * [en]Specify the index of the `<ons-carousel-item>` to show.[/en]
|
13266 | * [ja]表示するons-carousel-itemをindexで指定します。[/ja]
|
13267 | * @return {Promise}
|
13268 | * [en]Resolves to the carousel element.[/en]
|
13269 | * [ja][/ja]
|
13270 | */
|
13271 |
|
13272 | }, {
|
13273 | key: "setActiveIndex",
|
13274 | value: function setActiveIndex(index) {
|
13275 | var _this3 = this;
|
13276 |
|
13277 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
13278 | options = _objectSpread2({
|
13279 | animation: this.getAttribute('animation'),
|
13280 | animationOptions: this.animationOptions || {
|
13281 | duration: .3,
|
13282 | timing: 'cubic-bezier(.4, .7, .5, 1)'
|
13283 | }
|
13284 | }, options);
|
13285 | return this._swiper.setActiveIndex(index, options).then(function () {
|
13286 | options.callback instanceof Function && options.callback(_this3);
|
13287 | return Promise.resolve(_this3);
|
13288 | });
|
13289 | }
|
13290 | /**
|
13291 | * @method getActiveIndex
|
13292 | * @signature getActiveIndex()
|
13293 | * @return {Number}
|
13294 | * [en]The current carousel item index.[/en]
|
13295 | * [ja]現在表示しているカルーセル要素のインデックスが返されます。[/ja]
|
13296 | * @description
|
13297 | * [en]Returns the index of the currently visible `<ons-carousel-item>`.[/en]
|
13298 | * [ja]現在表示されているons-carousel-item要素のインデックスを返します。[/ja]
|
13299 | */
|
13300 |
|
13301 | }, {
|
13302 | key: "getActiveIndex",
|
13303 | value: function getActiveIndex() {
|
13304 | return this._swiper.getActiveIndex();
|
13305 | }
|
13306 | /**
|
13307 | * @method next
|
13308 | * @signature next([options])
|
13309 | * @param {Object} [options]
|
13310 | * [en]Parameter object.[/en]
|
13311 | * [ja][/ja]
|
13312 | * @param {Function} [options.callback]
|
13313 | * [en]A function that will be executed after the animation has finished.[/en]
|
13314 | * [ja][/ja]
|
13315 | * @param {String} [options.animation]
|
13316 | * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
|
13317 | * [ja][/ja]
|
13318 | * @param {Object} [options.animationOptions]
|
13319 | * [en]An object that can be used to specify the duration, delay and timing function of the animation.[/en]
|
13320 | * [ja][/ja]
|
13321 | * @return {Promise}
|
13322 | * [en]Resolves to the carousel element[/en]
|
13323 | * [ja][/ja]
|
13324 | * @description
|
13325 | * [en]Show next `<ons-carousel-item>`.[/en]
|
13326 | * [ja]次のons-carousel-itemを表示します。[/ja]
|
13327 | */
|
13328 |
|
13329 | }, {
|
13330 | key: "next",
|
13331 | value: function next(options) {
|
13332 | return this.setActiveIndex(this.getActiveIndex() + 1, options);
|
13333 | }
|
13334 | /**
|
13335 | * @method prev
|
13336 | * @signature prev([options])
|
13337 | * @param {Object} [options]
|
13338 | * [en]Parameter object.[/en]
|
13339 | * [ja][/ja]
|
13340 | * @param {Function} [options.callback]
|
13341 | * [en]A function that will be executed after the animation has finished.[/en]
|
13342 | * [ja][/ja]
|
13343 | * @param {String} [options.animation]
|
13344 | * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
|
13345 | * [ja][/ja]
|
13346 | * @param {Object} [options.animationOptions]
|
13347 | * [en]An object that can be used to specify the duration, delay and timing function of the animation.[/en]
|
13348 | * [ja][/ja]
|
13349 | * @return {Promise}
|
13350 | * [en]Resolves to the carousel element[/en]
|
13351 | * [ja][/ja]
|
13352 | * @description
|
13353 | * [en]Show previous `<ons-carousel-item>`.[/en]
|
13354 | * [ja]前のons-carousel-itemを表示します。[/ja]
|
13355 | */
|
13356 |
|
13357 | }, {
|
13358 | key: "prev",
|
13359 | value: function prev(options) {
|
13360 | return this.setActiveIndex(this.getActiveIndex() - 1, options);
|
13361 | }
|
13362 | /**
|
13363 | * @method first
|
13364 | * @signature first()
|
13365 | * @param {Object} [options]
|
13366 | * [en]Parameter object.[/en]
|
13367 | * [ja][/ja]
|
13368 | * @param {Function} [options.callback]
|
13369 | * [en]A function that will be executed after the animation has finished.[/en]
|
13370 | * [ja][/ja]
|
13371 | * @param {String} [options.animation]
|
13372 | * [en]If this is set to `"none"`, the transitions will not be animated.[/en]
|
13373 | * [ja][/ja]
|
13374 | * @param {Object} [options.animationOptions]
|
13375 | * [en]An object that can be used to specify the duration, delay and timing function of the animation.[/en]
|
13376 | * [ja][/ja]
|
13377 | * @return {Promise}
|
13378 | * [en]Resolves to the carousel element[/en]
|
13379 | * [ja][/ja]
|
13380 | * @description
|
13381 | * [en]Show first `<ons-carousel-item>`.[/en]
|
13382 | * [ja]最初のons-carousel-itemを表示します。[/ja]
|
13383 | */
|
13384 |
|
13385 | }, {
|
13386 | key: "first",
|
13387 | value: function first(options) {
|
13388 | return this.setActiveIndex(0, options);
|
13389 | }
|
13390 | /**
|
13391 | * @method last
|
13392 | * @signature last()
|
13393 | * @param {Object} [options]
|
13394 | * [en]Parameter object.[/en]
|
13395 | * [ja][/ja]
|
13396 | * @param {Function} [options.callback]
|
13397 | * [en]A function that will be executed after the animation has finished.[/en]
|
13398 | * [ja][/ja]
|
13399 | * @param {String} [options.animation]
|
13400 | * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
|
13401 | * [ja][/ja]
|
13402 | * @param {Object} [options.animationOptions]
|
13403 | * [en]An object that can be used to specify the duration, delay and timing function of the animation.[/en]
|
13404 | * [ja][/ja]
|
13405 | * @return {Promise}
|
13406 | * [en]Resolves to the carousel element[/en]
|
13407 | * [ja]Resolves to the carousel element[/ja]
|
13408 | * @description
|
13409 | * [en]Show last ons-carousel item.[/en]
|
13410 | * [ja]最後のons-carousel-itemを表示します。[/ja]
|
13411 | */
|
13412 |
|
13413 | }, {
|
13414 | key: "last",
|
13415 | value: function last(options) {
|
13416 | this.setActiveIndex(Math.max(this.itemCount - 1, 0), options);
|
13417 | }
|
13418 | /**
|
13419 | * @method refresh
|
13420 | * @signature refresh()
|
13421 | * @description
|
13422 | * [en]Update the layout of the carousel. Used when adding `<ons-carousel-items>` dynamically or to automatically adjust the size.[/en]
|
13423 | * [ja]レイアウトや内部の状態を最新のものに更新します。ons-carousel-itemを動的に増やしたり、ons-carouselの大きさを動的に変える際に利用します。[/ja]
|
13424 | */
|
13425 |
|
13426 | }, {
|
13427 | key: "refresh",
|
13428 | value: function refresh() {
|
13429 | this._swiper.refresh();
|
13430 | }
|
13431 | /**
|
13432 | * @property itemCount
|
13433 | * @readonly
|
13434 | * @type {Number}
|
13435 | * @description
|
13436 | * [en]The number of carousel items.[/en]
|
13437 | * [ja]カルーセル要素の数です。[/ja]
|
13438 | */
|
13439 |
|
13440 | }, {
|
13441 | key: "itemCount",
|
13442 | get: function get() {
|
13443 | return this._swiper.itemCount;
|
13444 | }
|
13445 | /**
|
13446 | * @property swipeable
|
13447 | * @type {Boolean}
|
13448 | * @description
|
13449 | * [en]true if the carousel is swipeable.[/en]
|
13450 | * [ja]swipeableであればtrueを返します。[/ja]
|
13451 | */
|
13452 |
|
13453 | /**
|
13454 | * @property onSwipe
|
13455 | * @type {Function}
|
13456 | * @description
|
13457 | * [en]Hook called whenever the user slides the carousel. It gets a decimal index and an animationOptions object as arguments.[/en]
|
13458 | * [ja][/ja]
|
13459 | */
|
13460 |
|
13461 | /**
|
13462 | * @property autoScroll
|
13463 | * @type {Boolean}
|
13464 | * @description
|
13465 | * [en]true if auto scroll is enabled.[/en]
|
13466 | * [ja]オートスクロールが有効であればtrueを返します。[/ja]
|
13467 | */
|
13468 |
|
13469 | }, {
|
13470 | key: "vertical",
|
13471 | get: function get() {
|
13472 | return this.getAttribute('direction') === 'vertical';
|
13473 | }
|
13474 | }, {
|
13475 | key: "itemSize",
|
13476 | get: function get() {
|
13477 | var itemSizeAttr = (this.getAttribute("item-".concat(this.vertical ? 'height' : 'width')) || '').trim();
|
13478 | return itemSizeAttr.match(/^\d+(px|%)$/) ? itemSizeAttr : '100%';
|
13479 | }
|
13480 | /**
|
13481 | * @property autoScrollRatio
|
13482 | * @type {Number}
|
13483 | * @description
|
13484 | * [en]The current auto scroll ratio. [/en]
|
13485 | * [ja]現在のオートスクロールのratio値。[/ja]
|
13486 | */
|
13487 |
|
13488 | }, {
|
13489 | key: "autoScrollRatio",
|
13490 | get: function get() {
|
13491 | return parseFloat(this.getAttribute('auto-scroll-ratio'));
|
13492 | },
|
13493 | set: function set(ratio) {
|
13494 | this.setAttribute('auto-scroll-ratio', ratio);
|
13495 | }
|
13496 | /**
|
13497 | * @property disabled
|
13498 | * @type {Boolean}
|
13499 | * @description
|
13500 | * [en]Whether the carousel is disabled or not.[/en]
|
13501 | * [ja]無効化されている場合に`true`。[/ja]
|
13502 | */
|
13503 |
|
13504 | /**
|
13505 | * @property overscrollable
|
13506 | * @type {Boolean}
|
13507 | * @description
|
13508 | * [en]Whether the carousel is overscrollable or not.[/en]
|
13509 | * [ja]overscrollできればtrueを返します。[/ja]
|
13510 | */
|
13511 |
|
13512 | /**
|
13513 | * @property centered
|
13514 | * @type {Boolean}
|
13515 | * @description
|
13516 | * [en]Whether the carousel is centered or not.[/en]
|
13517 | * [ja]centered状態になっていればtrueを返します。[/ja]
|
13518 | */
|
13519 |
|
13520 | }, {
|
13521 | key: "animationOptions",
|
13522 | get:
|
13523 | /**
|
13524 | * @property animationOptions
|
13525 | * @type {Object}
|
13526 | * @description
|
13527 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
13528 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
|
13529 | */
|
13530 | function get() {
|
13531 | var attr = this.getAttribute('animation-options');
|
13532 |
|
13533 | if (attr) {
|
13534 | return util$4.animationOptionsParse(attr);
|
13535 | } else {
|
13536 | return attr;
|
13537 | }
|
13538 | },
|
13539 | set: function set(value) {
|
13540 | if (value === undefined || value === null) {
|
13541 | this.removeAttribute('animation-options');
|
13542 | } else {
|
13543 | this.setAttribute('animation-options', JSON.stringify(value));
|
13544 | }
|
13545 | }
|
13546 | /**
|
13547 | * @attribute active-index
|
13548 | * @type {Number}
|
13549 | * @description
|
13550 | * [en]Specify the index of the carousel item that should be shown.[/en]
|
13551 | * [ja][/ja]
|
13552 | */
|
13553 |
|
13554 | /**
|
13555 | * @property activeIndex
|
13556 | * @type {Number}
|
13557 | * @description
|
13558 | * [en]Specify the index of the carousel item that should be shown.[/en]
|
13559 | * [ja][/ja]
|
13560 | */
|
13561 |
|
13562 | }, {
|
13563 | key: "activeIndex",
|
13564 | get: function get() {
|
13565 | return parseInt(this.getAttribute('active-index'));
|
13566 | },
|
13567 | set: function set(value) {
|
13568 | if (value !== undefined && value !== null) {
|
13569 | this.setAttribute('active-index', value);
|
13570 | }
|
13571 | }
|
13572 | }], [{
|
13573 | key: "observedAttributes",
|
13574 | get: function get() {
|
13575 | return ['swipeable', 'auto-refresh', 'direction', 'item-height', 'item-width', 'active-index'];
|
13576 | }
|
13577 | }, {
|
13578 | key: "events",
|
13579 | get: function get() {
|
13580 | return ['postchange', 'refresh', 'overscroll', 'prechange', 'swipe'];
|
13581 | }
|
13582 | }]);
|
13583 |
|
13584 | return CarouselElement;
|
13585 | }(BaseElement);
|
13586 | util$4.defineBooleanProperties(CarouselElement, ['swipeable', 'disabled', 'overscrollable', 'auto-scroll', 'centered', 'fullscreen', 'auto-refresh']);
|
13587 | onsElements.Carousel = CarouselElement;
|
13588 | customElements.define('ons-carousel', CarouselElement);
|
13589 |
|
13590 | /**
|
13591 | * @element ons-col
|
13592 | * @category grid
|
13593 | * @description
|
13594 | * [en]Represents a column in the grid system. Use with `<ons-row>` to layout components.[/en]
|
13595 | * [ja]グリッドシステムにて列を定義します。ons-rowとともに使用し、コンポーネントのレイアウトに利用します。[/ja]
|
13596 | * @note
|
13597 | * [en]For Android 4.3 and earlier, and iOS6 and earlier, when using mixed alignment with ons-row and ons-column, they may not be displayed correctly. You can use only one alignment.[/en]
|
13598 | * [ja]Android 4.3以前、もしくはiOS 6以前のOSの場合、ons-rowとons-columnを組み合わせた場合に描画が崩れる場合があります。[/ja]
|
13599 | * @codepen GgujC {wide}
|
13600 | * @guide theming.html [en]Layouting guide[/en][ja]レイアウト機能[/ja]
|
13601 | * @seealso ons-row
|
13602 | * [en]The `<ons-row>` component is the parent of `<ons-col>`.[/en]
|
13603 | * [ja]ons-rowコンポーネント[/ja]
|
13604 | * @example
|
13605 | * <ons-row>
|
13606 | * <ons-col width="50px"><ons-icon icon="fa-twitter"></ons-icon></ons-col>
|
13607 | * <ons-col>Text</ons-col>
|
13608 | * </ons-row>
|
13609 | */
|
13610 |
|
13611 | /**
|
13612 | * @attribute vertical-align
|
13613 | * @type {String}
|
13614 | * @description
|
13615 | * [en]Vertical alignment of the column. Valid values are "top", "center", and "bottom".[/en]
|
13616 | * [ja]縦の配置を指定する。"top", "center", "bottom"のいずれかを指定します。[/ja]
|
13617 | */
|
13618 |
|
13619 | /**
|
13620 | * @attribute width
|
13621 | * @type {String}
|
13622 | * @description
|
13623 | * [en]The width of the column. Valid values are css width values ("10%", "50px").[/en]
|
13624 | * [ja]カラムの横幅を指定する。パーセントもしくはピクセルで指定します(10%や50px)。[/ja]
|
13625 | */
|
13626 |
|
13627 | var ColElement = /*#__PURE__*/function (_BaseElement) {
|
13628 | _inherits(ColElement, _BaseElement);
|
13629 |
|
13630 | var _super = _createSuper(ColElement);
|
13631 |
|
13632 | function ColElement() {
|
13633 | var _this;
|
13634 |
|
13635 | _classCallCheck(this, ColElement);
|
13636 |
|
13637 | _this = _super.call(this);
|
13638 |
|
13639 | if (_this.getAttribute('width')) {
|
13640 | _this._updateWidth();
|
13641 | }
|
13642 |
|
13643 | return _this;
|
13644 | }
|
13645 |
|
13646 | _createClass(ColElement, [{
|
13647 | key: "attributeChangedCallback",
|
13648 | value: function attributeChangedCallback(name, last, current) {
|
13649 | if (name === 'width') {
|
13650 | this._updateWidth();
|
13651 | }
|
13652 | }
|
13653 | }, {
|
13654 | key: "_updateWidth",
|
13655 | value: function _updateWidth() {
|
13656 | var width = this.getAttribute('width');
|
13657 |
|
13658 | if (!width) {
|
13659 | styler.clear(this, 'flex maxWidth');
|
13660 | } else {
|
13661 | width = width.trim().match(/^\d+$/) ? width + '%' : width;
|
13662 | styler(this, {
|
13663 | flex: '0 0 ' + width,
|
13664 | maxWidth: width
|
13665 | });
|
13666 | }
|
13667 | }
|
13668 | }], [{
|
13669 | key: "observedAttributes",
|
13670 | get: function get() {
|
13671 | return ['width'];
|
13672 | }
|
13673 | }]);
|
13674 |
|
13675 | return ColElement;
|
13676 | }(BaseElement);
|
13677 | onsElements.Col = ColElement;
|
13678 | customElements.define('ons-col', ColElement);
|
13679 |
|
13680 | var DialogAnimator = /*#__PURE__*/function (_BaseAnimator) {
|
13681 | _inherits(DialogAnimator, _BaseAnimator);
|
13682 |
|
13683 | var _super = _createSuper(DialogAnimator);
|
13684 |
|
13685 | function DialogAnimator() {
|
13686 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
13687 | _ref$timing = _ref.timing,
|
13688 | timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
|
13689 | _ref$delay = _ref.delay,
|
13690 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
13691 | _ref$duration = _ref.duration,
|
13692 | duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
|
13693 |
|
13694 | _classCallCheck(this, DialogAnimator);
|
13695 |
|
13696 | return _super.call(this, {
|
13697 | timing: timing,
|
13698 | delay: delay,
|
13699 | duration: duration
|
13700 | });
|
13701 | }
|
13702 | /**
|
13703 | * @param {HTMLElement} dialog
|
13704 | * @param {Function} done
|
13705 | */
|
13706 |
|
13707 |
|
13708 | _createClass(DialogAnimator, [{
|
13709 | key: "show",
|
13710 | value: function show(dialog, done) {
|
13711 | done();
|
13712 | }
|
13713 | /**
|
13714 | * @param {HTMLElement} dialog
|
13715 | * @param {Function} done
|
13716 | */
|
13717 |
|
13718 | }, {
|
13719 | key: "hide",
|
13720 | value: function hide(dialog, done) {
|
13721 | done();
|
13722 | }
|
13723 | }]);
|
13724 |
|
13725 | return DialogAnimator;
|
13726 | }(BaseAnimator);
|
13727 | /**
|
13728 | * Android style animator for dialog.
|
13729 | */
|
13730 |
|
13731 | var AndroidDialogAnimator = /*#__PURE__*/function (_DialogAnimator) {
|
13732 | _inherits(AndroidDialogAnimator, _DialogAnimator);
|
13733 |
|
13734 | var _super2 = _createSuper(AndroidDialogAnimator);
|
13735 |
|
13736 | function AndroidDialogAnimator() {
|
13737 | var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
13738 | _ref2$timing = _ref2.timing,
|
13739 | timing = _ref2$timing === void 0 ? 'ease-in-out' : _ref2$timing,
|
13740 | _ref2$delay = _ref2.delay,
|
13741 | delay = _ref2$delay === void 0 ? 0 : _ref2$delay,
|
13742 | _ref2$duration = _ref2.duration,
|
13743 | duration = _ref2$duration === void 0 ? 0.3 : _ref2$duration;
|
13744 |
|
13745 | _classCallCheck(this, AndroidDialogAnimator);
|
13746 |
|
13747 | return _super2.call(this, {
|
13748 | timing: timing,
|
13749 | delay: delay,
|
13750 | duration: duration
|
13751 | });
|
13752 | }
|
13753 | /**
|
13754 | * @param {Object} dialog
|
13755 | * @param {Function} callback
|
13756 | */
|
13757 |
|
13758 |
|
13759 | _createClass(AndroidDialogAnimator, [{
|
13760 | key: "show",
|
13761 | value: function show(dialog, callback) {
|
13762 | callback = callback ? callback : function () {};
|
13763 | Animit.runAll(Animit(dialog._mask, this.def).default({
|
13764 | opacity: 0
|
13765 | }, {
|
13766 | opacity: 1
|
13767 | }), Animit(dialog._dialog, this.def).default({
|
13768 | transform: 'translate3d(-50%, -60%, 0)',
|
13769 | opacity: 0
|
13770 | }, {
|
13771 | transform: 'translate3d(-50%, -50%, 0)',
|
13772 | opacity: 1
|
13773 | }).queue(function (done) {
|
13774 | callback();
|
13775 | done();
|
13776 | }));
|
13777 | }
|
13778 | /**
|
13779 | * @param {Object} dialog
|
13780 | * @param {Function} callback
|
13781 | */
|
13782 |
|
13783 | }, {
|
13784 | key: "hide",
|
13785 | value: function hide(dialog, callback) {
|
13786 | callback = callback ? callback : function () {};
|
13787 | Animit.runAll(Animit(dialog._mask, this.def).default({
|
13788 | opacity: 1
|
13789 | }, {
|
13790 | opacity: 0
|
13791 | }), Animit(dialog._dialog, this.def).default({
|
13792 | transform: 'translate3d(-50%, -50%, 0)',
|
13793 | opacity: 1
|
13794 | }, {
|
13795 | transform: 'translate3d(-50%, -60%, 0)',
|
13796 | opacity: 0
|
13797 | }).queue(function (done) {
|
13798 | callback();
|
13799 | done();
|
13800 | }));
|
13801 | }
|
13802 | }]);
|
13803 |
|
13804 | return AndroidDialogAnimator;
|
13805 | }(DialogAnimator);
|
13806 | /**
|
13807 | * iOS style animator for dialog.
|
13808 | */
|
13809 |
|
13810 | var IOSDialogAnimator = /*#__PURE__*/function (_DialogAnimator2) {
|
13811 | _inherits(IOSDialogAnimator, _DialogAnimator2);
|
13812 |
|
13813 | var _super3 = _createSuper(IOSDialogAnimator);
|
13814 |
|
13815 | function IOSDialogAnimator() {
|
13816 | var _this;
|
13817 |
|
13818 | var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
13819 | _ref3$timing = _ref3.timing,
|
13820 | timing = _ref3$timing === void 0 ? 'ease-in-out' : _ref3$timing,
|
13821 | _ref3$delay = _ref3.delay,
|
13822 | delay = _ref3$delay === void 0 ? 0 : _ref3$delay,
|
13823 | _ref3$duration = _ref3.duration,
|
13824 | duration = _ref3$duration === void 0 ? 0.2 : _ref3$duration;
|
13825 |
|
13826 | _classCallCheck(this, IOSDialogAnimator);
|
13827 |
|
13828 | _this = _super3.call(this, {
|
13829 | timing: timing,
|
13830 | delay: delay,
|
13831 | duration: duration
|
13832 | });
|
13833 | _this.bodyHeight = document.body.clientHeight; // avoid Forced Synchronous Layout
|
13834 |
|
13835 | return _this;
|
13836 | }
|
13837 | /**
|
13838 | * @param {Object} dialog
|
13839 | * @param {Function} callback
|
13840 | */
|
13841 |
|
13842 |
|
13843 | _createClass(IOSDialogAnimator, [{
|
13844 | key: "show",
|
13845 | value: function show(dialog, callback) {
|
13846 | callback = callback ? callback : function () {};
|
13847 | Animit.runAll(Animit(dialog._mask, this.def).default({
|
13848 | opacity: 0
|
13849 | }, {
|
13850 | opacity: 1
|
13851 | }), Animit(dialog._dialog, this.def).default({
|
13852 | transform: "translate3d(-50%, ".concat(this.bodyHeight / 2.0 - 1, "px, 0)")
|
13853 | }, {
|
13854 | transform: 'translate3d(-50%, -50%, 0)'
|
13855 | }).queue(function (done) {
|
13856 | callback();
|
13857 | done();
|
13858 | }));
|
13859 | }
|
13860 | /**
|
13861 | * @param {Object} dialog
|
13862 | * @param {Function} callback
|
13863 | */
|
13864 |
|
13865 | }, {
|
13866 | key: "hide",
|
13867 | value: function hide(dialog, callback) {
|
13868 | callback = callback ? callback : function () {};
|
13869 | Animit.runAll(Animit(dialog._mask, this.def).default({
|
13870 | opacity: 1
|
13871 | }, {
|
13872 | opacity: 0
|
13873 | }), Animit(dialog._dialog, this.def).default({
|
13874 | transform: 'translate3d(-50%, -50%, 0)'
|
13875 | }, {
|
13876 | transform: "translate3d(-50%, ".concat(this.bodyHeight / 2.0 - 1, "px, 0)")
|
13877 | }).queue(function (done) {
|
13878 | callback();
|
13879 | done();
|
13880 | }));
|
13881 | }
|
13882 | }]);
|
13883 |
|
13884 | return IOSDialogAnimator;
|
13885 | }(DialogAnimator);
|
13886 | /**
|
13887 | * Slide animator for dialog.
|
13888 | */
|
13889 |
|
13890 | var SlideDialogAnimator = /*#__PURE__*/function (_DialogAnimator3) {
|
13891 | _inherits(SlideDialogAnimator, _DialogAnimator3);
|
13892 |
|
13893 | var _super4 = _createSuper(SlideDialogAnimator);
|
13894 |
|
13895 | function SlideDialogAnimator() {
|
13896 | var _this2;
|
13897 |
|
13898 | var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
13899 | _ref4$timing = _ref4.timing,
|
13900 | timing = _ref4$timing === void 0 ? 'cubic-bezier(.1, .7, .4, 1)' : _ref4$timing,
|
13901 | _ref4$delay = _ref4.delay,
|
13902 | delay = _ref4$delay === void 0 ? 0 : _ref4$delay,
|
13903 | _ref4$duration = _ref4.duration,
|
13904 | duration = _ref4$duration === void 0 ? 0.2 : _ref4$duration;
|
13905 |
|
13906 | _classCallCheck(this, SlideDialogAnimator);
|
13907 |
|
13908 | _this2 = _super4.call(this, {
|
13909 | timing: timing,
|
13910 | delay: delay,
|
13911 | duration: duration
|
13912 | });
|
13913 | _this2.bodyHeight = document.body.clientHeight; // avoid Forced Synchronous Layout
|
13914 |
|
13915 | return _this2;
|
13916 | }
|
13917 | /**
|
13918 | * @param {Object} dialog
|
13919 | * @param {Function} callback
|
13920 | */
|
13921 |
|
13922 |
|
13923 | _createClass(SlideDialogAnimator, [{
|
13924 | key: "show",
|
13925 | value: function show(dialog, callback) {
|
13926 | callback = callback ? callback : function () {};
|
13927 | Animit.runAll(Animit(dialog._mask, this.def).default({
|
13928 | opacity: 0
|
13929 | }, {
|
13930 | opacity: 1
|
13931 | }), Animit(dialog._dialog, this.def).default( // FIXME: This should avoid Forced Synchronous Layout. Otherwise, fade animation of mask will be broken.
|
13932 | {
|
13933 | transform: "translate3d(-50%, ".concat(-(this.bodyHeight / 2.0) + 1 - dialog._dialog.clientHeight, "px, 0)")
|
13934 | }, {
|
13935 | transform: 'translate3d(-50%, -50%, 0)'
|
13936 | }).queue(function (done) {
|
13937 | callback();
|
13938 | done();
|
13939 | }));
|
13940 | }
|
13941 | /**
|
13942 | * @param {Object} dialog
|
13943 | * @param {Function} callback
|
13944 | */
|
13945 |
|
13946 | }, {
|
13947 | key: "hide",
|
13948 | value: function hide(dialog, callback) {
|
13949 | callback = callback ? callback : function () {};
|
13950 | Animit.runAll(Animit(dialog._mask, this.def).default({
|
13951 | opacity: 1
|
13952 | }, {
|
13953 | opacity: 0
|
13954 | }), Animit(dialog._dialog, this.def).default({
|
13955 | transform: 'translate3d(-50%, -50%, 0)'
|
13956 | }, // FIXME: This should avoid Forced Synchronous Layout. Otherwise, fade animation of mask will be broken.
|
13957 | {
|
13958 | transform: "translate3d(-50%, ".concat(-(this.bodyHeight / 2.0) + 1 - dialog._dialog.clientHeight, "px, 0)")
|
13959 | }).queue(function (done) {
|
13960 | callback();
|
13961 | done();
|
13962 | }));
|
13963 | }
|
13964 | }]);
|
13965 |
|
13966 | return SlideDialogAnimator;
|
13967 | }(DialogAnimator);
|
13968 |
|
13969 | var scheme$o = {
|
13970 | '.dialog': 'dialog--*',
|
13971 | '.dialog-container': 'dialog-container--*',
|
13972 | '.dialog-mask': 'dialog-mask--*'
|
13973 | };
|
13974 | var _animatorDict$6 = {
|
13975 | 'default': function _default() {
|
13976 | return platform.isAndroid() ? AndroidDialogAnimator : IOSDialogAnimator;
|
13977 | },
|
13978 | 'slide': SlideDialogAnimator,
|
13979 | 'none': DialogAnimator
|
13980 | };
|
13981 | /**
|
13982 | * @element ons-dialog
|
13983 | * @category dialog
|
13984 | * @description
|
13985 | * [en]
|
13986 | * Dialog that is displayed on top of current screen. As opposed to the `<ons-alert-dialog>` element, this component can contain any kind of content.
|
13987 | *
|
13988 | * To use the element it can either be attached directly to the `<body>` element or dynamically created from a template using the `ons.createDialog(template)` utility function and the `<template>` tag.
|
13989 | *
|
13990 | * The dialog is useful for displaying menus, additional information or to ask the user to make a decision.
|
13991 | *
|
13992 | * It will automatically be displayed as Material Design when running on an Android device.
|
13993 | * [/en]
|
13994 | * [ja][/ja]
|
13995 | * @modifier material
|
13996 | * [en]Display a Material Design dialog.[/en]
|
13997 | * [ja]マテリアルデザインのダイアログを表示します。[/ja]
|
13998 | * @codepen zxxaGa
|
13999 | * @tutorial vanilla/Reference/dialog
|
14000 | * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
|
14001 | * @seealso ons-alert-dialog
|
14002 | * [en]`<ons-alert-dialog>` component[/en]
|
14003 | * [ja]ons-alert-dialogコンポーネント[/ja]
|
14004 | * @seealso ons-popover
|
14005 | * [en]`<ons-popover>` component[/en]
|
14006 | * [ja]ons-popoverコンポーネント[/ja]
|
14007 | * @seealso ons-modal
|
14008 | * [en]`<ons-modal>` component[/en]
|
14009 | * [ja]ons-modalコンポーネント[/ja]
|
14010 | * @example
|
14011 | * <ons-dialog id="dialog">
|
14012 | * <p>This is a dialog!</p>
|
14013 | * </ons-dialog>
|
14014 | *
|
14015 | * <script>
|
14016 | * document.getElementById('dialog').show();
|
14017 | * </script>
|
14018 | */
|
14019 |
|
14020 | var DialogElement = /*#__PURE__*/function (_BaseDialogElement) {
|
14021 | _inherits(DialogElement, _BaseDialogElement);
|
14022 |
|
14023 | var _super = _createSuper(DialogElement);
|
14024 |
|
14025 | /**
|
14026 | * @event preshow
|
14027 | * @description
|
14028 | * [en]Fired just before the dialog is displayed.[/en]
|
14029 | * [ja]ダイアログが表示される直前に発火します。[/ja]
|
14030 | * @param {Object} event [en]Event object.[/en]
|
14031 | * @param {Object} event.dialog
|
14032 | * [en]Component object.[/en]
|
14033 | * [ja]コンポーネントのオブジェクト。[/ja]
|
14034 | * @param {Function} event.cancel
|
14035 | * [en]Execute this function to stop the dialog from being shown.[/en]
|
14036 | * [ja]この関数を実行すると、ダイアログの表示がキャンセルされます。[/ja]
|
14037 | */
|
14038 |
|
14039 | /**
|
14040 | * @event postshow
|
14041 | * @description
|
14042 | * [en]Fired just after the dialog is displayed.[/en]
|
14043 | * [ja]ダイアログが表示された直後に発火します。[/ja]
|
14044 | * @param {Object} event [en]Event object.[/en]
|
14045 | * @param {Object} event.dialog
|
14046 | * [en]Component object.[/en]
|
14047 | * [ja]コンポーネントのオブジェクト。[/ja]
|
14048 | */
|
14049 |
|
14050 | /**
|
14051 | * @event prehide
|
14052 | * @description
|
14053 | * [en]Fired just before the dialog is hidden.[/en]
|
14054 | * [ja]ダイアログが隠れる直前に発火します。[/ja]
|
14055 | * @param {Object} event [en]Event object.[/en]
|
14056 | * @param {Object} event.dialog
|
14057 | * [en]Component object.[/en]
|
14058 | * [ja]コンポーネントのオブジェクト。[/ja]
|
14059 | * @param {Function} event.cancel
|
14060 | * [en]Execute this function to stop the dialog from being hidden.[/en]
|
14061 | * [ja]この関数を実行すると、ダイアログの非表示がキャンセルされます。[/ja]
|
14062 | */
|
14063 |
|
14064 | /**
|
14065 | * @event posthide
|
14066 | * @description
|
14067 | * [en]Fired just after the dialog is hidden.[/en]
|
14068 | * [ja]ダイアログが隠れた後に発火します。[/ja]
|
14069 | * @param {Object} event [en]Event object.[/en]
|
14070 | * @param {Object} event.dialog
|
14071 | * [en]Component object.[/en]
|
14072 | * [ja]コンポーネントのオブジェクト。[/ja]
|
14073 | */
|
14074 |
|
14075 | /**
|
14076 | * @event dialogcancel
|
14077 | * @description
|
14078 | * [en]Fired when the dialog is canceled.[/en]
|
14079 | * [ja][/ja]
|
14080 | */
|
14081 |
|
14082 | /**
|
14083 | * @attribute modifier
|
14084 | * @type {String}
|
14085 | * @description
|
14086 | * [en]The appearance of the dialog.[/en]
|
14087 | * [ja]ダイアログの表現を指定します。[/ja]
|
14088 | */
|
14089 |
|
14090 | /**
|
14091 | * @attribute cancelable
|
14092 | * @description
|
14093 | * [en]If this attribute is set the dialog can be closed by tapping the background or by pressing the back button on Android devices.[/en]
|
14094 | * [ja][/ja]
|
14095 | */
|
14096 |
|
14097 | /**
|
14098 | * @attribute disabled
|
14099 | * @description
|
14100 | * [en]If this attribute is set the dialog is disabled.[/en]
|
14101 | * [ja]この属性がある時、ダイアログはdisabled状態になります。[/ja]
|
14102 | */
|
14103 |
|
14104 | /**
|
14105 | * @attribute animation
|
14106 | * @type {String}
|
14107 | * @default default
|
14108 | * @description
|
14109 | * [en]The animation used when showing and hiding the dialog. Can be either `"none"` or `"default"`.[/en]
|
14110 | * [ja]ダイアログを表示する際のアニメーション名を指定します。"none"もしくは"default"を指定できます。[/ja]
|
14111 | */
|
14112 |
|
14113 | /**
|
14114 | * @attribute animation-options
|
14115 | * @type {Expression}
|
14116 | * @description
|
14117 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
14118 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/ja]
|
14119 | */
|
14120 |
|
14121 | /**
|
14122 | * @property animationOptions
|
14123 | * @type {Object}
|
14124 | * @description
|
14125 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
14126 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
|
14127 | */
|
14128 |
|
14129 | /**
|
14130 | * @attribute mask-color
|
14131 | * @type {String}
|
14132 | * @default rgba(0, 0, 0, 0.2)
|
14133 | * @description
|
14134 | * [en]Color of the background mask. Default is `"rgba(0, 0, 0, 0.2)"`.[/en]
|
14135 | * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
|
14136 | */
|
14137 |
|
14138 | /**
|
14139 | * @attribute visible
|
14140 | * @type {Boolean}
|
14141 | * @description
|
14142 | * [en]Whether the dialog is visible or not.[/en]
|
14143 | * [ja]要素が見える場合に`true`。[/ja]
|
14144 | */
|
14145 | function DialogElement() {
|
14146 | var _this;
|
14147 |
|
14148 | _classCallCheck(this, DialogElement);
|
14149 |
|
14150 | _this = _super.call(this);
|
14151 | contentReady(_assertThisInitialized(_this), function () {
|
14152 | return _this._compile();
|
14153 | });
|
14154 | return _this;
|
14155 | }
|
14156 |
|
14157 | _createClass(DialogElement, [{
|
14158 | key: "_scheme",
|
14159 | get: function get() {
|
14160 | return scheme$o;
|
14161 | }
|
14162 | }, {
|
14163 | key: "_mask",
|
14164 | get: function get() {
|
14165 | return util$4.findChild(this, '.dialog-mask');
|
14166 | }
|
14167 | }, {
|
14168 | key: "_dialog",
|
14169 | get: function get() {
|
14170 | return util$4.findChild(this, '.dialog');
|
14171 | }
|
14172 | }, {
|
14173 | key: "_updateAnimatorFactory",
|
14174 | value: function _updateAnimatorFactory() {
|
14175 | return new AnimatorFactory({
|
14176 | animators: _animatorDict$6,
|
14177 | baseClass: DialogAnimator,
|
14178 | baseClassName: 'DialogAnimator',
|
14179 | defaultAnimation: this.getAttribute('animation')
|
14180 | });
|
14181 | }
|
14182 | }, {
|
14183 | key: "_compile",
|
14184 | value: function _compile() {
|
14185 | autoStyle.prepare(this);
|
14186 | this.style.display = 'none';
|
14187 | this.style.zIndex = 10001;
|
14188 | /* Expected result:
|
14189 | * <ons-dialog>
|
14190 | * <div class="dialog-mask"></div>
|
14191 | * <div class="dialog">
|
14192 | * <div class="dialog-container">...</div>
|
14193 | * </div>
|
14194 | * </ons-dialog>
|
14195 | */
|
14196 |
|
14197 | if (!this._dialog) {
|
14198 | var dialog = document.createElement('div');
|
14199 | dialog.classList.add('dialog');
|
14200 | var container = document.createElement('div');
|
14201 | container.classList.add('dialog-container');
|
14202 |
|
14203 | while (this.firstChild) {
|
14204 | container.appendChild(this.firstChild);
|
14205 | }
|
14206 |
|
14207 | dialog.appendChild(container);
|
14208 | this.appendChild(dialog);
|
14209 | }
|
14210 |
|
14211 | if (!this._mask) {
|
14212 | var mask = document.createElement('div');
|
14213 | mask.classList.add('dialog-mask');
|
14214 | this.insertBefore(mask, this.firstChild);
|
14215 | }
|
14216 |
|
14217 | this._dialog.style.zIndex = 20001;
|
14218 | this._mask.style.zIndex = 20000;
|
14219 | this.setAttribute('status-bar-fill', '');
|
14220 | ModifierUtil.initModifier(this, this._scheme);
|
14221 | }
|
14222 | /**
|
14223 | * @property onDeviceBackButton
|
14224 | * @type {Object}
|
14225 | * @description
|
14226 | * [en]Back-button handler.[/en]
|
14227 | * [ja]バックボタンハンドラ。[/ja]
|
14228 | */
|
14229 |
|
14230 | /**
|
14231 | * @method show
|
14232 | * @signature show([options])
|
14233 | * @param {Object} [options]
|
14234 | * [en]Parameter object.[/en]
|
14235 | * [ja]オプションを指定するオブジェクト。[/ja]
|
14236 | * @param {String} [options.animation]
|
14237 | * [en]Animation name. Available animations are `"none"` and `"slide"`.[/en]
|
14238 | * [ja]アニメーション名を指定します。"none", "slide"のいずれかを指定します。[/ja]
|
14239 | * @param {String} [options.animationOptions]
|
14240 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
|
14241 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}` [/ja]
|
14242 | * @param {Function} [options.callback]
|
14243 | * [en]This function is called after the dialog has been revealed.[/en]
|
14244 | * [ja]ダイアログが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
|
14245 | * @description
|
14246 | * [en]Show the dialog.[/en]
|
14247 | * [ja]ダイアログを開きます。[/ja]
|
14248 | * @return {Promise} Resolves to the displayed element.
|
14249 | */
|
14250 |
|
14251 | /**
|
14252 | * @method hide
|
14253 | * @signature hide([options])
|
14254 | * @param {Object} [options]
|
14255 | * [en]Parameter object.[/en]
|
14256 | * [ja]オプションを指定するオブジェクト。[/ja]
|
14257 | * @param {String} [options.animation]
|
14258 | * [en]Animation name. Available animations are `"none"` and `"slide"`.[/en]
|
14259 | * [ja]アニメーション名を指定します。"none", "slide"のいずれかを指定できます。[/ja]
|
14260 | * @param {String} [options.animationOptions]
|
14261 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
|
14262 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`[/ja]
|
14263 | * @param {Function} [options.callback]
|
14264 | * [en]This functions is called after the dialog has been hidden.[/en]
|
14265 | * [ja]ダイアログが隠れた後に呼び出される関数オブジェクトを指定します。[/ja]
|
14266 | * @description
|
14267 | * [en]Hide the dialog.[/en]
|
14268 | * [ja]ダイアログを閉じます。[/ja]
|
14269 | * @return {Promise}
|
14270 | * [en]Resolves to the hidden element[/en]
|
14271 | * [ja][/ja]
|
14272 | */
|
14273 |
|
14274 | /**
|
14275 | * @property visible
|
14276 | * @type {Boolean}
|
14277 | * @description
|
14278 | * [en]Whether the dialog is visible or not.[/en]
|
14279 | * [ja]要素が見える場合に`true`。[/ja]
|
14280 | */
|
14281 |
|
14282 | /**
|
14283 | * @property disabled
|
14284 | * @type {Boolean}
|
14285 | * @description
|
14286 | * [en]Whether the dialog is disabled or not.[/en]
|
14287 | * [ja]無効化されている場合に`true`。[/ja]
|
14288 | */
|
14289 |
|
14290 | /**
|
14291 | * @property cancelable
|
14292 | * @type {Boolean}
|
14293 | * @description
|
14294 | * [en]Whether the dialog is cancelable or not. A cancelable dialog can be closed by tapping the background or by pressing the back button on Android devices.[/en]
|
14295 | * [ja][/ja]
|
14296 | */
|
14297 |
|
14298 | /**
|
14299 | * @property maskColor
|
14300 | * @type {String}
|
14301 | * @default rgba(0, 0, 0, 0.2)
|
14302 | * @description
|
14303 | * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)".[/en]
|
14304 | * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
|
14305 | */
|
14306 |
|
14307 | /**
|
14308 | * @param {String} name
|
14309 | * @param {DialogAnimator} Animator
|
14310 | */
|
14311 |
|
14312 | }], [{
|
14313 | key: "registerAnimator",
|
14314 | value: function registerAnimator(name, Animator) {
|
14315 | if (!(Animator.prototype instanceof DialogAnimator)) {
|
14316 | util$4.throwAnimator('Dialog');
|
14317 | }
|
14318 |
|
14319 | _animatorDict$6[name] = Animator;
|
14320 | }
|
14321 | }, {
|
14322 | key: "animators",
|
14323 | get: function get() {
|
14324 | return _animatorDict$6;
|
14325 | }
|
14326 | }, {
|
14327 | key: "DialogAnimator",
|
14328 | get: function get() {
|
14329 | return DialogAnimator;
|
14330 | }
|
14331 | }]);
|
14332 |
|
14333 | return DialogElement;
|
14334 | }(BaseDialogElement);
|
14335 | onsElements.Dialog = DialogElement;
|
14336 | customElements.define('ons-dialog', DialogElement);
|
14337 |
|
14338 | var defaultClassName$d = 'fab';
|
14339 | var scheme$n = {
|
14340 | '': 'fab--*',
|
14341 | '.fab__icon': 'fab--*__icon'
|
14342 | };
|
14343 | /**
|
14344 | * @element ons-fab
|
14345 | * @category form
|
14346 | * @description
|
14347 | * [en]
|
14348 | * The Floating action button is a circular button defined in the [Material Design specification](https://www.google.com/design/spec/components/buttons-floating-action-button.html). They are often used to promote the primary action of the app.
|
14349 | *
|
14350 | * It can be displayed either as an inline element or in one of the corners. Normally it will be positioned in the lower right corner of the screen.
|
14351 | * [/en]
|
14352 | * [ja][/ja]
|
14353 | * @tutorial vanilla/Reference/fab
|
14354 | * @modifier mini
|
14355 | * [en]Makes the `ons-fab` smaller.[/en]
|
14356 | * [ja][/ja]
|
14357 | * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja]Information about cross platform styling[/ja]
|
14358 | * @seealso ons-speed-dial
|
14359 | * [en]The `<ons-speed-dial>` component is a Floating action button that displays a menu when tapped.[/en]
|
14360 | * [ja][/ja]
|
14361 | */
|
14362 |
|
14363 | var FabElement = /*#__PURE__*/function (_BaseElement) {
|
14364 | _inherits(FabElement, _BaseElement);
|
14365 |
|
14366 | var _super = _createSuper(FabElement);
|
14367 |
|
14368 | /**
|
14369 | * @attribute modifier
|
14370 | * @type {String}
|
14371 | * @description
|
14372 | * [en]The appearance of the button.[/en]
|
14373 | * [ja]ボタンの表現を指定します。[/ja]
|
14374 | */
|
14375 |
|
14376 | /**
|
14377 | * @attribute ripple
|
14378 | * @description
|
14379 | * [en]If this attribute is defined, the button will have a ripple effect when tapped.[/en]
|
14380 | * [ja][/ja]
|
14381 | */
|
14382 |
|
14383 | /**
|
14384 | * @property ripple
|
14385 | * @type {Boolean}
|
14386 | * @description
|
14387 | * [en]If this property is defined, the button will have a ripple effect when tapped.[/en]
|
14388 | * [ja][/ja]
|
14389 | */
|
14390 |
|
14391 | /**
|
14392 | * @attribute position
|
14393 | * @type {String}
|
14394 | * @description
|
14395 | * [en]The position of the button. Should be a string like `"bottom right"` or `"top left"`. If this attribute is not defined it will be displayed as an inline element.[/en]
|
14396 | * [ja][/ja]
|
14397 | */
|
14398 |
|
14399 | /**
|
14400 | * @attribute disabled
|
14401 | * @description
|
14402 | * [en]Specify if button should be disabled.[/en]
|
14403 | * [ja]ボタンを無効化する場合は指定します。[/ja]
|
14404 | */
|
14405 | function FabElement() {
|
14406 | var _this;
|
14407 |
|
14408 | _classCallCheck(this, FabElement);
|
14409 |
|
14410 | _this = _super.call(this); // The following statements can be executed before contentReady
|
14411 | // since these do not access the children
|
14412 |
|
14413 | _this._hide();
|
14414 |
|
14415 | _this.classList.add(defaultClassName$d);
|
14416 |
|
14417 | contentReady(_assertThisInitialized(_this), function () {
|
14418 | _this._compile();
|
14419 | });
|
14420 | return _this;
|
14421 | }
|
14422 |
|
14423 | _createClass(FabElement, [{
|
14424 | key: "_compile",
|
14425 | value: function _compile() {
|
14426 | autoStyle.prepare(this);
|
14427 |
|
14428 | if (!util$4.findChild(this, '.fab__icon')) {
|
14429 | var content = document.createElement('span');
|
14430 | content.classList.add('fab__icon');
|
14431 | util$4.arrayFrom(this.childNodes).forEach(function (element) {
|
14432 | if (!element.tagName || element.tagName.toLowerCase() !== 'ons-ripple') {
|
14433 | content.appendChild(element);
|
14434 | }
|
14435 | });
|
14436 | this.appendChild(content);
|
14437 | }
|
14438 |
|
14439 | this._updateRipple();
|
14440 |
|
14441 | ModifierUtil.initModifier(this, scheme$n);
|
14442 |
|
14443 | this._updatePosition();
|
14444 | }
|
14445 | }, {
|
14446 | key: "connectedCallback",
|
14447 | value: function connectedCallback() {
|
14448 | var _this2 = this;
|
14449 |
|
14450 | setImmediate(function () {
|
14451 | return _this2._show();
|
14452 | });
|
14453 | }
|
14454 | }, {
|
14455 | key: "attributeChangedCallback",
|
14456 | value: function attributeChangedCallback(name, last, current) {
|
14457 | switch (name) {
|
14458 | case 'class':
|
14459 | util$4.restoreClass(this, defaultClassName$d, scheme$n);
|
14460 | break;
|
14461 |
|
14462 | case 'modifier':
|
14463 | ModifierUtil.onModifierChanged(last, current, this, scheme$n);
|
14464 | break;
|
14465 |
|
14466 | case 'ripple':
|
14467 | this._updateRipple();
|
14468 |
|
14469 | break;
|
14470 |
|
14471 | case 'position':
|
14472 | this._updatePosition();
|
14473 |
|
14474 | break;
|
14475 | }
|
14476 | }
|
14477 | }, {
|
14478 | key: "_show",
|
14479 | value: function _show() {
|
14480 | if (!this._manuallyHidden) {
|
14481 | // if user has not called ons-fab.hide()
|
14482 | this._toggle(true);
|
14483 | }
|
14484 | }
|
14485 | }, {
|
14486 | key: "_hide",
|
14487 | value: function _hide() {
|
14488 | var _this3 = this;
|
14489 |
|
14490 | setImmediate(function () {
|
14491 | return _this3._toggle(false);
|
14492 | });
|
14493 | }
|
14494 | }, {
|
14495 | key: "_updateRipple",
|
14496 | value: function _updateRipple() {
|
14497 | util$4.updateRipple(this);
|
14498 | }
|
14499 | }, {
|
14500 | key: "_updatePosition",
|
14501 | value: function _updatePosition() {
|
14502 | var position = this.getAttribute('position');
|
14503 | this.classList.remove('fab--top__left', 'fab--bottom__right', 'fab--bottom__left', 'fab--top__right', 'fab--top__center', 'fab--bottom__center');
|
14504 |
|
14505 | switch (position) {
|
14506 | case 'top right':
|
14507 | case 'right top':
|
14508 | this.classList.add('fab--top__right');
|
14509 | break;
|
14510 |
|
14511 | case 'top left':
|
14512 | case 'left top':
|
14513 | this.classList.add('fab--top__left');
|
14514 | break;
|
14515 |
|
14516 | case 'bottom right':
|
14517 | case 'right bottom':
|
14518 | this.classList.add('fab--bottom__right');
|
14519 | break;
|
14520 |
|
14521 | case 'bottom left':
|
14522 | case 'left bottom':
|
14523 | this.classList.add('fab--bottom__left');
|
14524 | break;
|
14525 |
|
14526 | case 'center top':
|
14527 | case 'top center':
|
14528 | this.classList.add('fab--top__center');
|
14529 | break;
|
14530 |
|
14531 | case 'center bottom':
|
14532 | case 'bottom center':
|
14533 | this.classList.add('fab--bottom__center');
|
14534 | break;
|
14535 | }
|
14536 | }
|
14537 | /**
|
14538 | * @method show
|
14539 | * @signature show()
|
14540 | * @description
|
14541 | * [en]Show the floating action button.[/en]
|
14542 | * [ja][/ja]
|
14543 | */
|
14544 |
|
14545 | }, {
|
14546 | key: "show",
|
14547 | value: function show() {
|
14548 | this.toggle(true);
|
14549 | }
|
14550 | /**
|
14551 | * @method hide
|
14552 | * @signature hide()
|
14553 | * @description
|
14554 | * [en]Hide the floating action button.[/en]
|
14555 | * [ja][/ja]
|
14556 | */
|
14557 |
|
14558 | }, {
|
14559 | key: "hide",
|
14560 | value: function hide() {
|
14561 | this.toggle(false);
|
14562 | }
|
14563 | /**
|
14564 | * @method toggle
|
14565 | * @signature toggle()
|
14566 | * @description
|
14567 | * [en]Toggle the visibility of the button.[/en]
|
14568 | * [ja][/ja]
|
14569 | */
|
14570 |
|
14571 | }, {
|
14572 | key: "toggle",
|
14573 | value: function toggle() {
|
14574 | var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : !this.visible;
|
14575 | this._manuallyHidden = !action;
|
14576 |
|
14577 | this._toggle(action);
|
14578 | }
|
14579 | }, {
|
14580 | key: "_toggle",
|
14581 | value: function _toggle() {
|
14582 | var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : !this.visible;
|
14583 | var isBottom = (this.getAttribute('position') || '').indexOf('bottom') >= 0;
|
14584 | var translate = isBottom ? "translate3d(0px, -".concat(util$4.globals.fabOffset || 0, "px, 0px)") : '';
|
14585 | styler(this, {
|
14586 | transform: "".concat(translate, " scale(").concat(Number(action), ")")
|
14587 | });
|
14588 | }
|
14589 | /**
|
14590 | * @property disabled
|
14591 | * @type {Boolean}
|
14592 | * @description
|
14593 | * [en]Whether the element is disabled or not.[/en]
|
14594 | * [ja]無効化されている場合に`true`。[/ja]
|
14595 | */
|
14596 |
|
14597 | /**
|
14598 | * @property visible
|
14599 | * @readonly
|
14600 | * @type {Boolean}
|
14601 | * @description
|
14602 | * [en]Whether the element is visible or not.[/en]
|
14603 | * [ja]要素が見える場合に`true`。[/ja]
|
14604 | */
|
14605 |
|
14606 | }, {
|
14607 | key: "visible",
|
14608 | get: function get() {
|
14609 | return this.style.transform.indexOf('scale(0)') === -1 && this.style.display !== 'none';
|
14610 | }
|
14611 | }], [{
|
14612 | key: "observedAttributes",
|
14613 | get: function get() {
|
14614 | return ['modifier', 'ripple', 'position', 'class'];
|
14615 | }
|
14616 | }]);
|
14617 |
|
14618 | return FabElement;
|
14619 | }(BaseElement);
|
14620 | util$4.defineBooleanProperties(FabElement, ['disabled', 'ripple']);
|
14621 | onsElements.Fab = FabElement;
|
14622 | customElements.define('ons-fab', FabElement);
|
14623 |
|
14624 | /**
|
14625 | * @element ons-gesture-detector
|
14626 | * @category gesture
|
14627 | * @description
|
14628 | * [en]
|
14629 | * Component to detect finger gestures within the wrapped element. Following gestures are supported:
|
14630 | * - Drag gestures: `drag`, `dragleft`, `dragright`, `dragup`, `dragdown`
|
14631 | * - Hold gestures: `hold`, `release`
|
14632 | * - Swipe gestures: `swipe`, `swipeleft`, `swiperight`, `swipeup`, `swipedown`
|
14633 | * - Tap gestures: `tap`, `doubletap`
|
14634 | * - Pinch gestures: `pinch`, `pinchin`, `pinchout`
|
14635 | * - Other gestures: `touch`, `transform`, `rotate`
|
14636 | * [/en]
|
14637 | * [ja]要素内のジェスチャー操作を検知します。詳しくはガイドを参照してください。[/ja]
|
14638 | * @guide features.html#gesture-detection
|
14639 | * [en]Detecting finger gestures[/en]
|
14640 | * [ja]ジェスチャー操作の検知[/ja]
|
14641 | * @example
|
14642 | * <ons-gesture-detector>
|
14643 | * <div id="detect-area" style="width: 100px; height: 100px;">
|
14644 | * Swipe Here
|
14645 | * </div>
|
14646 | * </ons-gesture-detector>
|
14647 | *
|
14648 | * <script>
|
14649 | * document.addEventListener('swipeleft', function(event) {
|
14650 | * if (event.target.matches('#detect-area')) {
|
14651 | * console.log('Swipe left is detected.');
|
14652 | * }
|
14653 | * });
|
14654 | * </script>
|
14655 | */
|
14656 |
|
14657 | var GestureDetectorElement = /*#__PURE__*/function (_BaseElement) {
|
14658 | _inherits(GestureDetectorElement, _BaseElement);
|
14659 |
|
14660 | var _super = _createSuper(GestureDetectorElement);
|
14661 |
|
14662 | function GestureDetectorElement() {
|
14663 | var _this;
|
14664 |
|
14665 | _classCallCheck(this, GestureDetectorElement);
|
14666 |
|
14667 | _this = _super.call(this);
|
14668 | _this._gestureDetector = new GestureDetector(_assertThisInitialized(_this), {
|
14669 | passive: true
|
14670 | });
|
14671 | return _this;
|
14672 | }
|
14673 |
|
14674 | return _createClass(GestureDetectorElement);
|
14675 | }(BaseElement);
|
14676 | onsElements.GestureDetector = GestureDetectorElement;
|
14677 | customElements.define('ons-gesture-detector', GestureDetectorElement);
|
14678 |
|
14679 | var autoPrefix = 'fa'; // FIXME: To be removed in v3
|
14680 |
|
14681 | /**
|
14682 | * @element ons-icon
|
14683 | * @category visual
|
14684 | * @description
|
14685 | * [en]
|
14686 | * Displays an icon. The following icon suites are available:
|
14687 | *
|
14688 | * * [Font Awesome](https://fortawesome.github.io/Font-Awesome/)
|
14689 | * * [Ionicons](http://ionicons.com/)
|
14690 | * * [Material Design Iconic Font](http://zavoloklom.github.io/material-design-iconic-font/)
|
14691 | * [/en]
|
14692 | * [ja][/ja]
|
14693 | * @codepen xAhvg
|
14694 | * @tutorial vanilla/Reference/icon
|
14695 | * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja][/ja]
|
14696 | * @guide appsize.html#removing-icon-packs [en]Removing icon packs.[/en][ja][/ja]
|
14697 | * @guide faq.html#how-can-i-use-custom-icon-packs [en]Adding custom icon packs.[/en][ja][/ja]
|
14698 | * @example
|
14699 | * <ons-icon
|
14700 | * icon="md-car"
|
14701 | * size="20px"
|
14702 | * style="color: red">
|
14703 | * </ons-icon>
|
14704 | *
|
14705 | * <ons-button>
|
14706 | * <ons-icon icon="md-car"></ons-icon>
|
14707 | * Car
|
14708 | * </ons-button>
|
14709 | */
|
14710 |
|
14711 | var IconElement = /*#__PURE__*/function (_BaseElement) {
|
14712 | _inherits(IconElement, _BaseElement);
|
14713 |
|
14714 | var _super = _createSuper(IconElement);
|
14715 |
|
14716 | /**
|
14717 | * @attribute icon
|
14718 | * @type {String}
|
14719 | * @description
|
14720 | * [en]
|
14721 | * The icon name. `"md-"` prefix for Material Icons, `"fa-"` for Font Awesome and `"ion-"` prefix for Ionicons.
|
14722 | *
|
14723 | * See all available icons on the element description (at the top).
|
14724 | *
|
14725 | * Icons can also be styled based on modifier presence. Add comma-separated icons with `"modifierName:"` prefix.
|
14726 | *
|
14727 | * The code `<ons-icon icon="ion-edit, material:md-edit"></ons-icon>` will display `"md-edit"` for Material Design and `"ion-edit"` as the default icon.
|
14728 | *
|
14729 | * `fa-` prefix is added automatically if none is provided. Check [See also](#seealso) section for more information.
|
14730 | * [/en]
|
14731 | * [ja][/ja]
|
14732 | */
|
14733 |
|
14734 | /**
|
14735 | * @attribute size
|
14736 | * @type {String}
|
14737 | * @description
|
14738 | * [en]
|
14739 | * The sizes of the icon. Valid values are lg, 2x, 3x, 4x, 5x, or in the size in pixels.
|
14740 | * Icons can also be styled based on modifier presence. Add comma-separated icons with `"modifierName:"` prefix.
|
14741 | *
|
14742 | * The code:
|
14743 | *
|
14744 | * ```
|
14745 | * <ons-icon
|
14746 | * icon="ion-edit"
|
14747 | * size="32px, material:24px">
|
14748 | * </ons-icon>
|
14749 | * ```
|
14750 | *
|
14751 | * will render as a `24px` icon if the `"material"` modifier is present and `32px` otherwise.
|
14752 | * [/en]
|
14753 | * [ja][/ja]
|
14754 | */
|
14755 |
|
14756 | /**
|
14757 | * @attribute rotate
|
14758 | * @type {Number}
|
14759 | * @description
|
14760 | * [en]Number of degrees to rotate the icon. Valid values are 90, 180 and 270.[/en]
|
14761 | * [ja]アイコンを回転して表示します。90, 180, 270から指定できます。[/ja]
|
14762 | */
|
14763 |
|
14764 | /**
|
14765 | * @attribute fixed-width
|
14766 | * @type {Boolean}
|
14767 | * @default false
|
14768 | * @description
|
14769 | * [en]When used in a list, you want the icons to have the same width so that they align vertically by defining this attribute.[/en]
|
14770 | * [ja][/ja]
|
14771 | */
|
14772 |
|
14773 | /**
|
14774 | * @property fixedWidth
|
14775 | * @type {Boolean}
|
14776 | * @default false
|
14777 | * @description
|
14778 | * [en]When used in a list, you want the icons to have the same width so that they align vertically by defining this attribute.[/en]
|
14779 | * [ja][/ja]
|
14780 | */
|
14781 |
|
14782 | /**
|
14783 | * @attribute spin
|
14784 | * @description
|
14785 | * [en]Specify whether the icon should be spinning.[/en]
|
14786 | * [ja]アイコンを回転するかどうかを指定します。[/ja]
|
14787 | */
|
14788 |
|
14789 | /**
|
14790 | * @property spin
|
14791 | * @type {Boolean}
|
14792 | * @description
|
14793 | * [en]Specify whether the icon should be spinning.[/en]
|
14794 | * [ja]アイコンを回転するかどうかを指定します。[/ja]
|
14795 | */
|
14796 | function IconElement() {
|
14797 | var _this;
|
14798 |
|
14799 | _classCallCheck(this, IconElement);
|
14800 |
|
14801 | _this = _super.call(this);
|
14802 | contentReady(_assertThisInitialized(_this), function () {
|
14803 | _this._compile();
|
14804 | });
|
14805 | return _this;
|
14806 | }
|
14807 |
|
14808 | _createClass(IconElement, [{
|
14809 | key: "attributeChangedCallback",
|
14810 | value: function attributeChangedCallback(name, last, current) {
|
14811 | this._cleanClassAttribute(name === 'icon' ? last : this.getAttribute('icon'), name === 'modifier' ? last : undefined);
|
14812 |
|
14813 | this._update();
|
14814 | }
|
14815 | }, {
|
14816 | key: "_compile",
|
14817 | value: function _compile() {
|
14818 | autoStyle.prepare(this);
|
14819 |
|
14820 | this._update();
|
14821 | }
|
14822 | }, {
|
14823 | key: "_update",
|
14824 | value: function _update() {
|
14825 | var _this2 = this;
|
14826 |
|
14827 | var _this$_buildClassAndS = this._buildClassAndStyle(this._parseAttr('icon'), this._parseAttr('size')),
|
14828 | classList = _this$_buildClassAndS.classList,
|
14829 | style = _this$_buildClassAndS.style;
|
14830 |
|
14831 | util$4.extend(this.style, style);
|
14832 | classList.forEach(function (className) {
|
14833 | return _this2.classList.add(className);
|
14834 | });
|
14835 | }
|
14836 | }, {
|
14837 | key: "_parseAttr",
|
14838 | value: function _parseAttr(attrName) {
|
14839 | var modifier = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getAttribute('modifier') || '';
|
14840 | var attr = this.getAttribute(attrName) || attrName || '';
|
14841 | var parts = attr.split(/\s*,\s*/);
|
14842 | var def = parts[0];
|
14843 | var md = parts[1];
|
14844 | md = (md || '').split(/\s*:\s*/);
|
14845 | return (modifier && RegExp("(^|\\s+)".concat(md[0], "($|\\s+)"), 'i').test(modifier) ? md[1] : def) || '';
|
14846 | }
|
14847 | /**
|
14848 | * Remove unneeded class value.
|
14849 | */
|
14850 |
|
14851 | }, {
|
14852 | key: "_cleanClassAttribute",
|
14853 | value: function _cleanClassAttribute(lastIcon, lastModifier) {
|
14854 | var _this3 = this;
|
14855 |
|
14856 | var _this$_prefixIcon = this._prefixIcon(this._parseAttr(lastIcon, lastModifier)),
|
14857 | className = _this$_prefixIcon.className,
|
14858 | prefix = _this$_prefixIcon.prefix;
|
14859 |
|
14860 | var customPrefixRE = className !== prefix ? "|".concat(prefix, "$|").concat(prefix, "-") : "|".concat(className, "$") || '';
|
14861 | var re = new RegExp("^(fa$|fa-|ion-|zmdi$|zmdi-|ons-icon--".concat(customPrefixRE, ")"));
|
14862 | util$4.arrayFrom(this.classList).filter(function (className) {
|
14863 | return re.test(className);
|
14864 | }).forEach(function (className) {
|
14865 | return _this3.classList.remove(className);
|
14866 | });
|
14867 | }
|
14868 | }, {
|
14869 | key: "_prefixIcon",
|
14870 | value: function _prefixIcon(iconName) {
|
14871 | var className = autoPrefix + (autoPrefix ? '-' : '') + iconName;
|
14872 | return {
|
14873 | className: className,
|
14874 | prefix: className.split('-')[0]
|
14875 | };
|
14876 | }
|
14877 | }, {
|
14878 | key: "_buildClassAndStyle",
|
14879 | value: function _buildClassAndStyle(iconName, size) {
|
14880 | var classList = ['ons-icon'];
|
14881 | var style = {}; // Icon
|
14882 |
|
14883 | if (iconName.indexOf('ion-') === 0) {
|
14884 | classList.push(iconName);
|
14885 | classList.push('ons-icon--ion');
|
14886 | } else if (iconName.indexOf('fa-') === 0) {
|
14887 | classList.push(iconName); // default icon style to Font Awesome Solid if icon style is not specified already
|
14888 |
|
14889 | if (!(this.classList.contains('far') || this.classList.contains('fab') || this.classList.contains('fal'))) {
|
14890 | classList.push('fa');
|
14891 | }
|
14892 | } else if (iconName.indexOf('md-') === 0) {
|
14893 | classList.push('zmdi');
|
14894 | classList.push('zmdi-' + iconName.split(/-(.+)?/)[1]);
|
14895 | } else {
|
14896 | var _this$_prefixIcon2 = this._prefixIcon(iconName),
|
14897 | className = _this$_prefixIcon2.className,
|
14898 | prefix = _this$_prefixIcon2.prefix;
|
14899 |
|
14900 | prefix && classList.push(prefix);
|
14901 | className && classList.push(className);
|
14902 | } // Size
|
14903 |
|
14904 |
|
14905 | if (size.match(/^[1-5]x|lg$/)) {
|
14906 | classList.push('ons-icon--' + size);
|
14907 | this.style.removeProperty('font-size');
|
14908 | } else {
|
14909 | style.fontSize = size;
|
14910 | }
|
14911 |
|
14912 | return {
|
14913 | classList: classList,
|
14914 | style: style
|
14915 | };
|
14916 | }
|
14917 | }], [{
|
14918 | key: "observedAttributes",
|
14919 | get: function get() {
|
14920 | return ['icon', 'size', 'modifier', 'class'];
|
14921 | }
|
14922 | }, {
|
14923 | key: "setAutoPrefix",
|
14924 | value: function setAutoPrefix(prefix) {
|
14925 | autoPrefix = prefix ? typeof prefix === 'string' && prefix || 'fa' : '';
|
14926 | }
|
14927 | }]);
|
14928 |
|
14929 | return IconElement;
|
14930 | }(BaseElement);
|
14931 | util$4.defineBooleanProperties(IconElement, ['fixed-width', 'spin']);
|
14932 | onsElements.Icon = IconElement;
|
14933 | customElements.define('ons-icon', IconElement);
|
14934 |
|
14935 | var LazyRepeatDelegate = /*#__PURE__*/function () {
|
14936 | function LazyRepeatDelegate(userDelegate) {
|
14937 | var templateElement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
14938 |
|
14939 | _classCallCheck(this, LazyRepeatDelegate);
|
14940 |
|
14941 | if (_typeof(userDelegate) !== 'object' || userDelegate === null) {
|
14942 | util$4.throw('"delegate" parameter must be an object');
|
14943 | }
|
14944 |
|
14945 | this._userDelegate = userDelegate;
|
14946 |
|
14947 | if (!(templateElement instanceof Element) && templateElement !== null) {
|
14948 | util$4.throw('"templateElement" parameter must be an instance of Element or null');
|
14949 | }
|
14950 |
|
14951 | this._templateElement = templateElement;
|
14952 | }
|
14953 |
|
14954 | _createClass(LazyRepeatDelegate, [{
|
14955 | key: "itemHeight",
|
14956 | get: function get() {
|
14957 | return this._userDelegate.itemHeight;
|
14958 | }
|
14959 | /**
|
14960 | * @return {Boolean}
|
14961 | */
|
14962 |
|
14963 | }, {
|
14964 | key: "hasRenderFunction",
|
14965 | value: function hasRenderFunction() {
|
14966 | return this._userDelegate._render instanceof Function;
|
14967 | }
|
14968 | /**
|
14969 | * @return {void}
|
14970 | */
|
14971 |
|
14972 | }, {
|
14973 | key: "_render",
|
14974 | value: function _render() {
|
14975 | this._userDelegate._render.apply(this._userDelegate, arguments);
|
14976 | }
|
14977 | /**
|
14978 | * @param {Number} index
|
14979 | * @param {Function} done A function that take item object as parameter.
|
14980 | */
|
14981 |
|
14982 | }, {
|
14983 | key: "loadItemElement",
|
14984 | value: function loadItemElement(index, done) {
|
14985 | if (this._userDelegate.loadItemElement instanceof Function) {
|
14986 | this._userDelegate.loadItemElement(index, done);
|
14987 | } else {
|
14988 | var element = this._userDelegate.createItemContent(index, this._templateElement);
|
14989 |
|
14990 | if (!(element instanceof Element)) {
|
14991 | util$4.throw('"createItemContent" must return an instance of Element');
|
14992 | }
|
14993 |
|
14994 | done({
|
14995 | element: element
|
14996 | });
|
14997 | }
|
14998 | }
|
14999 | /**
|
15000 | * @return {Number}
|
15001 | */
|
15002 |
|
15003 | }, {
|
15004 | key: "countItems",
|
15005 | value: function countItems() {
|
15006 | var count = this._userDelegate.countItems();
|
15007 |
|
15008 | if (typeof count !== 'number') {
|
15009 | util$4.throw('"countItems" must return a number');
|
15010 | }
|
15011 |
|
15012 | return count;
|
15013 | }
|
15014 | /**
|
15015 | * @param {Number} index
|
15016 | * @param {Object} item
|
15017 | * @param {Element} item.element
|
15018 | */
|
15019 |
|
15020 | }, {
|
15021 | key: "updateItem",
|
15022 | value: function updateItem(index, item) {
|
15023 | if (this._userDelegate.updateItemContent instanceof Function) {
|
15024 | this._userDelegate.updateItemContent(index, item);
|
15025 | }
|
15026 | }
|
15027 | /**
|
15028 | * @return {Number}
|
15029 | */
|
15030 |
|
15031 | }, {
|
15032 | key: "calculateItemHeight",
|
15033 | value: function calculateItemHeight(index) {
|
15034 | if (this._userDelegate.calculateItemHeight instanceof Function) {
|
15035 | var height = this._userDelegate.calculateItemHeight(index);
|
15036 |
|
15037 | if (typeof height !== 'number') {
|
15038 | util$4.throw('"calculateItemHeight" must return a number');
|
15039 | }
|
15040 |
|
15041 | return height;
|
15042 | }
|
15043 |
|
15044 | return 0;
|
15045 | }
|
15046 | /**
|
15047 | * @param {Number} index
|
15048 | * @param {Object} item
|
15049 | */
|
15050 |
|
15051 | }, {
|
15052 | key: "destroyItem",
|
15053 | value: function destroyItem(index, item) {
|
15054 | if (this._userDelegate.destroyItem instanceof Function) {
|
15055 | this._userDelegate.destroyItem(index, item);
|
15056 | }
|
15057 | }
|
15058 | /**
|
15059 | * @return {void}
|
15060 | */
|
15061 |
|
15062 | }, {
|
15063 | key: "destroy",
|
15064 | value: function destroy() {
|
15065 | if (this._userDelegate.destroy instanceof Function) {
|
15066 | this._userDelegate.destroy();
|
15067 | }
|
15068 |
|
15069 | this._userDelegate = this._templateElement = null;
|
15070 | }
|
15071 | }]);
|
15072 |
|
15073 | return LazyRepeatDelegate;
|
15074 | }();
|
15075 | /**
|
15076 | * This class provide core functions for ons-lazy-repeat.
|
15077 | */
|
15078 |
|
15079 | var LazyRepeatProvider = /*#__PURE__*/function () {
|
15080 | /**
|
15081 | * @param {Element} wrapperElement
|
15082 | * @param {LazyRepeatDelegate} delegate
|
15083 | */
|
15084 | function LazyRepeatProvider(wrapperElement, delegate) {
|
15085 | _classCallCheck(this, LazyRepeatProvider);
|
15086 |
|
15087 | if (!(delegate instanceof LazyRepeatDelegate)) {
|
15088 | util$4.throw('"delegate" parameter must be an instance of LazyRepeatDelegate');
|
15089 | }
|
15090 |
|
15091 | this._wrapperElement = wrapperElement;
|
15092 | this._delegate = delegate;
|
15093 | this._insertIndex = this._wrapperElement.children[0] && this._wrapperElement.children[0].tagName === 'ONS-LAZY-REPEAT' ? 1 : 0;
|
15094 |
|
15095 | if (wrapperElement.tagName.toLowerCase() === 'ons-list') {
|
15096 | wrapperElement.classList.add('lazy-list');
|
15097 | }
|
15098 |
|
15099 | this._pageContent = this._findPageContentElement(wrapperElement);
|
15100 |
|
15101 | if (!this._pageContent) {
|
15102 | util$4.throw('LazyRepeat must be descendant of a Page element');
|
15103 | }
|
15104 |
|
15105 | this.lastScrollTop = this._pageContent.scrollTop;
|
15106 | this.padding = 0;
|
15107 | this._topPositions = [0];
|
15108 | this._renderedItems = {};
|
15109 |
|
15110 | if (!this._delegate.itemHeight && !this._delegate.calculateItemHeight(0)) {
|
15111 | this._unknownItemHeight = true;
|
15112 | }
|
15113 |
|
15114 | this._addEventListeners();
|
15115 |
|
15116 | this._onChange();
|
15117 | }
|
15118 |
|
15119 | _createClass(LazyRepeatProvider, [{
|
15120 | key: "padding",
|
15121 | get: function get() {
|
15122 | return parseInt(this._wrapperElement.style.paddingTop, 10);
|
15123 | },
|
15124 | set: function set(newValue) {
|
15125 | this._wrapperElement.style.paddingTop = newValue + 'px';
|
15126 | }
|
15127 | }, {
|
15128 | key: "_findPageContentElement",
|
15129 | value: function _findPageContentElement(wrapperElement) {
|
15130 | var pageContent = util$4.findParent(wrapperElement, '.page__content');
|
15131 |
|
15132 | if (pageContent) {
|
15133 | return pageContent;
|
15134 | }
|
15135 |
|
15136 | var page = util$4.findParent(wrapperElement, 'ons-page');
|
15137 |
|
15138 | if (page) {
|
15139 | var content = util$4.findChild(page, '.content');
|
15140 |
|
15141 | if (content) {
|
15142 | return content;
|
15143 | }
|
15144 | }
|
15145 |
|
15146 | return null;
|
15147 | }
|
15148 | }, {
|
15149 | key: "_checkItemHeight",
|
15150 | value: function _checkItemHeight(callback) {
|
15151 | var _this = this;
|
15152 |
|
15153 | this._delegate.loadItemElement(0, function (item) {
|
15154 | if (!_this._unknownItemHeight) {
|
15155 | util$4.throw('Invalid state');
|
15156 | }
|
15157 |
|
15158 | _this._wrapperElement.appendChild(item.element);
|
15159 |
|
15160 | var done = function done() {
|
15161 | _this._delegate.destroyItem(0, item);
|
15162 |
|
15163 | item.element && item.element.remove();
|
15164 | delete _this._unknownItemHeight;
|
15165 | callback();
|
15166 | };
|
15167 |
|
15168 | _this._itemHeight = item.element.offsetHeight;
|
15169 |
|
15170 | if (_this._itemHeight > 0) {
|
15171 | done();
|
15172 | return;
|
15173 | } // retry to measure offset height
|
15174 | // dirty fix for angular2 directive
|
15175 |
|
15176 |
|
15177 | _this._wrapperElement.style.visibility = 'hidden';
|
15178 | item.element.style.visibility = 'hidden';
|
15179 | setImmediate(function () {
|
15180 | _this._itemHeight = item.element.offsetHeight;
|
15181 |
|
15182 | if (_this._itemHeight == 0) {
|
15183 | util$4.throw('Invalid state: "itemHeight" must be greater than zero');
|
15184 | }
|
15185 |
|
15186 | _this._wrapperElement.style.visibility = '';
|
15187 | done();
|
15188 | });
|
15189 | });
|
15190 | }
|
15191 | }, {
|
15192 | key: "staticItemHeight",
|
15193 | get: function get() {
|
15194 | return this._delegate.itemHeight || this._itemHeight;
|
15195 | }
|
15196 | }, {
|
15197 | key: "_countItems",
|
15198 | value: function _countItems() {
|
15199 | return this._delegate.countItems();
|
15200 | }
|
15201 | }, {
|
15202 | key: "_getItemHeight",
|
15203 | value: function _getItemHeight(i) {
|
15204 | // Item is rendered
|
15205 | if (Object.prototype.hasOwnProperty.call(this._renderedItems, i)) {
|
15206 | if (!Object.prototype.hasOwnProperty.call(this._renderedItems[i], 'height')) {
|
15207 | this._renderedItems[i].height = this._renderedItems[i].element.offsetHeight;
|
15208 | }
|
15209 |
|
15210 | return this._renderedItems[i].height;
|
15211 | } // Item is not rendered, scroll up
|
15212 |
|
15213 |
|
15214 | if (this._topPositions[i + 1] && this._topPositions[i]) {
|
15215 | return this._topPositions[i + 1] - this._topPositions[i];
|
15216 | } // Item is not rendered, scroll down
|
15217 |
|
15218 |
|
15219 | return this.staticItemHeight || this._delegate.calculateItemHeight(i);
|
15220 | }
|
15221 | }, {
|
15222 | key: "_calculateRenderedHeight",
|
15223 | value: function _calculateRenderedHeight() {
|
15224 | var _this2 = this;
|
15225 |
|
15226 | return Object.keys(this._renderedItems).reduce(function (a, b) {
|
15227 | return a + _this2._getItemHeight(+b);
|
15228 | }, 0);
|
15229 | }
|
15230 | }, {
|
15231 | key: "_onChange",
|
15232 | value: function _onChange() {
|
15233 | this._render();
|
15234 | }
|
15235 | }, {
|
15236 | key: "_lastItemRendered",
|
15237 | value: function _lastItemRendered() {
|
15238 | return Math.max.apply(Math, _toConsumableArray(Object.keys(this._renderedItems)));
|
15239 | }
|
15240 | }, {
|
15241 | key: "_firstItemRendered",
|
15242 | value: function _firstItemRendered() {
|
15243 | return Math.min.apply(Math, _toConsumableArray(Object.keys(this._renderedItems)));
|
15244 | }
|
15245 | }, {
|
15246 | key: "refresh",
|
15247 | value: function refresh() {
|
15248 | var forceRender = {
|
15249 | forceScrollDown: true
|
15250 | };
|
15251 |
|
15252 | var firstItemIndex = this._firstItemRendered();
|
15253 |
|
15254 | if (util$4.isInteger(firstItemIndex)) {
|
15255 | this._wrapperElement.style.height = this._topPositions[firstItemIndex] + this._calculateRenderedHeight() + 'px';
|
15256 | this.padding = this._topPositions[firstItemIndex];
|
15257 | forceRender.forceFirstIndex = firstItemIndex;
|
15258 | }
|
15259 |
|
15260 | this._removeAllElements();
|
15261 |
|
15262 | this._render(forceRender);
|
15263 |
|
15264 | this._wrapperElement.style.height = 'inherit';
|
15265 | }
|
15266 | }, {
|
15267 | key: "_render",
|
15268 | value: function _render() {
|
15269 | var _this3 = this;
|
15270 |
|
15271 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
15272 | _ref$forceScrollDown = _ref.forceScrollDown,
|
15273 | forceScrollDown = _ref$forceScrollDown === void 0 ? false : _ref$forceScrollDown,
|
15274 | forceFirstIndex = _ref.forceFirstIndex,
|
15275 | forceLastIndex = _ref.forceLastIndex;
|
15276 |
|
15277 | if (this._unknownItemHeight) {
|
15278 | return this._checkItemHeight(this._render.bind(this, arguments[0]));
|
15279 | }
|
15280 |
|
15281 | var isScrollUp = !forceScrollDown && this.lastScrollTop > this._pageContent.scrollTop;
|
15282 | this.lastScrollTop = this._pageContent.scrollTop;
|
15283 | var keep = {};
|
15284 |
|
15285 | var offset = this._wrapperElement.getBoundingClientRect().top;
|
15286 |
|
15287 | var limit = 4 * window.innerHeight - offset;
|
15288 |
|
15289 | var count = this._countItems();
|
15290 | var start = forceFirstIndex || Math.max(0, this._calculateStartIndex(offset) - 30); // Recalculate for 0 or undefined
|
15291 |
|
15292 | var i = start;
|
15293 |
|
15294 | for (var top = this._topPositions[i]; i < count && top < limit; i++) {
|
15295 | if (i >= this._topPositions.length) {
|
15296 | // perf optimization
|
15297 | this._topPositions.length += 100;
|
15298 | }
|
15299 |
|
15300 | this._topPositions[i] = top;
|
15301 | top += this._getItemHeight(i);
|
15302 | }
|
15303 |
|
15304 | if (this._delegate.hasRenderFunction && this._delegate.hasRenderFunction()) {
|
15305 | return this._delegate._render(start, i, function () {
|
15306 | _this3.padding = _this3._topPositions[start];
|
15307 | });
|
15308 | }
|
15309 |
|
15310 | if (isScrollUp) {
|
15311 | for (var j = i - 1; j >= start; j--) {
|
15312 | keep[j] = true;
|
15313 |
|
15314 | this._renderElement(j, isScrollUp);
|
15315 | }
|
15316 | } else {
|
15317 | var lastIndex = forceLastIndex || Math.max.apply(Math, [i - 1].concat(_toConsumableArray(Object.keys(this._renderedItems)))); // Recalculate for 0 or undefined
|
15318 |
|
15319 | for (var _j = start; _j <= lastIndex; _j++) {
|
15320 | keep[_j] = true;
|
15321 |
|
15322 | this._renderElement(_j, isScrollUp);
|
15323 | }
|
15324 | }
|
15325 |
|
15326 | Object.keys(this._renderedItems).forEach(function (key) {
|
15327 | return keep[key] || _this3._removeElement(key, isScrollUp);
|
15328 | });
|
15329 | }
|
15330 | /**
|
15331 | * @param {Number} index
|
15332 | * @param {Boolean} isScrollUp
|
15333 | */
|
15334 |
|
15335 | }, {
|
15336 | key: "_renderElement",
|
15337 | value: function _renderElement(index, isScrollUp) {
|
15338 | var _this4 = this;
|
15339 |
|
15340 | var item = this._renderedItems[index];
|
15341 |
|
15342 | if (item) {
|
15343 | this._delegate.updateItem(index, item); // update if it exists
|
15344 |
|
15345 |
|
15346 | return;
|
15347 | }
|
15348 |
|
15349 | this._delegate.loadItemElement(index, function (item) {
|
15350 | if (isScrollUp) {
|
15351 | _this4._wrapperElement.insertBefore(item.element, _this4._wrapperElement.children[_this4._insertIndex]);
|
15352 |
|
15353 | _this4.padding = _this4._topPositions[index];
|
15354 | item.height = _this4._topPositions[index + 1] - _this4._topPositions[index];
|
15355 | } else {
|
15356 | _this4._wrapperElement.appendChild(item.element);
|
15357 | }
|
15358 |
|
15359 | _this4._renderedItems[index] = item;
|
15360 | });
|
15361 | }
|
15362 | /**
|
15363 | * @param {Number} index
|
15364 | * @param {Boolean} isScrollUp
|
15365 | */
|
15366 |
|
15367 | }, {
|
15368 | key: "_removeElement",
|
15369 | value: function _removeElement(index) {
|
15370 | var isScrollUp = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
15371 | index = +index;
|
15372 | var item = this._renderedItems[index];
|
15373 |
|
15374 | this._delegate.destroyItem(index, item);
|
15375 |
|
15376 | if (isScrollUp) {
|
15377 | this._topPositions[index + 1] = undefined;
|
15378 | } else {
|
15379 | this.padding = this.padding + this._getItemHeight(index);
|
15380 | }
|
15381 |
|
15382 | if (item.element.parentElement) {
|
15383 | item.element.parentElement.removeChild(item.element);
|
15384 | }
|
15385 |
|
15386 | delete this._renderedItems[index];
|
15387 | }
|
15388 | }, {
|
15389 | key: "_removeAllElements",
|
15390 | value: function _removeAllElements() {
|
15391 | var _this5 = this;
|
15392 |
|
15393 | Object.keys(this._renderedItems).forEach(function (key) {
|
15394 | return _this5._removeElement(key);
|
15395 | });
|
15396 | }
|
15397 | }, {
|
15398 | key: "_recalculateTopPositions",
|
15399 | value: function _recalculateTopPositions(start, end) {
|
15400 | for (var i = start; i <= end; i++) {
|
15401 | this._topPositions[i + 1] = this._topPositions[i] + this._getItemHeight(i);
|
15402 | }
|
15403 | }
|
15404 | }, {
|
15405 | key: "_calculateStartIndex",
|
15406 | value: function _calculateStartIndex(current) {
|
15407 | var firstItemIndex = this._firstItemRendered();
|
15408 |
|
15409 | var lastItemIndex = this._lastItemRendered(); // Fix for Safari scroll and Angular 2
|
15410 |
|
15411 |
|
15412 | this._recalculateTopPositions(firstItemIndex, lastItemIndex);
|
15413 |
|
15414 | var start = 0;
|
15415 | var end = this._countItems() - 1; // Binary search for index at top of screen so we can speed up rendering.
|
15416 |
|
15417 | for (;;) {
|
15418 | var middle = Math.floor((start + end) / 2);
|
15419 | var value = current + this._topPositions[middle];
|
15420 |
|
15421 | if (end < start) {
|
15422 | return 0;
|
15423 | } else if (value <= 0 && value + this._getItemHeight(middle) > 0) {
|
15424 | return middle;
|
15425 | } else if (isNaN(value) || value >= 0) {
|
15426 | end = middle - 1;
|
15427 | } else {
|
15428 | start = middle + 1;
|
15429 | }
|
15430 | }
|
15431 | }
|
15432 | }, {
|
15433 | key: "_debounce",
|
15434 | value: function _debounce(func, wait, immediate) {
|
15435 | var timeout;
|
15436 | return function () {
|
15437 | var _arguments = arguments,
|
15438 | _this6 = this;
|
15439 |
|
15440 | var callNow = immediate && !timeout;
|
15441 | clearTimeout(timeout);
|
15442 |
|
15443 | if (callNow) {
|
15444 | func.apply(this, arguments);
|
15445 | } else {
|
15446 | timeout = setTimeout(function () {
|
15447 | timeout = null;
|
15448 | func.apply(_this6, _arguments);
|
15449 | }, wait);
|
15450 | }
|
15451 | };
|
15452 | }
|
15453 | }, {
|
15454 | key: "_doubleFireOnTouchend",
|
15455 | value: function _doubleFireOnTouchend() {
|
15456 | this._render();
|
15457 |
|
15458 | this._debounce(this._render.bind(this), 100);
|
15459 | }
|
15460 | }, {
|
15461 | key: "_addEventListeners",
|
15462 | value: function _addEventListeners() {
|
15463 | util$4.bindListeners(this, ['_onChange', '_doubleFireOnTouchend']);
|
15464 |
|
15465 | if (platform.isIOS()) {
|
15466 | this._boundOnChange = this._debounce(this._boundOnChange, 30);
|
15467 | }
|
15468 |
|
15469 | this._pageContent.addEventListener('scroll', this._boundOnChange, true);
|
15470 |
|
15471 | if (platform.isIOS()) {
|
15472 | util$4.addEventListener(this._pageContent, 'touchmove', this._boundOnChange, {
|
15473 | capture: true,
|
15474 | passive: true
|
15475 | });
|
15476 |
|
15477 | this._pageContent.addEventListener('touchend', this._boundDoubleFireOnTouchend, true);
|
15478 | }
|
15479 |
|
15480 | window.document.addEventListener('resize', this._boundOnChange, true);
|
15481 | }
|
15482 | }, {
|
15483 | key: "_removeEventListeners",
|
15484 | value: function _removeEventListeners() {
|
15485 | this._pageContent.removeEventListener('scroll', this._boundOnChange, true);
|
15486 |
|
15487 | if (platform.isIOS()) {
|
15488 | util$4.removeEventListener(this._pageContent, 'touchmove', this._boundOnChange, {
|
15489 | capture: true,
|
15490 | passive: true
|
15491 | });
|
15492 |
|
15493 | this._pageContent.removeEventListener('touchend', this._boundDoubleFireOnTouchend, true);
|
15494 | }
|
15495 |
|
15496 | window.document.removeEventListener('resize', this._boundOnChange, true);
|
15497 | }
|
15498 | }, {
|
15499 | key: "destroy",
|
15500 | value: function destroy() {
|
15501 | this._removeAllElements();
|
15502 |
|
15503 | this._delegate.destroy();
|
15504 |
|
15505 | this._parentElement = this._delegate = this._renderedItems = null;
|
15506 |
|
15507 | this._removeEventListeners();
|
15508 | }
|
15509 | }]);
|
15510 |
|
15511 | return LazyRepeatProvider;
|
15512 | }();
|
15513 |
|
15514 | /**
|
15515 | * @element ons-lazy-repeat
|
15516 | * @category list
|
15517 | * @description
|
15518 | * [en]
|
15519 | * Using this component a list with millions of items can be rendered without a drop in performance.
|
15520 | * It does that by "lazily" loading elements into the DOM when they come into view and
|
15521 | * removing items from the DOM when they are not visible.
|
15522 | * [/en]
|
15523 | * [ja]
|
15524 | * このコンポーネント内で描画されるアイテムのDOM要素の読み込みは、画面に見えそうになった時まで自動的に遅延され、
|
15525 | * 画面から見えなくなった場合にはその要素は動的にアンロードされます。
|
15526 | * このコンポーネントを使うことで、パフォーマンスを劣化させること無しに巨大な数の要素を描画できます。
|
15527 | * [/ja]
|
15528 | * @codepen QwrGBm
|
15529 | * @tutorial vanilla/Reference/lazy-repeat
|
15530 | * @seealso ons-list
|
15531 | * [en]The `<ons-list>` element is used to render a list.[/en]
|
15532 | * [ja]`<ons-list>`要素はリストを描画するのに使われます。[/ja]
|
15533 | * @example
|
15534 | * <script>
|
15535 | * window.addEventListener('load', function() {
|
15536 | * var lazyRepeat = document.querySelector('#list');
|
15537 | * lazyRepeat.delegate = {
|
15538 | * createItemContent: function(i, template) {
|
15539 | * var dom = template.cloneNode(true);
|
15540 | * dom.innerText = i;
|
15541 | *
|
15542 | * return dom;
|
15543 | * },
|
15544 | * countItems: function() {
|
15545 | * return 10000000;
|
15546 | * },
|
15547 | * destroyItem: function(index, item) {
|
15548 | * console.log('Destroyed item with index: ' + index);
|
15549 | * }
|
15550 | * };
|
15551 | * });
|
15552 | * </script>
|
15553 | *
|
15554 | * <ons-list id="list">
|
15555 | * <ons-lazy-repeat>
|
15556 | * <ons-list-item></ons-list-item>
|
15557 | * </ons-lazy-repeat>
|
15558 | * </ons-list>
|
15559 | */
|
15560 |
|
15561 | var LazyRepeatElement = /*#__PURE__*/function (_BaseElement) {
|
15562 | _inherits(LazyRepeatElement, _BaseElement);
|
15563 |
|
15564 | var _super = _createSuper(LazyRepeatElement);
|
15565 |
|
15566 | function LazyRepeatElement() {
|
15567 | _classCallCheck(this, LazyRepeatElement);
|
15568 |
|
15569 | return _super.apply(this, arguments);
|
15570 | }
|
15571 |
|
15572 | _createClass(LazyRepeatElement, [{
|
15573 | key: "connectedCallback",
|
15574 | value: function connectedCallback() {
|
15575 | // not very good idea and also not documented
|
15576 | if (this.hasAttribute('delegate')) {
|
15577 | this.delegate = window[this.getAttribute('delegate')];
|
15578 | }
|
15579 | }
|
15580 | /**
|
15581 | * @property delegate
|
15582 | * @type {Object}
|
15583 | * @description
|
15584 | * [en]Specify a delegate object to load and unload item elements.[/en]
|
15585 | * [ja]要素のロード、アンロードなどの処理を委譲するオブジェクトを指定します。[/ja]
|
15586 | */
|
15587 |
|
15588 | /**
|
15589 | * @property delegate.createItemContent
|
15590 | * @type {Function}
|
15591 | * @description
|
15592 | * [en]
|
15593 | * This function should return a `HTMLElement`.
|
15594 | *
|
15595 | * To help rendering the element, the current index and a template is supplied as arguments. The template is the initial content of the `<ons-lazy-repeat>` element.
|
15596 | * [/en]
|
15597 | * [ja]
|
15598 | * この関数は`HTMLElement`を返してください。
|
15599 | * 要素を生成しやすくするために、現在のアイテムのインデックスとテンプレートが引数に渡されます。
|
15600 | * このテンプレートは、`<ons-lazy-repeat>`要素のコンテンツが渡されます。
|
15601 | * [/ja]
|
15602 | */
|
15603 |
|
15604 | /**
|
15605 | * @property delegate.countItems
|
15606 | * @type {Function}
|
15607 | * @description
|
15608 | * [en]Should return the number of items in the list.[/en]
|
15609 | * [ja]リスト内のアイテム数を返してください。[/ja]
|
15610 | */
|
15611 |
|
15612 | /**
|
15613 | * @property delegate.calculateItemHeight
|
15614 | * @type {Function}
|
15615 | * @description
|
15616 | * [en]
|
15617 | * Should return the height of an item. The index is provided as an argument.
|
15618 | *
|
15619 | * This is important when rendering lists where the items have different height.
|
15620 | *
|
15621 | * The function is optional and if it isn't present the height of the first item will be automatically calculated and used for all other items.
|
15622 | * [/en]
|
15623 | * [ja]
|
15624 | * アイテムの高さ(ピクセル)を返してください。アイテムのインデックス値は引数で渡されます。
|
15625 | * この関数は、それぞれのアイムが違った高さを持つリストをレンダリングする際に重要です。
|
15626 | * この関数はオプショナルです。もしこの関数が無い場合には、
|
15627 | * 最初のアイテムの高さが他のすべてのアイテムの高さとして利用されます。
|
15628 | * [/ja]
|
15629 | */
|
15630 |
|
15631 | /**
|
15632 | * @property delegate.destroyItem
|
15633 | * @type {Function}
|
15634 | * @description
|
15635 | * [en]
|
15636 | * This function is used called when an item is removed from the DOM. The index and DOM element is provided as arguments.
|
15637 | *
|
15638 | * The function is optional but may be important in order to avoid memory leaks.
|
15639 | * [/en]
|
15640 | * [ja]
|
15641 | * この関数は、あるアイテムがDOMツリーから除かれた時に呼び出されます。
|
15642 | * アイテムのインデックス値とDOM要素が引数として渡されます。
|
15643 | * この関数はオプショナルですが、各アイテムの後処理が必要な場合にはメモリーリークを避けるために重要です。
|
15644 | * [/ja]
|
15645 | */
|
15646 |
|
15647 | }, {
|
15648 | key: "delegate",
|
15649 | get: function get() {
|
15650 | // eslint-disable-line getter-return
|
15651 | util$4.throw('No delegate getter');
|
15652 | }
|
15653 | /**
|
15654 | * @method refresh
|
15655 | * @signature refresh()
|
15656 | * @description
|
15657 | * [en]Refresh the list. Use this method when the data has changed.[/en]
|
15658 | * [ja]リストを更新します。もしデータが変わった場合にはこのメソッドを使ってください。[/ja]
|
15659 | */
|
15660 | ,
|
15661 | set: function set(userDelegate) {
|
15662 | this._lazyRepeatProvider && this._lazyRepeatProvider.destroy();
|
15663 |
|
15664 | if (!this._templateElement && this.children[0]) {
|
15665 | this._templateElement = this.removeChild(this.children[0]);
|
15666 | }
|
15667 |
|
15668 | var delegate = new LazyRepeatDelegate(userDelegate, this._templateElement || null);
|
15669 | this._lazyRepeatProvider = new LazyRepeatProvider(this.parentElement, delegate);
|
15670 | }
|
15671 | }, {
|
15672 | key: "refresh",
|
15673 | value: function refresh() {
|
15674 | this._lazyRepeatProvider && this._lazyRepeatProvider.refresh();
|
15675 | }
|
15676 | }, {
|
15677 | key: "attributeChangedCallback",
|
15678 | value: function attributeChangedCallback(name, last, current) {}
|
15679 | }, {
|
15680 | key: "disconnectedCallback",
|
15681 | value: function disconnectedCallback() {
|
15682 | if (this._lazyRepeatProvider) {
|
15683 | this._lazyRepeatProvider.destroy();
|
15684 |
|
15685 | this._lazyRepeatProvider = null;
|
15686 | }
|
15687 | }
|
15688 | }]);
|
15689 |
|
15690 | return LazyRepeatElement;
|
15691 | }(BaseElement);
|
15692 | internal$1.LazyRepeatDelegate = LazyRepeatDelegate;
|
15693 | internal$1.LazyRepeatProvider = LazyRepeatProvider;
|
15694 | onsElements.LazyRepeat = LazyRepeatElement;
|
15695 | customElements.define('ons-lazy-repeat', LazyRepeatElement);
|
15696 |
|
15697 | var defaultClassName$c = 'list-header';
|
15698 | var scheme$m = {
|
15699 | '': 'list-header--*'
|
15700 | };
|
15701 | /**
|
15702 | * @element ons-list-header
|
15703 | * @category list
|
15704 | * @description
|
15705 | * [en]Header element for list items. Must be put inside the `<ons-list>` component.[/en]
|
15706 | * [ja]リスト要素に使用するヘッダー用コンポーネント。ons-listと共に使用します。[/ja]
|
15707 | * @seealso ons-list
|
15708 | * [en]The `<ons-list>` component[/en]
|
15709 | * [ja]ons-listコンポーネント[/ja]
|
15710 | * @seealso ons-list-item
|
15711 | * [en]The `<ons-list-item>` component[/en]
|
15712 | * [ja]ons-list-itemコンポーネント[/ja]
|
15713 | * @codepen yxcCt
|
15714 | * @tutorial vanilla/Reference/list
|
15715 | * @modifier material
|
15716 | * [en]Display a Material Design list header.[/en]
|
15717 | * [ja][/ja]
|
15718 | * @example
|
15719 | * <ons-list>
|
15720 | * <ons-list-header>Header Text</ons-list-header>
|
15721 | * <ons-list-item>Item</ons-list-item>
|
15722 | * <ons-list-item>Item</ons-list-item>
|
15723 | * </ons-list>
|
15724 | */
|
15725 |
|
15726 | var ListHeaderElement = /*#__PURE__*/function (_BaseElement) {
|
15727 | _inherits(ListHeaderElement, _BaseElement);
|
15728 |
|
15729 | var _super = _createSuper(ListHeaderElement);
|
15730 |
|
15731 | /**
|
15732 | * @attribute modifier
|
15733 | * @type {String}
|
15734 | * @description
|
15735 | * [en]The appearance of the list header.[/en]
|
15736 | * [ja]ヘッダーの表現を指定します。[/ja]
|
15737 | */
|
15738 | function ListHeaderElement() {
|
15739 | var _this;
|
15740 |
|
15741 | _classCallCheck(this, ListHeaderElement);
|
15742 |
|
15743 | _this = _super.call(this);
|
15744 |
|
15745 | _this._compile();
|
15746 |
|
15747 | return _this;
|
15748 | }
|
15749 |
|
15750 | _createClass(ListHeaderElement, [{
|
15751 | key: "_compile",
|
15752 | value: function _compile() {
|
15753 | autoStyle.prepare(this);
|
15754 | this.classList.add(defaultClassName$c);
|
15755 | ModifierUtil.initModifier(this, scheme$m);
|
15756 | }
|
15757 | }, {
|
15758 | key: "attributeChangedCallback",
|
15759 | value: function attributeChangedCallback(name, last, current) {
|
15760 | switch (name) {
|
15761 | case 'class':
|
15762 | util$4.restoreClass(this, defaultClassName$c, scheme$m);
|
15763 | break;
|
15764 |
|
15765 | case 'modifier':
|
15766 | ModifierUtil.onModifierChanged(last, current, this, scheme$m);
|
15767 | break;
|
15768 | }
|
15769 | }
|
15770 | }], [{
|
15771 | key: "observedAttributes",
|
15772 | get: function get() {
|
15773 | return ['modifier', 'class'];
|
15774 | }
|
15775 | }]);
|
15776 |
|
15777 | return ListHeaderElement;
|
15778 | }(BaseElement);
|
15779 | onsElements.ListHeader = ListHeaderElement;
|
15780 | customElements.define('ons-list-header', ListHeaderElement);
|
15781 |
|
15782 | var defaultClassName$b = 'list-title';
|
15783 | var scheme$l = {
|
15784 | '': 'list-title--*'
|
15785 | };
|
15786 | /**
|
15787 | * @element ons-list-title
|
15788 | * @category list
|
15789 | * @description
|
15790 | * [en]Represents a list title.[/en]
|
15791 | * [ja]リストのタイトルを表現します。[/ja]
|
15792 | * @example
|
15793 | * <ons-list-title>List Title</ons-list-title>
|
15794 | * <ons-list>
|
15795 | * <ons-list-item>Item</ons-list-item>
|
15796 | * </ons-list>
|
15797 | * @modifier material
|
15798 | * [en]Display a Material Design list title.[/en]
|
15799 | * [ja][/ja]
|
15800 | */
|
15801 |
|
15802 | var ListTitleElement = /*#__PURE__*/function (_BaseElement) {
|
15803 | _inherits(ListTitleElement, _BaseElement);
|
15804 |
|
15805 | var _super = _createSuper(ListTitleElement);
|
15806 |
|
15807 | function ListTitleElement() {
|
15808 | var _this;
|
15809 |
|
15810 | _classCallCheck(this, ListTitleElement);
|
15811 |
|
15812 | _this = _super.call(this);
|
15813 |
|
15814 | _this._compile();
|
15815 |
|
15816 | return _this;
|
15817 | }
|
15818 |
|
15819 | _createClass(ListTitleElement, [{
|
15820 | key: "_compile",
|
15821 | value: function _compile() {
|
15822 | autoStyle.prepare(this);
|
15823 | this.classList.add(defaultClassName$b);
|
15824 | ModifierUtil.initModifier(this, scheme$l);
|
15825 | }
|
15826 | }, {
|
15827 | key: "attributeChangedCallback",
|
15828 | value: function attributeChangedCallback(name, last, current) {
|
15829 | switch (name) {
|
15830 | case 'class':
|
15831 | util$4.restoreClass(this, defaultClassName$b, scheme$l);
|
15832 | break;
|
15833 |
|
15834 | case 'modifier':
|
15835 | ModifierUtil.onModifierChanged(last, current, this, scheme$l);
|
15836 | break;
|
15837 | }
|
15838 | }
|
15839 | }], [{
|
15840 | key: "observedAttributes",
|
15841 | get: function get() {
|
15842 | return ['modifier', 'class'];
|
15843 | }
|
15844 | }]);
|
15845 |
|
15846 | return ListTitleElement;
|
15847 | }(BaseElement);
|
15848 | onsElements.ListTitle = ListTitleElement;
|
15849 | customElements.define('ons-list-title', ListTitleElement);
|
15850 |
|
15851 | var ListItemAnimator = /*#__PURE__*/function (_BaseAnimator) {
|
15852 | _inherits(ListItemAnimator, _BaseAnimator);
|
15853 |
|
15854 | var _super = _createSuper(ListItemAnimator);
|
15855 |
|
15856 | function ListItemAnimator() {
|
15857 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
15858 | _ref$timing = _ref.timing,
|
15859 | timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
|
15860 | _ref$delay = _ref.delay,
|
15861 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
15862 | _ref$duration = _ref.duration,
|
15863 | duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
|
15864 |
|
15865 | _classCallCheck(this, ListItemAnimator);
|
15866 |
|
15867 | return _super.call(this, {
|
15868 | timing: timing,
|
15869 | delay: delay,
|
15870 | duration: duration
|
15871 | });
|
15872 | }
|
15873 |
|
15874 | _createClass(ListItemAnimator, [{
|
15875 | key: "showExpansion",
|
15876 | value: function showExpansion(listItem, callback) {
|
15877 | callback();
|
15878 | }
|
15879 | }, {
|
15880 | key: "hideExpansion",
|
15881 | value: function hideExpansion(listItem, callback) {
|
15882 | callback();
|
15883 | }
|
15884 | }]);
|
15885 |
|
15886 | return ListItemAnimator;
|
15887 | }(BaseAnimator);
|
15888 | var SlideListItemAnimator = /*#__PURE__*/function (_ListItemAnimator) {
|
15889 | _inherits(SlideListItemAnimator, _ListItemAnimator);
|
15890 |
|
15891 | var _super2 = _createSuper(SlideListItemAnimator);
|
15892 |
|
15893 | function SlideListItemAnimator() {
|
15894 | _classCallCheck(this, SlideListItemAnimator);
|
15895 |
|
15896 | return _super2.apply(this, arguments);
|
15897 | }
|
15898 |
|
15899 | _createClass(SlideListItemAnimator, [{
|
15900 | key: "showExpansion",
|
15901 | value: function showExpansion(listItem, callback) {
|
15902 | this._animateExpansion(listItem, true, callback);
|
15903 | }
|
15904 | }, {
|
15905 | key: "hideExpansion",
|
15906 | value: function hideExpansion(listItem, callback) {
|
15907 | this._animateExpansion(listItem, false, callback);
|
15908 | }
|
15909 | }, {
|
15910 | key: "_animateExpansion",
|
15911 | value: function _animateExpansion(listItem, shouldOpen, callback) {
|
15912 | var _animit;
|
15913 |
|
15914 | // To animate the opening of the expansion panel correctly, we need to know its
|
15915 | // height. To calculate this, we set its height to auto, and then get the computed
|
15916 | // height and padding. Once this is done, we set the height back to its original value.
|
15917 | var oldHeight = listItem.expandableContent.style.height;
|
15918 | var oldDisplay = listItem.expandableContent.style.display;
|
15919 | listItem.expandableContent.style.height = 'auto';
|
15920 | listItem.expandableContent.style.display = 'block';
|
15921 | var computedStyle = window.getComputedStyle(listItem.expandableContent);
|
15922 | var expansionOpenTransition = [{
|
15923 | height: 0,
|
15924 | paddingTop: 0,
|
15925 | paddingBottom: 0
|
15926 | }, {
|
15927 | height: computedStyle.height,
|
15928 | paddingTop: computedStyle.paddingTop,
|
15929 | paddingBottom: computedStyle.paddingBottom
|
15930 | }];
|
15931 | var iconOpenTransition = [{
|
15932 | transform: 'rotate(45deg)'
|
15933 | }, {
|
15934 | transform: 'rotate(225deg)'
|
15935 | }]; // Now that we have the values we need, reset the height back to its original state
|
15936 |
|
15937 | listItem.expandableContent.style.height = oldHeight;
|
15938 |
|
15939 | (_animit = Animit(listItem.expandableContent, {
|
15940 | duration: this.duration,
|
15941 | property: 'height padding-top padding-bottom'
|
15942 | })).default.apply(_animit, _toConsumableArray(shouldOpen ? expansionOpenTransition : expansionOpenTransition.reverse())).play(function () {
|
15943 | listItem.expandableContent.style.display = oldDisplay;
|
15944 | callback && callback();
|
15945 | });
|
15946 |
|
15947 | if (listItem.expandChevron) {
|
15948 | var _animit2;
|
15949 |
|
15950 | (_animit2 = Animit(listItem.expandChevron, {
|
15951 | duration: this.duration,
|
15952 | property: 'transform'
|
15953 | })).default.apply(_animit2, _toConsumableArray(shouldOpen ? iconOpenTransition : iconOpenTransition.reverse())).play();
|
15954 | }
|
15955 | }
|
15956 | }]);
|
15957 |
|
15958 | return SlideListItemAnimator;
|
15959 | }(ListItemAnimator);
|
15960 |
|
15961 | var defaultClassName$a = 'list-item';
|
15962 | var scheme$k = {
|
15963 | '.list-item': 'list-item--*',
|
15964 | '.list-item__left': 'list-item--*__left',
|
15965 | '.list-item__center': 'list-item--*__center',
|
15966 | '.list-item__right': 'list-item--*__right',
|
15967 | '.list-item__label': 'list-item--*__label',
|
15968 | '.list-item__title': 'list-item--*__title',
|
15969 | '.list-item__subtitle': 'list-item--*__subtitle',
|
15970 | '.list-item__thumbnail': 'list-item--*__thumbnail',
|
15971 | '.list-item__icon': 'list-item--*__icon'
|
15972 | };
|
15973 | var _animatorDict$5 = {
|
15974 | 'default': SlideListItemAnimator,
|
15975 | 'none': ListItemAnimator
|
15976 | };
|
15977 | /**
|
15978 | * @element ons-list-item
|
15979 | * @category list
|
15980 | * @modifier tappable
|
15981 | * [en]Make the list item change appearance when it's tapped. On iOS it is better to use the "tappable" and "tap-background-color" attribute for better behavior when scrolling.[/en]
|
15982 | * [ja]タップやクリックした時に効果が表示されるようになります。[/ja]
|
15983 | * @modifier chevron
|
15984 | * [en]Display a chevron at the right end of the list item and make it change appearance when tapped.[/en]
|
15985 | * [ja][/ja]
|
15986 | * @modifier longdivider
|
15987 | * [en]Displays a long horizontal divider between items.[/en]
|
15988 | * [ja][/ja]
|
15989 | * @modifier nodivider
|
15990 | * [en]Removes the divider between list items.[/en]
|
15991 | * [ja][/ja]
|
15992 | * @modifier material
|
15993 | * [en]Display a Material Design list item.[/en]
|
15994 | * [ja][/ja]
|
15995 | * @description
|
15996 | * [en]
|
15997 | * Component that represents each item in a list. The list item is composed of four parts that are represented with the `left`, `center`, `right` and `expandable-content` classes. These classes can be used to ensure that the content of the list items is properly aligned.
|
15998 | *
|
15999 | * ```
|
16000 | * <ons-list-item>
|
16001 | * <div class="left">Left</div>
|
16002 | * <div class="center">Center</div>
|
16003 | * <div class="right">Right</div>
|
16004 | * <div class="expandable-content">Expandable content</div>
|
16005 | * </ons-list-item>
|
16006 | * ```
|
16007 | *
|
16008 | * There are also a number of classes (prefixed with `list-item__*`) that help when putting things like icons and thumbnails into the list items.
|
16009 | * [/en]
|
16010 | * [ja][/ja]
|
16011 | * @seealso ons-list
|
16012 | * [en]ons-list component[/en]
|
16013 | * [ja]ons-listコンポーネント[/ja]
|
16014 | * @seealso ons-list-header
|
16015 | * [en]ons-list-header component[/en]
|
16016 | * [ja]ons-list-headerコンポーネント[/ja]
|
16017 | * @codepen yxcCt
|
16018 | * @tutorial vanilla/Reference/list
|
16019 | * @example
|
16020 | * <ons-list-item>
|
16021 | * <div class="left">
|
16022 | * <ons-icon icon="md-face" class="list-item__icon"></ons-icon>
|
16023 | * </div>
|
16024 | * <div class="center">
|
16025 | * <div class="list-item__title">Title</div>
|
16026 | * <div class="list-item__subtitle">Subtitle</div>
|
16027 | * </div>
|
16028 | * <div class="right">
|
16029 | * <ons-switch></ons-switch>
|
16030 | * </div>
|
16031 | * </ons-list-item>
|
16032 | */
|
16033 |
|
16034 | var ListItemElement = /*#__PURE__*/function (_BaseElement) {
|
16035 | _inherits(ListItemElement, _BaseElement);
|
16036 |
|
16037 | var _super = _createSuper(ListItemElement);
|
16038 |
|
16039 | /**
|
16040 | * @attribute modifier
|
16041 | * @type {String}
|
16042 | * @description
|
16043 | * [en]The appearance of the list item.[/en]
|
16044 | * [ja]各要素の表現を指定します。[/ja]
|
16045 | */
|
16046 |
|
16047 | /**
|
16048 | * @attribute lock-on-drag
|
16049 | * @type {Boolean}
|
16050 | * @description
|
16051 | * [en]Prevent vertical scrolling when the user drags horizontally.[/en]
|
16052 | * [ja]この属性があると、ユーザーがこの要素を横方向にドラッグしている時に、縦方向のスクロールが起きないようになります。[/ja]
|
16053 | */
|
16054 |
|
16055 | /**
|
16056 | * @property lockOnDrag
|
16057 | * @type {Boolean}
|
16058 | * @description
|
16059 | * [en]Prevent vertical scrolling when the user drags horizontally.[/en]
|
16060 | * [ja]この属性があると、ユーザーがこの要素を横方向にドラッグしている時に、縦方向のスクロールが起きないようになります。[/ja]
|
16061 | */
|
16062 |
|
16063 | /**
|
16064 | * @attribute tappable
|
16065 | * @type {Boolean}
|
16066 | * @description
|
16067 | * [en]Makes the element react to taps. `prevent-tap` attribute can be added to child elements like buttons or inputs to prevent this effect. `ons-*` elements are ignored by default.[/en]
|
16068 | * [ja][/ja]
|
16069 | */
|
16070 |
|
16071 | /**
|
16072 | * @property tappable
|
16073 | * @type {Boolean}
|
16074 | * @description
|
16075 | * [en]Makes the element react to taps. `prevent-tap` attribute can be added to child elements like buttons or inputs to prevent this effect. `ons-*` elements are ignored by default.[/en]
|
16076 | * [ja][/ja]
|
16077 | */
|
16078 |
|
16079 | /**
|
16080 | * @attribute tap-background-color
|
16081 | * @type {Color}
|
16082 | * @description
|
16083 | * [en] Changes the background color when tapped. For this to work, the attribute "tappable" needs to be set. The default color is "#d9d9d9". It will display as a ripple effect on Android.[/en]
|
16084 | * [ja][/ja]
|
16085 | */
|
16086 |
|
16087 | /**
|
16088 | * @property tapBackgroundColor
|
16089 | * @type {Color}
|
16090 | * @description
|
16091 | * [en] Changes the background color when tapped. For this to work, the attribute "tappable" needs to be set. The default color is "#d9d9d9". It will display as a ripple effect on Android.[/en]
|
16092 | * [ja][/ja]
|
16093 | */
|
16094 |
|
16095 | /**
|
16096 | * @attribute expandable
|
16097 | * @type {Boolean}
|
16098 | * @description
|
16099 | * [en]Makes the element able to be expanded to reveal extra content. For this to work, the expandable content must be defined in `div.expandable-content`.[/en]
|
16100 | * [ja][/ja]
|
16101 | */
|
16102 |
|
16103 | /**
|
16104 | * @property expandable
|
16105 | * @initonly
|
16106 | * @type {Boolean}
|
16107 | * @description
|
16108 | * [en]Makes the element able to be expanded to reveal extra content. For this to work, the expandable content must be defined in `div.expandable-content`.[/en]
|
16109 | * [ja][/ja]
|
16110 | */
|
16111 |
|
16112 | /**
|
16113 | * @attribute expanded
|
16114 | * @type {Boolean}
|
16115 | * @description
|
16116 | * [en]For expandable list items, specifies whether the expandable content is expanded or not.[/en]
|
16117 | * [ja][/ja]
|
16118 | */
|
16119 |
|
16120 | /**
|
16121 | * @property expanded
|
16122 | * @type {Boolean}
|
16123 | * @description
|
16124 | * [en]For expandable list items, specifies whether the expandable content is expanded or not.[/en]
|
16125 | * [ja][/ja]
|
16126 | */
|
16127 |
|
16128 | /**
|
16129 | * @event expand
|
16130 | * @description
|
16131 | * [en]For expandable list items, fires when the list item is expanded or contracted.[/en]
|
16132 | * [ja][/ja]
|
16133 | */
|
16134 |
|
16135 | /**
|
16136 | * @attribute animation
|
16137 | * @type {String}
|
16138 | * @default default
|
16139 | * @description
|
16140 | * [en]The animation used when showing and hiding the expandable content. Can be either `"default"` or `"none"`.[/en]
|
16141 | * [ja][/ja]
|
16142 | */
|
16143 |
|
16144 | /**
|
16145 | * @property animation
|
16146 | * @type {String}
|
16147 | * @default default
|
16148 | * @description
|
16149 | * [en]The animation used when showing and hiding the expandable content. Can be either `"default"` or `"none"`.[/en]
|
16150 | * [ja][/ja]
|
16151 | */
|
16152 | function ListItemElement() {
|
16153 | var _this;
|
16154 |
|
16155 | _classCallCheck(this, ListItemElement);
|
16156 |
|
16157 | _this = _super.call(this);
|
16158 | _this._animatorFactory = _this._updateAnimatorFactory(); // Elements ignored when tapping
|
16159 |
|
16160 | var re = /^ons-(?!col$|row$|if$)/i;
|
16161 |
|
16162 | _this._shouldIgnoreTap = function (e) {
|
16163 | return e.hasAttribute('prevent-tap') || re.test(e.tagName);
|
16164 | }; // show and hide functions for Vue hidable mixin
|
16165 |
|
16166 |
|
16167 | _this.show = _this.showExpansion;
|
16168 | _this.hide = _this.hideExpansion;
|
16169 | contentReady(_assertThisInitialized(_this), function () {
|
16170 | _this._compile();
|
16171 | });
|
16172 | return _this;
|
16173 | }
|
16174 | /**
|
16175 | * Compiles the list item.
|
16176 | *
|
16177 | * Various elements are allowed in the body of a list item:
|
16178 | *
|
16179 | * - div.left, div.right, and div.center are allowed as direct children
|
16180 | * - if div.center is not defined, anything that isn't div.left, div.right or div.expandable-content will be put in a div.center
|
16181 | * - if div.center is defined, anything that isn't div.left, div.right or div.expandable-content will be ignored
|
16182 | * - if list item has expandable attribute:
|
16183 | * - div.expandable-content is allowed as a direct child
|
16184 | * - div.top is allowed as direct child
|
16185 | * - if div.top is defined, anything that isn't div.expandable-content should be inside div.top - anything else will be ignored
|
16186 | * - if div.right is not defined, a div.right will be created with a drop-down chevron
|
16187 | *
|
16188 | * See the tests for examples.
|
16189 | */
|
16190 |
|
16191 |
|
16192 | _createClass(ListItemElement, [{
|
16193 | key: "_compile",
|
16194 | value: function _compile() {
|
16195 | autoStyle.prepare(this);
|
16196 | this.classList.add(defaultClassName$a);
|
16197 | var top, expandableContent;
|
16198 | var topContent = [];
|
16199 | Array.from(this.childNodes).forEach(function (node) {
|
16200 | if (node.nodeType !== Node.ELEMENT_NODE) {
|
16201 | topContent.push(node);
|
16202 | } else if (node.classList.contains('top')) {
|
16203 | top = node;
|
16204 | } else if (node.classList.contains('expandable-content')) {
|
16205 | expandableContent = node;
|
16206 | } else {
|
16207 | topContent.push(node);
|
16208 | }
|
16209 |
|
16210 | if (node.nodeName !== 'ONS-RIPPLE') {
|
16211 | node.remove();
|
16212 | }
|
16213 | });
|
16214 | topContent = top ? Array.from(top.childNodes) : topContent;
|
16215 | var left, right, center;
|
16216 | var centerContent = [];
|
16217 | topContent.forEach(function (node) {
|
16218 | if (node.nodeType !== Node.ELEMENT_NODE) {
|
16219 | centerContent.push(node);
|
16220 | } else if (node.classList.contains('left')) {
|
16221 | left = node;
|
16222 | } else if (node.classList.contains('right')) {
|
16223 | right = node;
|
16224 | } else if (node.classList.contains('center')) {
|
16225 | center = node;
|
16226 | } else {
|
16227 | centerContent.push(node);
|
16228 | }
|
16229 | });
|
16230 |
|
16231 | if (this.hasAttribute('expandable')) {
|
16232 | this.classList.add('list-item--expandable');
|
16233 |
|
16234 | if (!top) {
|
16235 | top = document.createElement('div');
|
16236 | top.classList.add('top');
|
16237 | }
|
16238 |
|
16239 | top.classList.add('list-item__top');
|
16240 | this.appendChild(top);
|
16241 | this._top = top;
|
16242 |
|
16243 | if (expandableContent) {
|
16244 | expandableContent.classList.add('list-item__expandable-content');
|
16245 | this.appendChild(expandableContent);
|
16246 | }
|
16247 |
|
16248 | if (!right) {
|
16249 | right = document.createElement('div');
|
16250 | right.classList.add('list-item__right', 'right'); // We cannot use a pseudo-element for this chevron, as we cannot animate it using
|
16251 | // JS. So, we make a chevron span instead.
|
16252 |
|
16253 | var chevron = document.createElement('span');
|
16254 | chevron.classList.add('list-item__expand-chevron');
|
16255 | right.appendChild(chevron);
|
16256 | } // The case where the list item should already start expanded.
|
16257 | // Adding the class early stops the animation from running at startup.
|
16258 |
|
16259 |
|
16260 | if (this.expanded) {
|
16261 | this.classList.add('list-item--expanded');
|
16262 | }
|
16263 | } else {
|
16264 | top = this;
|
16265 | }
|
16266 |
|
16267 | if (!center) {
|
16268 | center = document.createElement('div');
|
16269 | center.classList.add('center');
|
16270 | centerContent.forEach(function (node) {
|
16271 | return center.appendChild(node);
|
16272 | });
|
16273 | }
|
16274 |
|
16275 | center.classList.add('list-item__center');
|
16276 | top.appendChild(center);
|
16277 |
|
16278 | if (left) {
|
16279 | left.classList.add('list-item__left');
|
16280 | top.appendChild(left);
|
16281 | }
|
16282 |
|
16283 | if (right) {
|
16284 | right.classList.add('list-item__right');
|
16285 | top.appendChild(right);
|
16286 | }
|
16287 |
|
16288 | util$4.updateRipple(this);
|
16289 | ModifierUtil.initModifier(this, scheme$k);
|
16290 | }
|
16291 | /**
|
16292 | * @method showExpansion
|
16293 | * @signature showExpansion()
|
16294 | * @description
|
16295 | * [en]Show the expandable content if the element is expandable.[/en]
|
16296 | * [ja][/ja]
|
16297 | */
|
16298 |
|
16299 | }, {
|
16300 | key: "showExpansion",
|
16301 | value: function showExpansion() {
|
16302 | this.expanded = true;
|
16303 | }
|
16304 | /**
|
16305 | * @method hideExpansion
|
16306 | * @signature hideExpansion()
|
16307 | * @description
|
16308 | * [en]Hide the expandable content if the element expandable.[/en]
|
16309 | * [ja][/ja]
|
16310 | */
|
16311 |
|
16312 | }, {
|
16313 | key: "hideExpansion",
|
16314 | value: function hideExpansion() {
|
16315 | this.expanded = false;
|
16316 | }
|
16317 | }, {
|
16318 | key: "toggleExpansion",
|
16319 | value: function toggleExpansion() {
|
16320 | this.expanded = !this.expanded;
|
16321 | }
|
16322 | }, {
|
16323 | key: "_animateExpansion",
|
16324 | value: function _animateExpansion() {
|
16325 | var _this2 = this;
|
16326 |
|
16327 | // Stops the animation from running in the case where the list item should start already expanded
|
16328 | var expandedAtStartup = this.expanded && this.classList.contains('list-item--expanded');
|
16329 |
|
16330 | if (!this.hasAttribute('expandable') || this._expanding || expandedAtStartup) {
|
16331 | return;
|
16332 | }
|
16333 |
|
16334 | this._expanding = true;
|
16335 |
|
16336 | var expandedCallback = function expandedCallback() {
|
16337 | _this2._expanding = false;
|
16338 |
|
16339 | if (_this2.expanded) {
|
16340 | _this2.classList.add('list-item--expanded');
|
16341 | } else {
|
16342 | _this2.classList.remove('list-item--expanded');
|
16343 | }
|
16344 | };
|
16345 |
|
16346 | var animator = this._animatorFactory.newAnimator();
|
16347 |
|
16348 | if (animator._animateExpansion) {
|
16349 | animator._animateExpansion(this, this.expanded, expandedCallback);
|
16350 | } else {
|
16351 | expandedCallback();
|
16352 | }
|
16353 | }
|
16354 | }, {
|
16355 | key: "_updateAnimatorFactory",
|
16356 | value: function _updateAnimatorFactory() {
|
16357 | return new AnimatorFactory({
|
16358 | animators: _animatorDict$5,
|
16359 | baseClass: ListItemAnimator,
|
16360 | baseClassName: 'ListItemAnimator',
|
16361 | defaultAnimation: this.getAttribute('animation') || 'default'
|
16362 | });
|
16363 | }
|
16364 | }, {
|
16365 | key: "expandableContent",
|
16366 | get: function get() {
|
16367 | return this.querySelector('.list-item__expandable-content');
|
16368 | }
|
16369 | }, {
|
16370 | key: "expandChevron",
|
16371 | get: function get() {
|
16372 | return this.querySelector('.list-item__expand-chevron');
|
16373 | }
|
16374 | }, {
|
16375 | key: "attributeChangedCallback",
|
16376 | value: function attributeChangedCallback(name, last, current) {
|
16377 | var _this3 = this;
|
16378 |
|
16379 | switch (name) {
|
16380 | case 'class':
|
16381 | util$4.restoreClass(this, defaultClassName$a, scheme$k);
|
16382 | break;
|
16383 |
|
16384 | case 'modifier':
|
16385 | ModifierUtil.onModifierChanged(last, current, this, scheme$k);
|
16386 | break;
|
16387 |
|
16388 | case 'ripple':
|
16389 | util$4.updateRipple(this);
|
16390 | break;
|
16391 |
|
16392 | case 'animation':
|
16393 | this._animatorFactory = this._updateAnimatorFactory();
|
16394 | break;
|
16395 |
|
16396 | case 'expanded':
|
16397 | contentReady(this, function () {
|
16398 | return _this3._animateExpansion();
|
16399 | });
|
16400 | break;
|
16401 | }
|
16402 | }
|
16403 | }, {
|
16404 | key: "connectedCallback",
|
16405 | value: function connectedCallback() {
|
16406 | var _this4 = this;
|
16407 |
|
16408 | contentReady(this, function () {
|
16409 | _this4._setupListeners(true);
|
16410 |
|
16411 | _this4._originalBackgroundColor = _this4.style.backgroundColor;
|
16412 | _this4.tapped = false;
|
16413 | });
|
16414 | }
|
16415 | }, {
|
16416 | key: "disconnectedCallback",
|
16417 | value: function disconnectedCallback() {
|
16418 | this._setupListeners(false);
|
16419 | }
|
16420 | }, {
|
16421 | key: "_setupListeners",
|
16422 | value: function _setupListeners(add) {
|
16423 | var action = (add ? 'add' : 'remove') + 'EventListener';
|
16424 | util$4[action](this, 'touchstart', this._onTouch, {
|
16425 | passive: true
|
16426 | });
|
16427 | util$4[action](this, 'touchmove', this._onRelease, {
|
16428 | passive: true
|
16429 | });
|
16430 | this[action]('touchcancel', this._onRelease);
|
16431 | this[action]('touchend', this._onRelease);
|
16432 | this[action]('touchleave', this._onRelease);
|
16433 | this[action]('drag', this._onDrag);
|
16434 | this[action]('mousedown', this._onTouch);
|
16435 | this[action]('mouseup', this._onRelease);
|
16436 | this[action]('mouseout', this._onRelease);
|
16437 |
|
16438 | if (this._top) {
|
16439 | this._top[action]('click', this._onClickTop.bind(this));
|
16440 | }
|
16441 | }
|
16442 | }, {
|
16443 | key: "_onClickTop",
|
16444 | value: function _onClickTop() {
|
16445 | if (!this._expanding) {
|
16446 | this.toggleExpansion();
|
16447 | this.dispatchEvent(new Event('expand'));
|
16448 | this.dispatchEvent(new Event('expansion')); // expansion is deprecated but emit to avoid breaking user code
|
16449 | }
|
16450 | }
|
16451 | }, {
|
16452 | key: "_onDrag",
|
16453 | value: function _onDrag(event) {
|
16454 | var gesture = event.gesture; // Prevent vertical scrolling if the users pans left or right.
|
16455 |
|
16456 | if (this.hasAttribute('lock-on-drag') && ['left', 'right'].indexOf(gesture.direction) > -1) {
|
16457 | gesture.preventDefault();
|
16458 | }
|
16459 | }
|
16460 | }, {
|
16461 | key: "_onTouch",
|
16462 | value: function _onTouch(e) {
|
16463 | var _this5 = this;
|
16464 |
|
16465 | if (this.tapped || this !== e.target && (this._shouldIgnoreTap(e.target) || util$4.findParent(e.target, this._shouldIgnoreTap, function (p) {
|
16466 | return p === _this5;
|
16467 | }))) {
|
16468 | return; // Ignore tap
|
16469 | }
|
16470 |
|
16471 | this.tapped = true;
|
16472 | var touchStyle = {
|
16473 | transition: 'background-color 0.0s linear 0.02s, box-shadow 0.0s linear 0.02s'
|
16474 | };
|
16475 |
|
16476 | if (this.hasAttribute('tappable')) {
|
16477 | if (this.style.backgroundColor) {
|
16478 | this._originalBackgroundColor = this.style.backgroundColor;
|
16479 | }
|
16480 |
|
16481 | touchStyle.backgroundColor = this.getAttribute('tap-background-color') || '#d9d9d9';
|
16482 | touchStyle.boxShadow = "0px -1px 0px 0px ".concat(touchStyle.backgroundColor);
|
16483 | }
|
16484 |
|
16485 | styler(this, touchStyle);
|
16486 | }
|
16487 | }, {
|
16488 | key: "_onRelease",
|
16489 | value: function _onRelease() {
|
16490 | this.tapped = false;
|
16491 | this.style.backgroundColor = this._originalBackgroundColor || '';
|
16492 | styler.clear(this, 'transition boxShadow');
|
16493 | }
|
16494 | }], [{
|
16495 | key: "observedAttributes",
|
16496 | get: function get() {
|
16497 | return ['modifier', 'class', 'ripple', 'animation', 'expanded'];
|
16498 | }
|
16499 | }]);
|
16500 |
|
16501 | return ListItemElement;
|
16502 | }(BaseElement);
|
16503 | util$4.defineBooleanProperties(ListItemElement, ['expanded', 'expandable', 'tappable', 'lock-on-drag']);
|
16504 | util$4.defineStringProperties(ListItemElement, ['animation', 'tap-background-color']);
|
16505 | onsElements.ListItem = ListItemElement;
|
16506 | customElements.define('ons-list-item', ListItemElement);
|
16507 |
|
16508 | var defaultClassName$9 = 'list';
|
16509 | var scheme$j = {
|
16510 | '': 'list--*'
|
16511 | };
|
16512 | /**
|
16513 | * @element ons-list
|
16514 | * @category list
|
16515 | * @modifier inset
|
16516 | * [en]Inset list that doesn't cover the whole width of the parent.[/en]
|
16517 | * [ja]親要素の画面いっぱいに広がらないリストを表示します。[/ja]
|
16518 | * @modifier noborder
|
16519 | * [en]A list with no borders at the top and bottom.[/en]
|
16520 | * [ja]リストの上下のボーダーが無いリストを表示します。[/ja]
|
16521 | * @description
|
16522 | * [en]Component to define a list, and the container for ons-list-item(s).[/en]
|
16523 | * [ja]リストを表現するためのコンポーネント。ons-list-itemのコンテナとして使用します。[/ja]
|
16524 | * @seealso ons-list-item
|
16525 | * [en]ons-list-item component[/en]
|
16526 | * [ja]ons-list-itemコンポーネント[/ja]
|
16527 | * @seealso ons-list-header
|
16528 | * [en]ons-list-header component[/en]
|
16529 | * [ja]ons-list-headerコンポーネント[/ja]
|
16530 | * @seealso ons-lazy-repeat
|
16531 | * [en]ons-lazy-repeat component[/en]
|
16532 | * [ja]ons-lazy-repeatコンポーネント[/ja]
|
16533 | * @codepen yxcCt
|
16534 | * @tutorial vanilla/Reference/list
|
16535 | * @example
|
16536 | * <ons-list>
|
16537 | * <ons-list-header>Header Text</ons-list-header>
|
16538 | * <ons-list-item>Item</ons-list-item>
|
16539 | * <ons-list-item>Item</ons-list-item>
|
16540 | * </ons-list>
|
16541 | */
|
16542 |
|
16543 | var ListElement = /*#__PURE__*/function (_BaseElement) {
|
16544 | _inherits(ListElement, _BaseElement);
|
16545 |
|
16546 | var _super = _createSuper(ListElement);
|
16547 |
|
16548 | /**
|
16549 | * @attribute modifier
|
16550 | * @type {String}
|
16551 | * @description
|
16552 | * [en]The appearance of the list.[/en]
|
16553 | * [ja]リストの表現を指定します。[/ja]
|
16554 | */
|
16555 | function ListElement() {
|
16556 | var _this;
|
16557 |
|
16558 | _classCallCheck(this, ListElement);
|
16559 |
|
16560 | _this = _super.call(this);
|
16561 |
|
16562 | _this._compile();
|
16563 |
|
16564 | return _this;
|
16565 | }
|
16566 |
|
16567 | _createClass(ListElement, [{
|
16568 | key: "_compile",
|
16569 | value: function _compile() {
|
16570 | autoStyle.prepare(this);
|
16571 | this.classList.add(defaultClassName$9);
|
16572 | ModifierUtil.initModifier(this, scheme$j);
|
16573 | }
|
16574 | }, {
|
16575 | key: "attributeChangedCallback",
|
16576 | value: function attributeChangedCallback(name, last, current) {
|
16577 | switch (name) {
|
16578 | case 'class':
|
16579 | util$4.restoreClass(this, defaultClassName$9, scheme$j);
|
16580 | break;
|
16581 |
|
16582 | case 'modifier':
|
16583 | ModifierUtil.onModifierChanged(last, current, this, scheme$j);
|
16584 | break;
|
16585 | }
|
16586 | }
|
16587 | }], [{
|
16588 | key: "observedAttributes",
|
16589 | get: function get() {
|
16590 | return ['modifier', 'class'];
|
16591 | }
|
16592 | }]);
|
16593 |
|
16594 | return ListElement;
|
16595 | }(BaseElement);
|
16596 | onsElements.List = ListElement;
|
16597 | customElements.define('ons-list', ListElement);
|
16598 |
|
16599 | var INPUT_ATTRIBUTES$1 = ['autocapitalize', 'autocomplete', 'autocorrect', 'autofocus', 'disabled', 'inputmode', 'max', 'maxlength', 'min', 'minlength', 'name', 'pattern', 'placeholder', 'readonly', 'required', 'size', 'spellcheck', 'step', 'validator', 'value'];
|
16600 |
|
16601 | var BaseInputElement = /*#__PURE__*/function (_BaseElement) {
|
16602 | _inherits(BaseInputElement, _BaseElement);
|
16603 |
|
16604 | var _super = _createSuper(BaseInputElement);
|
16605 |
|
16606 | function BaseInputElement() {
|
16607 | var _this;
|
16608 |
|
16609 | _classCallCheck(this, BaseInputElement);
|
16610 |
|
16611 | _this = _super.call(this);
|
16612 |
|
16613 | if (_this.constructor === BaseInputElement) {
|
16614 | util$4.throwAbstract();
|
16615 | }
|
16616 |
|
16617 | contentReady(_assertThisInitialized(_this), function () {
|
16618 | return _this._compile();
|
16619 | });
|
16620 | _this._boundDelegateEvent = _this._delegateEvent.bind(_assertThisInitialized(_this));
|
16621 | return _this;
|
16622 | }
|
16623 |
|
16624 | _createClass(BaseInputElement, [{
|
16625 | key: "_update",
|
16626 | value: function _update() {} // Optionally implemented
|
16627 |
|
16628 | }, {
|
16629 | key: "_scheme",
|
16630 | get: function get() {
|
16631 | // eslint-disable-line getter-return
|
16632 | util$4.throwMember();
|
16633 | }
|
16634 | }, {
|
16635 | key: "_template",
|
16636 | get: function get() {
|
16637 | // eslint-disable-line getter-return
|
16638 | util$4.throwMember();
|
16639 | }
|
16640 | }, {
|
16641 | key: "type",
|
16642 | get: function get() {
|
16643 | // eslint-disable-line getter-return
|
16644 | util$4.throwMember();
|
16645 | }
|
16646 | }, {
|
16647 | key: "_compile",
|
16648 | value: function _compile() {
|
16649 | autoStyle.prepare(this);
|
16650 | this._defaultClassName && this.classList.add(this._defaultClassName);
|
16651 |
|
16652 | if (this.children.length !== 0) {
|
16653 | return;
|
16654 | }
|
16655 |
|
16656 | this.appendChild(util$4.createFragment(this._template));
|
16657 |
|
16658 | this._setInputId();
|
16659 |
|
16660 | this._updateBoundAttributes();
|
16661 |
|
16662 | ModifierUtil.initModifier(this, this._scheme);
|
16663 | }
|
16664 | }, {
|
16665 | key: "_updateBoundAttributes",
|
16666 | value: function _updateBoundAttributes() {
|
16667 | var _this2 = this;
|
16668 |
|
16669 | INPUT_ATTRIBUTES$1.forEach(function (attr) {
|
16670 | if (_this2.hasAttribute(attr)) {
|
16671 | _this2._input.setAttribute(attr, _this2.getAttribute(attr));
|
16672 | } else {
|
16673 | _this2._input.removeAttribute(attr);
|
16674 | }
|
16675 | });
|
16676 |
|
16677 | this._update();
|
16678 | }
|
16679 | }, {
|
16680 | key: "_delegateEvent",
|
16681 | value: function _delegateEvent(event) {
|
16682 | var e = new CustomEvent(event.type, {
|
16683 | bubbles: false,
|
16684 | cancelable: true
|
16685 | });
|
16686 | return this.dispatchEvent(e);
|
16687 | }
|
16688 | }, {
|
16689 | key: "_setInputId",
|
16690 | value: function _setInputId() {
|
16691 | if (this.hasAttribute('input-id')) {
|
16692 | this._input.id = this.getAttribute('input-id');
|
16693 | }
|
16694 | }
|
16695 | }, {
|
16696 | key: "_defaultClassName",
|
16697 | get: function get() {
|
16698 | return '';
|
16699 | }
|
16700 | }, {
|
16701 | key: "_input",
|
16702 | get: function get() {
|
16703 | return this.querySelector('input');
|
16704 | }
|
16705 | }, {
|
16706 | key: "value",
|
16707 | get: function get() {
|
16708 | return this._input === null ? this.getAttribute('value') : this._input.value;
|
16709 | },
|
16710 | set: function set(val) {
|
16711 | var _this3 = this;
|
16712 |
|
16713 | contentReady(this, function () {
|
16714 | if (val instanceof Date) {
|
16715 | val = val.toISOString().substring(0, 10);
|
16716 | }
|
16717 |
|
16718 | _this3._input.value = val;
|
16719 |
|
16720 | _this3._update();
|
16721 | });
|
16722 | }
|
16723 | }, {
|
16724 | key: "connectedCallback",
|
16725 | value: function connectedCallback() {
|
16726 | var _this4 = this;
|
16727 |
|
16728 | contentReady(this, function () {
|
16729 | _this4._input.addEventListener('focus', _this4._boundDelegateEvent);
|
16730 |
|
16731 | _this4._input.addEventListener('blur', _this4._boundDelegateEvent);
|
16732 | });
|
16733 | }
|
16734 | }, {
|
16735 | key: "disconnectedCallback",
|
16736 | value: function disconnectedCallback() {
|
16737 | var _this5 = this;
|
16738 |
|
16739 | contentReady(this, function () {
|
16740 | _this5._input.removeEventListener('focus', _this5._boundDelegateEvent);
|
16741 |
|
16742 | _this5._input.removeEventListener('blur', _this5._boundDelegateEvent);
|
16743 | });
|
16744 | }
|
16745 | }, {
|
16746 | key: "attributeChangedCallback",
|
16747 | value: function attributeChangedCallback(name, last, current) {
|
16748 | var _this6 = this;
|
16749 |
|
16750 | switch (name) {
|
16751 | case 'modifier':
|
16752 | contentReady(this, function () {
|
16753 | return ModifierUtil.onModifierChanged(last, current, _this6, _this6._scheme);
|
16754 | });
|
16755 | break;
|
16756 |
|
16757 | case 'input-id':
|
16758 | contentReady(this, function () {
|
16759 | return _this6._setInputId();
|
16760 | });
|
16761 | break;
|
16762 |
|
16763 | case 'class':
|
16764 | util$4.restoreClass(this, this._defaultClassName, this._scheme);
|
16765 | break;
|
16766 | }
|
16767 |
|
16768 | if (INPUT_ATTRIBUTES$1.indexOf(name) >= 0) {
|
16769 | contentReady(this, function () {
|
16770 | return _this6._updateBoundAttributes();
|
16771 | });
|
16772 | }
|
16773 | }
|
16774 | }, {
|
16775 | key: "blur",
|
16776 | value: function blur() {
|
16777 | this._input.blur();
|
16778 | }
|
16779 | }, {
|
16780 | key: "focus",
|
16781 | value: function focus() {
|
16782 | this._input.focus();
|
16783 | }
|
16784 | }], [{
|
16785 | key: "observedAttributes",
|
16786 | get: function get() {
|
16787 | return ['modifier', 'input-id', 'class'].concat(INPUT_ATTRIBUTES$1);
|
16788 | }
|
16789 | }]);
|
16790 |
|
16791 | return BaseInputElement;
|
16792 | }(BaseElement);
|
16793 | util$4.defineBooleanProperties(BaseInputElement, ['disabled']);
|
16794 |
|
16795 | var scheme$i = {
|
16796 | '.text-input': 'text-input--*',
|
16797 | '.text-input__label': 'text-input--*__label'
|
16798 | };
|
16799 | /**
|
16800 | * @element ons-input
|
16801 | * @category form
|
16802 | * @modifier material
|
16803 | * [en]Displays a Material Design input.[/en]
|
16804 | * [ja][/ja]
|
16805 | * @modifier underbar
|
16806 | * [en]Displays a horizontal line underneath a text input.[/en]
|
16807 | * [ja][/ja]
|
16808 | * @modifier transparent
|
16809 | * [en]Displays a transparent input. Works for Material Design.[/en]
|
16810 | * [ja][/ja]
|
16811 | * @description
|
16812 | * [en]
|
16813 | * An input element. The `type` attribute can be used to change the input type. All text input types are supported.
|
16814 | *
|
16815 | * The component will automatically render as a Material Design input on Android devices.
|
16816 | *
|
16817 | * Most attributes that can be used for a normal `<input>` element can also be used on the `<ons-input>` element.
|
16818 | * [/en]
|
16819 | * [ja][/ja]
|
16820 | * @tutorial vanilla/Reference/input
|
16821 | * @seealso ons-checkbox
|
16822 | * [en]The `<ons-checkbox>` element is used to display a checkbox.[/en]
|
16823 | * [ja][/ja]
|
16824 | * @seealso ons-radio
|
16825 | * [en]The `<ons-radio>` element is used to display a radio button.[/en]
|
16826 | * [ja][/ja]
|
16827 | * @seealso ons-range
|
16828 | * [en]The `<ons-range>` element is used to display a range slider.[/en]
|
16829 | * [ja][/ja]
|
16830 | * @seealso ons-switch
|
16831 | * [en]The `<ons-switch>` element is used to display a draggable toggle switch.[/en]
|
16832 | * [ja][/ja]
|
16833 | * @seealso ons-select
|
16834 | * [en]The `<ons-select>` element is used to display a select box.[/en]
|
16835 | * [ja][/ja]
|
16836 | * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
|
16837 | * @example
|
16838 | * <ons-input placeholder="Username" float></ons-input>
|
16839 | */
|
16840 |
|
16841 | var InputElement = /*#__PURE__*/function (_BaseInputElement) {
|
16842 | _inherits(InputElement, _BaseInputElement);
|
16843 |
|
16844 | var _super = _createSuper(InputElement);
|
16845 |
|
16846 | function InputElement() {
|
16847 | var _this;
|
16848 |
|
16849 | _classCallCheck(this, InputElement);
|
16850 |
|
16851 | _this = _super.call(this);
|
16852 | _this._boundOnInput = _this._update.bind(_assertThisInitialized(_this));
|
16853 | _this._boundOnFocusin = _this._update.bind(_assertThisInitialized(_this));
|
16854 | return _this;
|
16855 | }
|
16856 | /* Inherited props */
|
16857 |
|
16858 |
|
16859 | _createClass(InputElement, [{
|
16860 | key: "_update",
|
16861 | value: function _update() {
|
16862 | this._updateLabel();
|
16863 |
|
16864 | this._updateLabelClass();
|
16865 | }
|
16866 | }, {
|
16867 | key: "_scheme",
|
16868 | get: function get() {
|
16869 | return scheme$i;
|
16870 | }
|
16871 | }, {
|
16872 | key: "_template",
|
16873 | get: function get() {
|
16874 | return "\n <input type=\"".concat(this.type, "\" class=\"text-input\">\n <span class=\"text-input__label\"></span>\n ");
|
16875 | }
|
16876 | }, {
|
16877 | key: "type",
|
16878 | get: function get() {
|
16879 | var type = this.getAttribute('type');
|
16880 | return ['checkbox', 'radio'].indexOf(type) < 0 && type || 'text';
|
16881 | },
|
16882 | set: function set(value) {
|
16883 | this.setAttribute('type', value);
|
16884 | }
|
16885 | /* Own props */
|
16886 |
|
16887 | }, {
|
16888 | key: "_updateLabel",
|
16889 | value: function _updateLabel() {
|
16890 | var label = this.getAttribute('placeholder') || '';
|
16891 |
|
16892 | if (typeof this._helper.textContent !== 'undefined') {
|
16893 | this._helper.textContent = label;
|
16894 | } else {
|
16895 | this._helper.innerText = label;
|
16896 | }
|
16897 | }
|
16898 | }, {
|
16899 | key: "_updateLabelClass",
|
16900 | value: function _updateLabelClass() {
|
16901 | if (this.value === '') {
|
16902 | this._helper.classList.remove('text-input--material__label--active');
|
16903 | } else {
|
16904 | this._helper.classList.add('text-input--material__label--active');
|
16905 | }
|
16906 | }
|
16907 | }, {
|
16908 | key: "_helper",
|
16909 | get: function get() {
|
16910 | return this.querySelector('span');
|
16911 | }
|
16912 | }, {
|
16913 | key: "connectedCallback",
|
16914 | value: function connectedCallback() {
|
16915 | var _this2 = this;
|
16916 |
|
16917 | _get(_getPrototypeOf(InputElement.prototype), "connectedCallback", this).call(this);
|
16918 |
|
16919 | contentReady(this, function () {
|
16920 | _this2._input.addEventListener('input', _this2._boundOnInput);
|
16921 |
|
16922 | _this2._input.addEventListener('focusin', _this2._boundOnFocusin);
|
16923 | });
|
16924 | var type = this.getAttribute('type');
|
16925 |
|
16926 | if (['checkbox', 'radio'].indexOf(type) >= 0) {
|
16927 | util$4.warn("Warn: <ons-input type=\"".concat(type, "\"> is deprecated since v2.4.0. Use <ons-").concat(type, "> instead."));
|
16928 | }
|
16929 | }
|
16930 | }, {
|
16931 | key: "disconnectedCallback",
|
16932 | value: function disconnectedCallback() {
|
16933 | var _this3 = this;
|
16934 |
|
16935 | _get(_getPrototypeOf(InputElement.prototype), "disconnectedCallback", this).call(this);
|
16936 |
|
16937 | contentReady(this, function () {
|
16938 | _this3._input.removeEventListener('input', _this3._boundOnInput);
|
16939 |
|
16940 | _this3._input.removeEventListener('focusin', _this3._boundOnFocusin);
|
16941 | });
|
16942 | }
|
16943 | }, {
|
16944 | key: "attributeChangedCallback",
|
16945 | value: function attributeChangedCallback(name, last, current) {
|
16946 | var _this4 = this;
|
16947 |
|
16948 | switch (name) {
|
16949 | case 'type':
|
16950 | contentReady(this, function () {
|
16951 | return _this4._input.setAttribute('type', _this4.type);
|
16952 | });
|
16953 | break;
|
16954 |
|
16955 | default:
|
16956 | _get(_getPrototypeOf(InputElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
|
16957 |
|
16958 | }
|
16959 | }
|
16960 | /**
|
16961 | * @attribute placeholder
|
16962 | * @type {String}
|
16963 | * @description
|
16964 | * [en]Placeholder text. In Material Design, this placeholder will be a floating label.[/en]
|
16965 | * [ja][/ja]
|
16966 | */
|
16967 |
|
16968 | /**
|
16969 | * @attribute float
|
16970 | * @description
|
16971 | * [en]If this attribute is present, the placeholder will be animated in Material Design.[/en]
|
16972 | * [ja]この属性が設定された時、ラベルはアニメーションするようになります。[/ja]
|
16973 | */
|
16974 |
|
16975 | /**
|
16976 | * @property float
|
16977 | * @type {Boolean}
|
16978 | * @description
|
16979 | * [en]If this property is present, the placeholder will be animated in Material Design.[/en]
|
16980 | * [ja]この属性が設定された時、ラベルはアニメーションするようになります。[/ja]
|
16981 | */
|
16982 |
|
16983 | /**
|
16984 | * @attribute type
|
16985 | * @type {String}
|
16986 | * @description
|
16987 | * [en]
|
16988 | * Specify the input type. This is the same as the "type" attribute for normal inputs. It expects strict text types such as `text`, `password`, etc. For checkbox, radio button, select or range, please have a look at the corresponding elements.
|
16989 | *
|
16990 | * Please take a look at [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-type) for an exhaustive list of possible values. Depending on the platform and browser version some of these might not work.
|
16991 | * [/en]
|
16992 | * [ja][/ja]
|
16993 | */
|
16994 |
|
16995 | /**
|
16996 | * @attribute input-id
|
16997 | * @type {String}
|
16998 | * @description
|
16999 | * [en]Specify the "id" attribute of the inner `<input>` element. This is useful when using `<label for="...">` elements.[/en]
|
17000 | * [ja][/ja]
|
17001 | */
|
17002 |
|
17003 | /**
|
17004 | * @property value
|
17005 | * @type {String}
|
17006 | * @description
|
17007 | * [en]The current value of the input.[/en]
|
17008 | * [ja][/ja]
|
17009 | */
|
17010 |
|
17011 | /**
|
17012 | * @property disabled
|
17013 | * @type {Boolean}
|
17014 | * @description
|
17015 | * [en]Whether the input is disabled or not.[/en]
|
17016 | * [ja]無効化されている場合に`true`。[/ja]
|
17017 | */
|
17018 |
|
17019 | /**
|
17020 | * @method focus
|
17021 | * @signature focus()
|
17022 | * @description
|
17023 | * [en]Focuses the input.[/en]
|
17024 | * [ja][/ja]
|
17025 | */
|
17026 |
|
17027 | /**
|
17028 | * @method blur
|
17029 | * @signature blur()
|
17030 | * @description
|
17031 | * [en]Removes focus from the input.[/en]
|
17032 | * [ja][/ja]
|
17033 | */
|
17034 |
|
17035 | }], [{
|
17036 | key: "observedAttributes",
|
17037 | get: function get() {
|
17038 | return [].concat(_toConsumableArray(_get(_getPrototypeOf(InputElement), "observedAttributes", this)), ['type']);
|
17039 | }
|
17040 | }]);
|
17041 |
|
17042 | return InputElement;
|
17043 | }(BaseInputElement);
|
17044 | util$4.defineBooleanProperties(InputElement, ['float']);
|
17045 | onsElements.Input = InputElement;
|
17046 | customElements.define('ons-input', InputElement);
|
17047 |
|
17048 | var BaseCheckboxElement = /*#__PURE__*/function (_BaseInputElement) {
|
17049 | _inherits(BaseCheckboxElement, _BaseInputElement);
|
17050 |
|
17051 | var _super = _createSuper(BaseCheckboxElement);
|
17052 |
|
17053 | function BaseCheckboxElement() {
|
17054 | var _this;
|
17055 |
|
17056 | _classCallCheck(this, BaseCheckboxElement);
|
17057 |
|
17058 | _this = _super.call(this);
|
17059 |
|
17060 | if (_this.constructor === BaseCheckboxElement) {
|
17061 | util.throwAbstract();
|
17062 | }
|
17063 |
|
17064 | contentReady(_assertThisInitialized(_this), function () {
|
17065 | _this.attributeChangedCallback('checked', null, _this.getAttribute('checked'));
|
17066 | });
|
17067 | return _this;
|
17068 | }
|
17069 | /* Inherited props */
|
17070 |
|
17071 |
|
17072 | _createClass(BaseCheckboxElement, [{
|
17073 | key: "_template",
|
17074 | get: function get() {
|
17075 | return "\n <input type=\"".concat(this.type, "\" class=\"").concat(this._defaultClassName, "__input\">\n <span class=\"").concat(this._defaultClassName, "__checkmark\"></span>\n ");
|
17076 | }
|
17077 | /* Own props */
|
17078 |
|
17079 | }, {
|
17080 | key: "_helper",
|
17081 | get: function get() {
|
17082 | return this.querySelector('span');
|
17083 | }
|
17084 | }, {
|
17085 | key: "checked",
|
17086 | get: function get() {
|
17087 | return this._input.checked;
|
17088 | },
|
17089 | set: function set(val) {
|
17090 | var _this2 = this;
|
17091 |
|
17092 | contentReady(this, function () {
|
17093 | _this2._input.checked = val;
|
17094 | });
|
17095 | }
|
17096 | }, {
|
17097 | key: "attributeChangedCallback",
|
17098 | value: function attributeChangedCallback(name, last, current) {
|
17099 | switch (name) {
|
17100 | case 'checked':
|
17101 | this.checked = current !== null;
|
17102 | break;
|
17103 |
|
17104 | default:
|
17105 | _get(_getPrototypeOf(BaseCheckboxElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
|
17106 |
|
17107 | }
|
17108 | }
|
17109 | }], [{
|
17110 | key: "observedAttributes",
|
17111 | get: function get() {
|
17112 | return [].concat(_toConsumableArray(_get(_getPrototypeOf(BaseCheckboxElement), "observedAttributes", this)), ['checked']);
|
17113 | }
|
17114 | }]);
|
17115 |
|
17116 | return BaseCheckboxElement;
|
17117 | }(BaseInputElement);
|
17118 |
|
17119 | var scheme$h = {
|
17120 | '.checkbox': 'checkbox--*',
|
17121 | '.checkbox__input': 'checkbox--*__input',
|
17122 | '.checkbox__checkmark': 'checkbox--*__checkmark'
|
17123 | };
|
17124 | /**
|
17125 | * @element ons-checkbox
|
17126 | * @category form
|
17127 | * @modifier material
|
17128 | * [en]Displays a Material Design checkbox.[/en]
|
17129 | * [ja][/ja]
|
17130 | * @modifier noborder
|
17131 | * [en]iOS borderless checkbox.[/en]
|
17132 | * [ja][/ja]
|
17133 | * @description
|
17134 | * [en]
|
17135 | * A checkbox element. The component will automatically render as a Material Design checkbox on Android devices.
|
17136 | *
|
17137 | * Most attributes that can be used for a normal `<input type="checkbox">` element can also be used on the `<ons-checkbox>` element.
|
17138 | * [/en]
|
17139 | * [ja][/ja]
|
17140 | * @tutorial vanilla/Reference/checkbox
|
17141 | * @seealso ons-switch
|
17142 | * [en]The `<ons-switch>` element is used to display a draggable toggle switch.[/en]
|
17143 | * [ja][/ja]
|
17144 | * @seealso ons-radio
|
17145 | * [en]The `<ons-radio>` element is used to display a radio button.[/en]
|
17146 | * [ja][/ja]
|
17147 | * @seealso ons-input
|
17148 | * [en]The `<ons-input>` element is used to display a text input.[/en]
|
17149 | * [ja][/ja]
|
17150 | * @seealso ons-search-input
|
17151 | * [en]The `<ons-search-input>` element is used to display a search input.[/en]
|
17152 | * [ja][/ja]
|
17153 | * @seealso ons-range
|
17154 | * [en]The `<ons-range>` element is used to display a range slider.[/en]
|
17155 | * [ja][/ja]
|
17156 | * @seealso ons-select
|
17157 | * [en]The `<ons-select>` element is used to display a select box.[/en]
|
17158 | * [ja][/ja]
|
17159 | * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
|
17160 | * @example
|
17161 | * <ons-checkbox checked></ons-checkbox>
|
17162 | */
|
17163 |
|
17164 | var CheckboxElement = /*#__PURE__*/function (_BaseCheckboxElement) {
|
17165 | _inherits(CheckboxElement, _BaseCheckboxElement);
|
17166 |
|
17167 | var _super = _createSuper(CheckboxElement);
|
17168 |
|
17169 | function CheckboxElement() {
|
17170 | _classCallCheck(this, CheckboxElement);
|
17171 |
|
17172 | return _super.apply(this, arguments);
|
17173 | }
|
17174 |
|
17175 | _createClass(CheckboxElement, [{
|
17176 | key: "_scheme",
|
17177 | get: function get() {
|
17178 | return scheme$h;
|
17179 | }
|
17180 | }, {
|
17181 | key: "_defaultClassName",
|
17182 | get: function get() {
|
17183 | return 'checkbox';
|
17184 | }
|
17185 | }, {
|
17186 | key: "type",
|
17187 | get: function get() {
|
17188 | return 'checkbox';
|
17189 | }
|
17190 | /**
|
17191 | * @attribute input-id
|
17192 | * @type {String}
|
17193 | * @description
|
17194 | * [en]Specify the "id" attribute of the inner `<input>` element. This is useful when using `<label for="...">` elements.[/en]
|
17195 | * [ja][/ja]
|
17196 | */
|
17197 |
|
17198 | /**
|
17199 | * @property value
|
17200 | * @type {String}
|
17201 | * @description
|
17202 | * [en]The current value of the checkbox.[/en]
|
17203 | * [ja][/ja]
|
17204 | */
|
17205 |
|
17206 | /**
|
17207 | * @property checked
|
17208 | * @type {Boolean}
|
17209 | * @description
|
17210 | * [en]Whether the checkbox is checked or not.[/en]
|
17211 | * [ja][/ja]
|
17212 | */
|
17213 |
|
17214 | /**
|
17215 | * @property disabled
|
17216 | * @type {Boolean}
|
17217 | * @description
|
17218 | * [en]Whether the checkbox is disabled or not.[/en]
|
17219 | * [ja]無効化されている場合に`true`。[/ja]
|
17220 | */
|
17221 |
|
17222 | /**
|
17223 | * @method focus
|
17224 | * @signature focus()
|
17225 | * @description
|
17226 | * [en]Focuses the checkbox.[/en]
|
17227 | * [ja][/ja]
|
17228 | */
|
17229 |
|
17230 | /**
|
17231 | * @method blur
|
17232 | * @signature blur()
|
17233 | * @description
|
17234 | * [en]Removes focus from the checkbox.[/en]
|
17235 | * [ja][/ja]
|
17236 | */
|
17237 |
|
17238 | }]);
|
17239 |
|
17240 | return CheckboxElement;
|
17241 | }(BaseCheckboxElement);
|
17242 | onsElements.Checkbox = CheckboxElement;
|
17243 | customElements.define('ons-checkbox', CheckboxElement);
|
17244 |
|
17245 | var scheme$g = {
|
17246 | '.radio-button': 'radio-button--*',
|
17247 | '.radio-button__input': 'radio-button--*__input',
|
17248 | '.radio-button__checkmark': 'radio-button--*__checkmark'
|
17249 | };
|
17250 | /**
|
17251 | * @element ons-radio
|
17252 | * @category form
|
17253 | * @modifier material
|
17254 | * [en]Displays a Material Design radio button.[/en]
|
17255 | * [ja][/ja]
|
17256 | * @description
|
17257 | * [en]
|
17258 | * A radio button element. The component will automatically render as a Material Design radio button on Android devices.
|
17259 | *
|
17260 | * Most attributes that can be used for a normal `<input type="radio">` element can also be used on the `<ons-radio>` element.
|
17261 | * [/en]
|
17262 | * [ja][/ja]
|
17263 | * @tutorial vanilla/Reference/radio
|
17264 | * @seealso ons-select
|
17265 | * [en]The `<ons-select>` element is used to display a select box.[/en]
|
17266 | * [ja][/ja]
|
17267 | * @seealso ons-checkbox
|
17268 | * [en]The `<ons-checkbox>` element is used to display a checkbox.[/en]
|
17269 | * [ja][/ja]
|
17270 | * @seealso ons-switch
|
17271 | * [en]The `<ons-switch>` element is used to display a draggable toggle switch.[/en]
|
17272 | * [ja][/ja]
|
17273 | * @seealso ons-input
|
17274 | * [en]The `<ons-input>` element is used to display a text input.[/en]
|
17275 | * [ja][/ja]
|
17276 | * @seealso ons-search-input
|
17277 | * [en]The `<ons-search-input>` element is used to display a search input.[/en]
|
17278 | * [ja][/ja]
|
17279 | * @seealso ons-range
|
17280 | * [en]The `<ons-range>` element is used to display a range slider.[/en]
|
17281 | * [ja][/ja]
|
17282 | * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
|
17283 | * @example
|
17284 | * <ons-radio checked></ons-radio>
|
17285 | */
|
17286 |
|
17287 | var RadioElement = /*#__PURE__*/function (_BaseCheckboxElement) {
|
17288 | _inherits(RadioElement, _BaseCheckboxElement);
|
17289 |
|
17290 | var _super = _createSuper(RadioElement);
|
17291 |
|
17292 | function RadioElement() {
|
17293 | _classCallCheck(this, RadioElement);
|
17294 |
|
17295 | return _super.apply(this, arguments);
|
17296 | }
|
17297 |
|
17298 | _createClass(RadioElement, [{
|
17299 | key: "_scheme",
|
17300 | get: function get() {
|
17301 | return scheme$g;
|
17302 | }
|
17303 | }, {
|
17304 | key: "_defaultClassName",
|
17305 | get: function get() {
|
17306 | return 'radio-button';
|
17307 | }
|
17308 | }, {
|
17309 | key: "type",
|
17310 | get: function get() {
|
17311 | return 'radio';
|
17312 | }
|
17313 | /**
|
17314 | * @attribute input-id
|
17315 | * @type {String}
|
17316 | * @description
|
17317 | * [en]Specify the "id" attribute of the inner `<input>` element. This is useful when using `<label for="...">` elements.[/en]
|
17318 | * [ja][/ja]
|
17319 | */
|
17320 |
|
17321 | /**
|
17322 | * @property value
|
17323 | * @type {String}
|
17324 | * @description
|
17325 | * [en]The current value of the radio button.[/en]
|
17326 | * [ja][/ja]
|
17327 | */
|
17328 |
|
17329 | /**
|
17330 | * @property checked
|
17331 | * @type {Boolean}
|
17332 | * @description
|
17333 | * [en]Whether the radio button is checked or not.[/en]
|
17334 | * [ja][/ja]
|
17335 | */
|
17336 |
|
17337 | /**
|
17338 | * @property disabled
|
17339 | * @type {Boolean}
|
17340 | * @description
|
17341 | * [en]Whether the radio button is disabled or not.[/en]
|
17342 | * [ja]無効化されている場合に`true`。[/ja]
|
17343 | */
|
17344 |
|
17345 | /**
|
17346 | * @method focus
|
17347 | * @signature focus()
|
17348 | * @description
|
17349 | * [en]Focuses the radio button.[/en]
|
17350 | * [ja][/ja]
|
17351 | */
|
17352 |
|
17353 | /**
|
17354 | * @method blur
|
17355 | * @signature blur()
|
17356 | * @description
|
17357 | * [en]Removes focus from the radio button.[/en]
|
17358 | * [ja][/ja]
|
17359 | */
|
17360 |
|
17361 | }]);
|
17362 |
|
17363 | return RadioElement;
|
17364 | }(BaseCheckboxElement);
|
17365 | onsElements.Radio = RadioElement;
|
17366 | customElements.define('ons-radio', RadioElement);
|
17367 |
|
17368 | var scheme$f = {
|
17369 | '.search-input': 'search-input--*'
|
17370 | };
|
17371 | /**
|
17372 | * @element ons-search-input
|
17373 | * @category form
|
17374 | * @modifier material
|
17375 | * [en]Displays a Material Design search input.[/en]
|
17376 | * [ja][/ja]
|
17377 | * @description
|
17378 | * [en]
|
17379 | * A search input element. The component will automatically render as a Material Design search input on Android devices.
|
17380 | *
|
17381 | * Most attributes that can be used for a normal `<input>` element can also be used on the `<ons-search-input>` element.
|
17382 | * [/en]
|
17383 | * [ja][/ja]
|
17384 | * @tutorial vanilla/Reference/search-input
|
17385 | * @seealso ons-input
|
17386 | * [en]The `<ons-input>` element is used to display a text input.[/en]
|
17387 | * [ja][/ja]
|
17388 | * @seealso ons-range
|
17389 | * [en]The `<ons-range>` element is used to display a range slider.[/en]
|
17390 | * [ja][/ja]
|
17391 | * @seealso ons-switch
|
17392 | * [en]The `<ons-switch>` element is used to display a draggable toggle switch.[/en]
|
17393 | * [ja][/ja]
|
17394 | * @seealso ons-select
|
17395 | * [en]The `<ons-select>` element is used to display a select box.[/en]
|
17396 | * [ja][/ja]
|
17397 | * @seealso ons-checkbox
|
17398 | * [en]The `<ons-checkbox>` element is used to display a checkbox.[/en]
|
17399 | * [ja][/ja]
|
17400 | * @seealso ons-radio
|
17401 | * [en]The `<ons-radio>` element is used to display a radio button.[/en]
|
17402 | * [ja][/ja]
|
17403 | * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
|
17404 | * @example
|
17405 | * <ons-search-input placeholder="Search"></ons-search-input>
|
17406 | */
|
17407 |
|
17408 | var SearchInputElement = /*#__PURE__*/function (_BaseInputElement) {
|
17409 | _inherits(SearchInputElement, _BaseInputElement);
|
17410 |
|
17411 | var _super = _createSuper(SearchInputElement);
|
17412 |
|
17413 | function SearchInputElement() {
|
17414 | _classCallCheck(this, SearchInputElement);
|
17415 |
|
17416 | return _super.apply(this, arguments);
|
17417 | }
|
17418 |
|
17419 | _createClass(SearchInputElement, [{
|
17420 | key: "_scheme",
|
17421 | get: function get() {
|
17422 | return scheme$f;
|
17423 | }
|
17424 | }, {
|
17425 | key: "_template",
|
17426 | get: function get() {
|
17427 | return "\n <input type=\"".concat(this.type, "\" class=\"search-input\">\n ");
|
17428 | }
|
17429 | }, {
|
17430 | key: "type",
|
17431 | get: function get() {
|
17432 | return 'search';
|
17433 | }
|
17434 | /**
|
17435 | * @attribute input-id
|
17436 | * @type {String}
|
17437 | * @description
|
17438 | * [en]Specify the "id" attribute of the inner `<input>` element. This is useful when using `<label for="...">` elements.[/en]
|
17439 | * [ja][/ja]
|
17440 | */
|
17441 |
|
17442 | /**
|
17443 | * @property value
|
17444 | * @type {String}
|
17445 | * @description
|
17446 | * [en]The current value of the input.[/en]
|
17447 | * [ja][/ja]
|
17448 | */
|
17449 |
|
17450 | /**
|
17451 | * @property disabled
|
17452 | * @type {Boolean}
|
17453 | * @description
|
17454 | * [en]Whether the input is disabled or not.[/en]
|
17455 | * [ja]無効化されている場合に`true`。[/ja]
|
17456 | */
|
17457 |
|
17458 | /**
|
17459 | * @method focus
|
17460 | * @signature focus()
|
17461 | * @description
|
17462 | * [en]Focuses the input.[/en]
|
17463 | * [ja][/ja]
|
17464 | */
|
17465 |
|
17466 | /**
|
17467 | * @method blur
|
17468 | * @signature blur()
|
17469 | * @description
|
17470 | * [en]Removes focus from the input.[/en]
|
17471 | * [ja][/ja]
|
17472 | */
|
17473 |
|
17474 | }]);
|
17475 |
|
17476 | return SearchInputElement;
|
17477 | }(BaseInputElement);
|
17478 | onsElements.SearchInput = SearchInputElement;
|
17479 | customElements.define('ons-search-input', SearchInputElement);
|
17480 |
|
17481 | var ModalAnimator = /*#__PURE__*/function (_BaseAnimator) {
|
17482 | _inherits(ModalAnimator, _BaseAnimator);
|
17483 |
|
17484 | var _super = _createSuper(ModalAnimator);
|
17485 |
|
17486 | /**
|
17487 | * @param {Object} options
|
17488 | * @param {String} options.timing
|
17489 | * @param {Number} options.duration
|
17490 | * @param {Number} options.delay
|
17491 | */
|
17492 | function ModalAnimator() {
|
17493 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
17494 | _ref$timing = _ref.timing,
|
17495 | timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
|
17496 | _ref$delay = _ref.delay,
|
17497 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
17498 | _ref$duration = _ref.duration,
|
17499 | duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
|
17500 |
|
17501 | _classCallCheck(this, ModalAnimator);
|
17502 |
|
17503 | return _super.call(this, {
|
17504 | timing: timing,
|
17505 | delay: delay,
|
17506 | duration: duration
|
17507 | });
|
17508 | }
|
17509 | /**
|
17510 | * @param {HTMLElement} modal
|
17511 | * @param {Function} callback
|
17512 | */
|
17513 |
|
17514 |
|
17515 | _createClass(ModalAnimator, [{
|
17516 | key: "show",
|
17517 | value: function show(modal, callback) {
|
17518 | callback();
|
17519 | }
|
17520 | /**
|
17521 | * @param {HTMLElement} modal
|
17522 | * @param {Function} callback
|
17523 | */
|
17524 |
|
17525 | }, {
|
17526 | key: "hide",
|
17527 | value: function hide(modal, callback) {
|
17528 | callback();
|
17529 | }
|
17530 | }]);
|
17531 |
|
17532 | return ModalAnimator;
|
17533 | }(BaseAnimator);
|
17534 |
|
17535 | /**
|
17536 | * iOS style animator for dialog.
|
17537 | */
|
17538 |
|
17539 | var FadeModalAnimator = /*#__PURE__*/function (_ModalAnimator) {
|
17540 | _inherits(FadeModalAnimator, _ModalAnimator);
|
17541 |
|
17542 | var _super = _createSuper(FadeModalAnimator);
|
17543 |
|
17544 | function FadeModalAnimator() {
|
17545 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
17546 | _ref$timing = _ref.timing,
|
17547 | timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
|
17548 | _ref$delay = _ref.delay,
|
17549 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
17550 | _ref$duration = _ref.duration,
|
17551 | duration = _ref$duration === void 0 ? 0.3 : _ref$duration;
|
17552 |
|
17553 | _classCallCheck(this, FadeModalAnimator);
|
17554 |
|
17555 | return _super.call(this, {
|
17556 | timing: timing,
|
17557 | delay: delay,
|
17558 | duration: duration
|
17559 | });
|
17560 | }
|
17561 | /**
|
17562 | * @param {HTMLElement} modal
|
17563 | * @param {Function} callback
|
17564 | */
|
17565 |
|
17566 |
|
17567 | _createClass(FadeModalAnimator, [{
|
17568 | key: "show",
|
17569 | value: function show(modal, callback) {
|
17570 | callback = callback ? callback : function () {};
|
17571 | Animit(modal, this.def).default({
|
17572 | opacity: 0
|
17573 | }, {
|
17574 | opacity: 1
|
17575 | }).queue(function (done) {
|
17576 | callback();
|
17577 | done();
|
17578 | }).play();
|
17579 | }
|
17580 | /**
|
17581 | * @param {HTMLElement} modal
|
17582 | * @param {Function} callback
|
17583 | */
|
17584 |
|
17585 | }, {
|
17586 | key: "hide",
|
17587 | value: function hide(modal, callback) {
|
17588 | callback = callback ? callback : function () {};
|
17589 | Animit(modal, this.def).default({
|
17590 | opacity: 1
|
17591 | }, {
|
17592 | opacity: 0
|
17593 | }).queue(function (done) {
|
17594 | callback();
|
17595 | done();
|
17596 | }).play();
|
17597 | }
|
17598 | }]);
|
17599 |
|
17600 | return FadeModalAnimator;
|
17601 | }(ModalAnimator);
|
17602 |
|
17603 | /**
|
17604 | * iOS style animator for modal.
|
17605 | */
|
17606 |
|
17607 | var LiftModalAnimator = /*#__PURE__*/function (_ModalAnimator) {
|
17608 | _inherits(LiftModalAnimator, _ModalAnimator);
|
17609 |
|
17610 | var _super = _createSuper(LiftModalAnimator);
|
17611 |
|
17612 | function LiftModalAnimator() {
|
17613 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
17614 | _ref$timing = _ref.timing,
|
17615 | timing = _ref$timing === void 0 ? 'cubic-bezier( .1, .7, .1, 1)' : _ref$timing,
|
17616 | _ref$delay = _ref.delay,
|
17617 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
17618 | _ref$duration = _ref.duration,
|
17619 | duration = _ref$duration === void 0 ? 0.4 : _ref$duration;
|
17620 |
|
17621 | _classCallCheck(this, LiftModalAnimator);
|
17622 |
|
17623 | return _super.call(this, {
|
17624 | timing: timing,
|
17625 | delay: delay,
|
17626 | duration: duration
|
17627 | });
|
17628 | }
|
17629 | /**
|
17630 | * @param {HTMLElement} modal
|
17631 | * @param {Function} callback
|
17632 | */
|
17633 |
|
17634 |
|
17635 | _createClass(LiftModalAnimator, [{
|
17636 | key: "show",
|
17637 | value: function show(modal, callback) {
|
17638 | callback = callback ? callback : function () {};
|
17639 | Animit(modal, this.def).default({
|
17640 | transform: 'translate3d(0, 100%, 0)'
|
17641 | }, {
|
17642 | transform: 'translate3d(0, 0, 0)'
|
17643 | }).queue(function (done) {
|
17644 | callback();
|
17645 | done();
|
17646 | }).play();
|
17647 | }
|
17648 | /**
|
17649 | * @param {HTMLElement} modal
|
17650 | * @param {Function} callback
|
17651 | */
|
17652 |
|
17653 | }, {
|
17654 | key: "hide",
|
17655 | value: function hide(modal, callback) {
|
17656 | callback = callback ? callback : function () {};
|
17657 | Animit(modal, this.def).default({
|
17658 | transform: 'translate3d(0, 0, 0)'
|
17659 | }, {
|
17660 | transform: 'translate3d(0, 100%, 0)'
|
17661 | }).queue(function (done) {
|
17662 | callback();
|
17663 | done();
|
17664 | }).play();
|
17665 | }
|
17666 | }]);
|
17667 |
|
17668 | return LiftModalAnimator;
|
17669 | }(ModalAnimator);
|
17670 |
|
17671 | var scheme$e = {
|
17672 | '': 'modal--*',
|
17673 | 'modal__content': 'modal--*__content'
|
17674 | };
|
17675 | var defaultClassName$8 = 'modal';
|
17676 | var _animatorDict$4 = {
|
17677 | 'default': ModalAnimator,
|
17678 | 'fade': FadeModalAnimator,
|
17679 | 'lift': LiftModalAnimator,
|
17680 | 'none': ModalAnimator
|
17681 | };
|
17682 | /**
|
17683 | * @element ons-modal
|
17684 | * @category dialog
|
17685 | * @description
|
17686 | * [en]
|
17687 | * Modal component that masks current screen. Underlying components are not subject to any events while the modal component is shown.
|
17688 | *
|
17689 | * This component can be used to block user input while some operation is running or to show some information to the user.
|
17690 | * [/en]
|
17691 | * [ja]
|
17692 | * 画面全体をマスクするモーダル用コンポーネントです。下側にあるコンポーネントは、
|
17693 | * モーダルが表示されている間はイベント通知が行われません。
|
17694 | * [/ja]
|
17695 | * @seealso ons-dialog
|
17696 | * [en]The `<ons-dialog>` component can be used to create a modal dialog.[/en]
|
17697 | * [ja][/ja]
|
17698 | * @codepen devIg
|
17699 | * @tutorial vanilla/reference/modal
|
17700 | * @example
|
17701 | * <ons-modal id="modal">
|
17702 | * Modal content
|
17703 | * </ons-modal>
|
17704 | * <script>
|
17705 | * var modal = document.getElementById('modal');
|
17706 | * modal.show();
|
17707 | * </script>
|
17708 | */
|
17709 |
|
17710 | var ModalElement = /*#__PURE__*/function (_BaseDialogElement) {
|
17711 | _inherits(ModalElement, _BaseDialogElement);
|
17712 |
|
17713 | var _super = _createSuper(ModalElement);
|
17714 |
|
17715 | /**
|
17716 | * @event preshow
|
17717 | * @description
|
17718 | * [en]Fired just before the modal is displayed.[/en]
|
17719 | * [ja]モーダルが表示される直前に発火します。[/ja]
|
17720 | * @param {Object} event [en]Event object.[/en]
|
17721 | * @param {Object} event.modal
|
17722 | * [en]Component object.[/en]
|
17723 | * [ja]コンポーネントのオブジェクト。[/ja]
|
17724 | * @param {Function} event.cancel
|
17725 | * [en]Execute this function to stop the modal from being shown.[/en]
|
17726 | * [ja]この関数を実行すると、ダイアログの表示がキャンセルされます。[/ja]
|
17727 | */
|
17728 |
|
17729 | /**
|
17730 | * @event postshow
|
17731 | * @description
|
17732 | * [en]Fired just after the modal is displayed.[/en]
|
17733 | * [ja]モーダルが表示された直後に発火します。[/ja]
|
17734 | * @param {Object} event [en]Event object.[/en]
|
17735 | * @param {Object} event.modal
|
17736 | * [en]Component object.[/en]
|
17737 | * [ja]コンポーネントのオブジェクト。[/ja]
|
17738 | */
|
17739 |
|
17740 | /**
|
17741 | * @event prehide
|
17742 | * @description
|
17743 | * [en]Fired just before the modal is hidden.[/en]
|
17744 | * [ja]モーダルが隠れる直前に発火します。[/ja]
|
17745 | * @param {Object} event [en]Event object.[/en]
|
17746 | * @param {Object} event.modal
|
17747 | * [en]Component object.[/en]
|
17748 | * [ja]コンポーネントのオブジェクト。[/ja]
|
17749 | * @param {Function} event.cancel
|
17750 | * [en]Execute this function to stop the modal from being hidden.[/en]
|
17751 | * [ja]この関数を実行すると、ダイアログの非表示がキャンセルされます。[/ja]
|
17752 | */
|
17753 |
|
17754 | /**
|
17755 | * @event posthide
|
17756 | * @description
|
17757 | * [en]Fired just after the modal is hidden.[/en]
|
17758 | * [ja]モーダルが隠れた後に発火します。[/ja]
|
17759 | * @param {Object} event [en]Event object.[/en]
|
17760 | * @param {Object} event.modal
|
17761 | * [en]Component object.[/en]
|
17762 | * [ja]コンポーネントのオブジェクト。[/ja]
|
17763 | */
|
17764 |
|
17765 | /**
|
17766 | * @attribute animation
|
17767 | * @type {String}
|
17768 | * @default default
|
17769 | * @description
|
17770 | * [en]The animation used when showing and hiding the modal. Can be either `"none"`, `"fade"` or `"lift"`.[/en]
|
17771 | * [ja]モーダルを表示する際のアニメーション名を指定します。"none"もしくは"fade","lift"を指定できます。[/ja]
|
17772 | */
|
17773 |
|
17774 | /**
|
17775 | * @attribute animation-options
|
17776 | * @type {Expression}
|
17777 | * @description
|
17778 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
17779 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. <code>{duration: 0.2, delay: 1, timing: 'ease-in'}</code>[/ja]
|
17780 | */
|
17781 |
|
17782 | /**
|
17783 | * @property animationOptions
|
17784 | * @type {Object}
|
17785 | * @description
|
17786 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
17787 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
|
17788 | */
|
17789 |
|
17790 | /**
|
17791 | * @attribute visible
|
17792 | * @type {Boolean}
|
17793 | * @description
|
17794 | * [en]Whether the modal is visible or not.[/en]
|
17795 | * [ja]要素が見える場合に`true`。[/ja]
|
17796 | */
|
17797 | function ModalElement() {
|
17798 | var _this;
|
17799 |
|
17800 | _classCallCheck(this, ModalElement);
|
17801 |
|
17802 | _this = _super.call(this);
|
17803 |
|
17804 | _this._defaultDBB = function () {
|
17805 | return undefined;
|
17806 | };
|
17807 |
|
17808 | contentReady(_assertThisInitialized(_this), function () {
|
17809 | return _this._compile();
|
17810 | });
|
17811 | return _this;
|
17812 | }
|
17813 |
|
17814 | _createClass(ModalElement, [{
|
17815 | key: "_scheme",
|
17816 | get: function get() {
|
17817 | return scheme$e;
|
17818 | }
|
17819 | }, {
|
17820 | key: "_updateAnimatorFactory",
|
17821 | value: function _updateAnimatorFactory() {
|
17822 | return new AnimatorFactory({
|
17823 | animators: _animatorDict$4,
|
17824 | baseClass: ModalAnimator,
|
17825 | baseClassName: 'ModalAnimator',
|
17826 | defaultAnimation: this.getAttribute('animation')
|
17827 | });
|
17828 | }
|
17829 | /**
|
17830 | * @property onDeviceBackButton
|
17831 | * @type {Object}
|
17832 | * @description
|
17833 | * [en]Back-button handler.[/en]
|
17834 | * [ja]バックボタンハンドラ。[/ja]
|
17835 | */
|
17836 |
|
17837 | }, {
|
17838 | key: "_compile",
|
17839 | value: function _compile() {
|
17840 | this.style.display = 'none';
|
17841 | this.style.zIndex = 10001;
|
17842 | this.classList.add(defaultClassName$8);
|
17843 |
|
17844 | if (!util$4.findChild(this, '.modal__content')) {
|
17845 | var content = document.createElement('div');
|
17846 | content.classList.add('modal__content');
|
17847 |
|
17848 | while (this.childNodes[0]) {
|
17849 | var node = this.childNodes[0];
|
17850 | this.removeChild(node);
|
17851 | content.insertBefore(node, null);
|
17852 | }
|
17853 |
|
17854 | this.appendChild(content);
|
17855 | }
|
17856 |
|
17857 | ModifierUtil.initModifier(this, this._scheme);
|
17858 | }
|
17859 | }, {
|
17860 | key: "_toggleStyle",
|
17861 | value: function _toggleStyle(shouldShow) {
|
17862 | this.style.display = shouldShow ? 'table' : 'none';
|
17863 | }
|
17864 | }, {
|
17865 | key: "connectedCallback",
|
17866 | value: function connectedCallback() {
|
17867 | _get(_getPrototypeOf(ModalElement.prototype), "connectedCallback", this).call(this);
|
17868 | }
|
17869 | }, {
|
17870 | key: "disconnectedCallback",
|
17871 | value: function disconnectedCallback() {
|
17872 | _get(_getPrototypeOf(ModalElement.prototype), "disconnectedCallback", this).call(this);
|
17873 | }
|
17874 | /**
|
17875 | * @property visible
|
17876 | * @type {Boolean}
|
17877 | * @description
|
17878 | * [en]Whether the element is visible or not.[/en]
|
17879 | * [ja]要素が見える場合に`true`。[/ja]
|
17880 | */
|
17881 |
|
17882 | /**
|
17883 | * @method show
|
17884 | * @signature show([options])
|
17885 | * @param {Object} [options]
|
17886 | * [en]Parameter object.[/en]
|
17887 | * [ja]オプションを指定するオブジェクト。[/ja]
|
17888 | * @param {String} [options.animation]
|
17889 | * [en]Animation name. Available animations are `"none"` and `"fade"`.[/en]
|
17890 | * [ja]アニメーション名を指定します。"none", "fade"のいずれかを指定します。[/ja]
|
17891 | * @param {String} [options.animationOptions]
|
17892 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
|
17893 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
|
17894 | * @param {Function} [options.callback]
|
17895 | * [en]This function is called after the modal has been revealed.[/en]
|
17896 | * [ja]モーダルが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
|
17897 | * @description
|
17898 | * [en]Show modal.[/en]
|
17899 | * [ja]モーダルを表示します。[/ja]
|
17900 | * @return {Promise}
|
17901 | * [en]Resolves to the displayed element[/en]
|
17902 | * [ja][/ja]
|
17903 | */
|
17904 |
|
17905 | /**
|
17906 | * @method toggle
|
17907 | * @signature toggle([options])
|
17908 | * @param {Object} [options]
|
17909 | * [en]Parameter object.[/en]
|
17910 | * [ja]オプションを指定するオブジェクト。[/ja]
|
17911 | * @param {String} [options.animation]
|
17912 | * [en]Animation name. Available animations are `"none"` and `"fade"`.[/en]
|
17913 | * [ja]アニメーション名を指定します。"none", "fade"のいずれかを指定します。[/ja]
|
17914 | * @param {String} [options.animationOptions]
|
17915 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
|
17916 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
|
17917 | * @param {Function} [options.callback]
|
17918 | * [en]This function is called after the modal has been revealed.[/en]
|
17919 | * [ja]モーダルが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
|
17920 | * @description
|
17921 | * [en]Toggle modal visibility.[/en]
|
17922 | * [ja]モーダルの表示を切り替えます。[/ja]
|
17923 | */
|
17924 |
|
17925 | /**
|
17926 | * @method hide
|
17927 | * @signature hide([options])
|
17928 | * @param {Object} [options]
|
17929 | * [en]Parameter object.[/en]
|
17930 | * [ja]オプションを指定するオブジェクト。[/ja]
|
17931 | * @param {String} [options.animation]
|
17932 | * [en]Animation name. Available animations are `"none"` and `"fade"`.[/en]
|
17933 | * [ja]アニメーション名を指定します。"none", "fade"のいずれかを指定します。[/ja]
|
17934 | * @param {String} [options.animationOptions]
|
17935 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
|
17936 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
|
17937 | * @param {Function} [options.callback]
|
17938 | * [en]This function is called after the modal has been revealed.[/en]
|
17939 | * [ja]モーダルが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
|
17940 | * @description
|
17941 | * [en]Hide modal.[/en]
|
17942 | * [ja]モーダルを非表示にします。[/ja]
|
17943 | * @return {Promise}
|
17944 | * [en]Resolves to the hidden element[/en]
|
17945 | * [ja][/ja]
|
17946 | */
|
17947 |
|
17948 | }, {
|
17949 | key: "attributeChangedCallback",
|
17950 | value: function attributeChangedCallback(name, last, current) {
|
17951 | if (name === 'class') {
|
17952 | util$4.restoreClass(this, defaultClassName$8, scheme$e);
|
17953 | } else {
|
17954 | _get(_getPrototypeOf(ModalElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
|
17955 | }
|
17956 | }
|
17957 | /**
|
17958 | * @param {String} name
|
17959 | * @param {Function} Animator
|
17960 | */
|
17961 |
|
17962 | }], [{
|
17963 | key: "observedAttributes",
|
17964 | get: function get() {
|
17965 | return [].concat(_toConsumableArray(_get(_getPrototypeOf(ModalElement), "observedAttributes", this)), ['class']);
|
17966 | }
|
17967 | }, {
|
17968 | key: "registerAnimator",
|
17969 | value: function registerAnimator(name, Animator) {
|
17970 | if (!(Animator.prototype instanceof ModalAnimator)) {
|
17971 | util$4.throwAnimator('Modal');
|
17972 | }
|
17973 |
|
17974 | _animatorDict$4[name] = Animator;
|
17975 | }
|
17976 | }, {
|
17977 | key: "animators",
|
17978 | get: function get() {
|
17979 | return _animatorDict$4;
|
17980 | }
|
17981 | }, {
|
17982 | key: "ModalAnimator",
|
17983 | get: function get() {
|
17984 | return ModalAnimator;
|
17985 | }
|
17986 | }]);
|
17987 |
|
17988 | return ModalElement;
|
17989 | }(BaseDialogElement);
|
17990 | onsElements.Modal = ModalElement;
|
17991 | customElements.define('ons-modal', ModalElement);
|
17992 |
|
17993 | var widthToPx = function widthToPx(width) {
|
17994 | var _ref = [parseInt(width, 10), /px/.test(width)],
|
17995 | value = _ref[0],
|
17996 | px = _ref[1];
|
17997 | return px ? value : Math.round(document.body.offsetWidth * value / 100);
|
17998 | };
|
17999 |
|
18000 | var SwipeReveal = /*#__PURE__*/function () {
|
18001 | function SwipeReveal(params) {
|
18002 | var _this = this;
|
18003 |
|
18004 | _classCallCheck(this, SwipeReveal);
|
18005 |
|
18006 | 'element ignoreSwipe isInitialState onDragCallback swipeMax swipeMin swipeMid'.split(/\s+/).forEach(function (key) {
|
18007 | return _this[key] = params[key];
|
18008 | });
|
18009 | this.elementHandler = params.elementHandler || params.element;
|
18010 |
|
18011 | this.getThreshold = params.getThreshold || function () {
|
18012 | return .5;
|
18013 | };
|
18014 |
|
18015 | this.getSide = params.getSide || function () {
|
18016 | return 'left';
|
18017 | };
|
18018 |
|
18019 | this.handleGesture = this.handleGesture.bind(this);
|
18020 | this._shouldFixScroll = util$4.globals.actualMobileOS === 'ios';
|
18021 | }
|
18022 |
|
18023 | _createClass(SwipeReveal, [{
|
18024 | key: "update",
|
18025 | value: function update() {
|
18026 | var swipeable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.element.hasAttribute('swipeable');
|
18027 |
|
18028 | if (!this.gestureDetector) {
|
18029 | this.gestureDetector = new GestureDetector(this.elementHandler, {
|
18030 | dragMinDistance: 1,
|
18031 | passive: !this._shouldFixScroll
|
18032 | });
|
18033 | }
|
18034 |
|
18035 | var action = swipeable ? 'on' : 'off';
|
18036 | this.gestureDetector[action]('drag dragstart dragend', this.handleGesture);
|
18037 | }
|
18038 | }, {
|
18039 | key: "handleGesture",
|
18040 | value: function handleGesture(e) {
|
18041 | if (e.gesture) {
|
18042 | if (e.type === 'dragstart') {
|
18043 | this.onDragStart(e);
|
18044 | } else if (!this._ignoreDrag) {
|
18045 | e.type === 'dragend' ? this.onDragEnd(e) : this.onDrag(e);
|
18046 | }
|
18047 | }
|
18048 | }
|
18049 | }, {
|
18050 | key: "onDragStart",
|
18051 | value: function onDragStart(event) {
|
18052 | var _this2 = this;
|
18053 |
|
18054 | var getDistance = function getDistance() {
|
18055 | return _this2.getSide() === 'left' ? event.gesture.center.clientX : window.innerWidth - event.gesture.center.clientX;
|
18056 | };
|
18057 |
|
18058 | this._ignoreDrag = event.consumed || !util$4.isValidGesture(event) || this.ignoreSwipe(event, getDistance());
|
18059 |
|
18060 | if (!this._ignoreDrag) {
|
18061 | event.consume && event.consume();
|
18062 | event.consumed = true;
|
18063 | this._width = widthToPx(this.element.style.width || '100%');
|
18064 | this._startDistance = this._distance = !(this.isInitialState instanceof Function) || this.isInitialState() ? 0 : this._width;
|
18065 | util$4.iosPreventScroll(this.gestureDetector);
|
18066 | }
|
18067 | }
|
18068 | }, {
|
18069 | key: "onDrag",
|
18070 | value: function onDrag(event) {
|
18071 | event.stopPropagation();
|
18072 | var delta = this.getSide() === 'left' ? event.gesture.deltaX : -event.gesture.deltaX;
|
18073 | var distance = Math.max(0, Math.min(this._width, this._startDistance + delta));
|
18074 |
|
18075 | if (distance !== this._distance) {
|
18076 | this._distance = distance;
|
18077 | this.swipeMid(this._distance, this._width);
|
18078 | }
|
18079 | }
|
18080 | }, {
|
18081 | key: "onDragEnd",
|
18082 | value: function onDragEnd(event) {
|
18083 | event.stopPropagation();
|
18084 | var direction = event.gesture.interimDirection;
|
18085 | var isSwipeMax = this.getSide() !== direction && this._distance > this._width * this.getThreshold();
|
18086 | isSwipeMax ? this.swipeMax() : this.swipeMin();
|
18087 | }
|
18088 | }, {
|
18089 | key: "dispose",
|
18090 | value: function dispose() {
|
18091 | this.gestureDetector && this.gestureDetector.dispose();
|
18092 | this.gestureDetector = this.element = this.elementHandler = null;
|
18093 | }
|
18094 | }]);
|
18095 |
|
18096 | return SwipeReveal;
|
18097 | }();
|
18098 |
|
18099 | var NavigatorAnimator = /*#__PURE__*/function (_BaseAnimator) {
|
18100 | _inherits(NavigatorAnimator, _BaseAnimator);
|
18101 |
|
18102 | var _super = _createSuper(NavigatorAnimator);
|
18103 |
|
18104 | /**
|
18105 | * @param {Object} options
|
18106 | * @param {String} options.timing
|
18107 | * @param {Number} options.duration
|
18108 | * @param {Number} options.delay
|
18109 | */
|
18110 | function NavigatorAnimator(options) {
|
18111 | _classCallCheck(this, NavigatorAnimator);
|
18112 |
|
18113 | options = util$4.extend({
|
18114 | timing: 'linear',
|
18115 | duration: '0.4',
|
18116 | delay: '0'
|
18117 | }, options || {});
|
18118 | return _super.call(this, options);
|
18119 | }
|
18120 |
|
18121 | _createClass(NavigatorAnimator, [{
|
18122 | key: "push",
|
18123 | value: function push(enterPage, leavePage, callback) {
|
18124 | callback();
|
18125 | }
|
18126 | }, {
|
18127 | key: "pop",
|
18128 | value: function pop(enterPage, leavePage, callback) {
|
18129 | callback();
|
18130 | }
|
18131 | }, {
|
18132 | key: "block",
|
18133 | value: function block(page) {
|
18134 | var blocker = util$4.createElement("\n <div style=\"position: absolute; background-color: transparent; width: 100%; height: 100%; z-index: 100000\"></div>\n ");
|
18135 | page.parentNode.appendChild(blocker);
|
18136 | return function () {
|
18137 | return blocker.remove();
|
18138 | };
|
18139 | }
|
18140 | }]);
|
18141 |
|
18142 | return NavigatorAnimator;
|
18143 | }(BaseAnimator);
|
18144 |
|
18145 | var _excluded$1 = ["durationRestore", "durationSwipe", "timingSwipe"];
|
18146 | /**
|
18147 | * Abstract swipe animator for iOS navigator transition.
|
18148 | */
|
18149 |
|
18150 | var IOSSwipeNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
|
18151 | _inherits(IOSSwipeNavigatorAnimator, _NavigatorAnimator);
|
18152 |
|
18153 | var _super = _createSuper(IOSSwipeNavigatorAnimator);
|
18154 |
|
18155 | function IOSSwipeNavigatorAnimator() {
|
18156 | var _this;
|
18157 |
|
18158 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
18159 | _ref$durationRestore = _ref.durationRestore,
|
18160 | durationRestore = _ref$durationRestore === void 0 ? 0.1 : _ref$durationRestore,
|
18161 | _ref$durationSwipe = _ref.durationSwipe,
|
18162 | durationSwipe = _ref$durationSwipe === void 0 ? 0.15 : _ref$durationSwipe,
|
18163 | _ref$timingSwipe = _ref.timingSwipe,
|
18164 | timingSwipe = _ref$timingSwipe === void 0 ? 'linear' : _ref$timingSwipe,
|
18165 | rest = _objectWithoutProperties(_ref, _excluded$1);
|
18166 |
|
18167 | _classCallCheck(this, IOSSwipeNavigatorAnimator);
|
18168 |
|
18169 | _this = _super.call(this, _objectSpread2({}, rest));
|
18170 |
|
18171 | if (_this.constructor === IOSSwipeNavigatorAnimator) {
|
18172 | util$4.throwAbstract();
|
18173 | }
|
18174 |
|
18175 | _this.durationRestore = durationRestore;
|
18176 | _this.durationSwipe = durationSwipe;
|
18177 | _this.timingSwipe = timingSwipe;
|
18178 | _this.optSwipe = {
|
18179 | timing: timingSwipe,
|
18180 | duration: durationSwipe
|
18181 | };
|
18182 | _this.optRestore = {
|
18183 | timing: timingSwipe,
|
18184 | duration: durationRestore
|
18185 | };
|
18186 | _this.swipeShadow = util$4.createElement("<div style=\"position: absolute; height: 100%; width: 12px; right: 100%; top: 0; bottom: 0; z-index: -1;" + "background: linear-gradient(to right, transparent 0, rgba(0,0,0,.04) 40%, rgba(0,0,0,.12) 80%, rgba(0,0,0,.16) 100%);\"></div>");
|
18187 | _this.isDragStart = true;
|
18188 | return _this;
|
18189 | }
|
18190 |
|
18191 | _createClass(IOSSwipeNavigatorAnimator, [{
|
18192 | key: "_decompose",
|
18193 | value: function _decompose() {
|
18194 | util$4.throwMember();
|
18195 | }
|
18196 | }, {
|
18197 | key: "_shouldAnimateToolbar",
|
18198 | value: function _shouldAnimateToolbar() {
|
18199 | util$4.throwMember();
|
18200 | }
|
18201 | }, {
|
18202 | key: "_calculateDelta",
|
18203 | value: function _calculateDelta() {
|
18204 | util$4.throwMember();
|
18205 | }
|
18206 | }, {
|
18207 | key: "_dragStartSetup",
|
18208 | value: function _dragStartSetup(enterPage, leavePage) {
|
18209 | this.isDragStart = false; // Avoid content clicks
|
18210 |
|
18211 | this.unblock = _get(_getPrototypeOf(IOSSwipeNavigatorAnimator.prototype), "block", this).call(this, leavePage); // Mask
|
18212 |
|
18213 | enterPage.parentElement.insertBefore(this.backgroundMask, enterPage); // Decomposition
|
18214 |
|
18215 | this.target = {
|
18216 | enter: util$4.findToolbarPage(enterPage) || enterPage,
|
18217 | leave: util$4.findToolbarPage(leavePage) || leavePage
|
18218 | };
|
18219 | this.decomp = {
|
18220 | enter: this._decompose(this.target.enter),
|
18221 | leave: this._decompose(this.target.leave)
|
18222 | }; // Animation values
|
18223 |
|
18224 | this.delta = this._calculateDelta(leavePage, this.decomp.leave);
|
18225 | this.shouldAnimateToolbar = this._shouldAnimateToolbar(this.target.enter, this.target.leave); // Shadow && styles
|
18226 |
|
18227 | if (this.shouldAnimateToolbar) {
|
18228 | this.swipeShadow.style.top = this.decomp.leave.toolbar.offsetHeight + 'px';
|
18229 | this.target.leave.appendChild(this.swipeShadow);
|
18230 |
|
18231 | this._saveStyle(this.target.enter, this.target.leave);
|
18232 | } else {
|
18233 | leavePage.appendChild(this.swipeShadow);
|
18234 |
|
18235 | this._saveStyle(enterPage, leavePage);
|
18236 | }
|
18237 |
|
18238 | leavePage.classList.add('overflow-visible');
|
18239 | this.overflowElement = leavePage;
|
18240 | this.decomp.leave.content.classList.add('content-swiping');
|
18241 | }
|
18242 | }, {
|
18243 | key: "translate",
|
18244 | value: function translate(distance, maxWidth, enterPage, leavePage) {
|
18245 | this.isSwiping = true;
|
18246 |
|
18247 | if (enterPage.style.display === 'none') {
|
18248 | enterPage.style.display = '';
|
18249 | }
|
18250 |
|
18251 | if (this.isDragStart) {
|
18252 | this.maxWidth = maxWidth;
|
18253 |
|
18254 | this._dragStartSetup(enterPage, leavePage);
|
18255 | }
|
18256 |
|
18257 | var swipeRatio = (distance - maxWidth) / maxWidth;
|
18258 |
|
18259 | if (this.shouldAnimateToolbar) {
|
18260 | Animit.runAll(
|
18261 | /* Enter page */
|
18262 | Animit([this.decomp.enter.content, this.decomp.enter.bottomToolbar, this.decomp.enter.background]).queue({
|
18263 | transform: "translate3d(".concat(swipeRatio * 25, "%, 0, 0)"),
|
18264 | opacity: 1 + swipeRatio * 10 / 100 // 0.9 -> 1
|
18265 |
|
18266 | }), Animit(this.decomp.enter.toolbarCenter).queue({
|
18267 | transform: "translate3d(".concat(this.delta.title * swipeRatio, "px, 0, 0)"),
|
18268 | opacity: 1 + swipeRatio // 0 -> 1
|
18269 |
|
18270 | }), Animit(this.decomp.enter.backButtonLabel).queue({
|
18271 | opacity: 1 + swipeRatio * 10 / 100,
|
18272 | // 0.9 -> 1
|
18273 | transform: "translate3d(".concat(this.delta.label * swipeRatio, "px, 0, 0)")
|
18274 | }), Animit(this.decomp.enter.other).queue({
|
18275 | opacity: 1 + swipeRatio // 0 -> 1
|
18276 |
|
18277 | }),
|
18278 | /* Leave page */
|
18279 | Animit([this.decomp.leave.content, this.decomp.leave.bottomToolbar, this.decomp.leave.background, this.swipeShadow]).queue({
|
18280 | transform: "translate3d(".concat(distance, "px, 0, 0)")
|
18281 | }), Animit(this.decomp.leave.toolbar).queue({
|
18282 | opacity: -1 * swipeRatio // 1 -> 0
|
18283 |
|
18284 | }), Animit(this.decomp.leave.toolbarCenter).queue({
|
18285 | transform: "translate3d(".concat((1 + swipeRatio) * 125, "%, 0, 0)")
|
18286 | }), Animit(this.decomp.leave.backButtonLabel).queue({
|
18287 | opacity: -1 * swipeRatio,
|
18288 | // 1 -> 0
|
18289 | transform: "translate3d(".concat(this.delta.title * (1 + swipeRatio), "px, 0, 0)")
|
18290 | }),
|
18291 | /* Other */
|
18292 | Animit(this.swipeShadow).queue({
|
18293 | opacity: -1 * swipeRatio // 1 -> 0
|
18294 |
|
18295 | }));
|
18296 | } else {
|
18297 | Animit.runAll(Animit(leavePage).queue({
|
18298 | transform: "translate3d(".concat(distance, "px, 0, 0)")
|
18299 | }), Animit(enterPage).queue({
|
18300 | transform: "translate3d(".concat(swipeRatio * 25, "%, 0, 0)"),
|
18301 | opacity: 1 + swipeRatio * 10 / 100 // 0.9 -> 1
|
18302 |
|
18303 | }), Animit(this.swipeShadow).queue({
|
18304 | opacity: -1 * swipeRatio // 1 -> 0
|
18305 |
|
18306 | }));
|
18307 | }
|
18308 | }
|
18309 | }, {
|
18310 | key: "restore",
|
18311 | value: function restore(enterPage, leavePage, callback) {
|
18312 | var _this2 = this;
|
18313 |
|
18314 | if (this.isDragStart) {
|
18315 | return;
|
18316 | }
|
18317 |
|
18318 | if (this.shouldAnimateToolbar) {
|
18319 | Animit.runAll(
|
18320 | /* Enter page */
|
18321 | Animit([this.decomp.enter.content, this.decomp.enter.bottomToolbar, this.decomp.enter.background]).queue({
|
18322 | transform: 'translate3d(-25%, 0, 0)',
|
18323 | opacity: 0.9
|
18324 | }, this.optRestore), Animit(this.decomp.enter.toolbarCenter).queue({
|
18325 | transform: "translate3d(-".concat(this.delta.title, "px, 0, 0)"),
|
18326 | transition: "opacity ".concat(this.durationRestore, "s linear, transform ").concat(this.durationRestore, "s ").concat(this.timingSwipe),
|
18327 | opacity: 0
|
18328 | }), Animit(this.decomp.enter.backButtonLabel).queue({
|
18329 | transform: "translate3d(-".concat(this.delta.label, "px, 0, 0)")
|
18330 | }, this.optRestore), Animit(this.decomp.enter.other).queue({
|
18331 | opacity: 0
|
18332 | }, this.optRestore),
|
18333 | /* Leave page */
|
18334 | Animit([this.decomp.leave.content, this.decomp.leave.bottomToolbar, this.decomp.leave.background, this.swipeShadow]).queue({
|
18335 | transform: "translate3d(0, 0, 0)"
|
18336 | }, this.optRestore), Animit(this.decomp.leave.toolbar).queue({
|
18337 | opacity: 1
|
18338 | }, this.optRestore), Animit(this.decomp.leave.toolbarCenter).queue({
|
18339 | transform: "translate3d(0, 0, 0)"
|
18340 | }, this.optRestore), Animit(this.decomp.leave.backButtonLabel).queue({
|
18341 | opacity: 1,
|
18342 | transform: "translate3d(0, 0, 0)",
|
18343 | transition: "opacity ".concat(this.durationRestore, "s linear, transform ").concat(this.durationRestore, "s ").concat(this.timingSwipe)
|
18344 | }),
|
18345 | /* Other */
|
18346 | Animit(this.swipeShadow).queue({
|
18347 | opacity: 0
|
18348 | }, this.optRestore).queue(function (done) {
|
18349 | _this2._reset(_this2.target.enter, _this2.target.leave);
|
18350 |
|
18351 | enterPage.style.display = 'none';
|
18352 | callback && callback();
|
18353 | done();
|
18354 | }));
|
18355 | } else {
|
18356 | Animit.runAll(Animit(enterPage).queue({
|
18357 | transform: 'translate3D(-25%, 0, 0)',
|
18358 | opacity: 0.9
|
18359 | }, this.optRestore), Animit(leavePage).queue({
|
18360 | transform: 'translate3D(0, 0, 0)'
|
18361 | }, this.optRestore).queue(function (done) {
|
18362 | _this2._reset(enterPage, leavePage);
|
18363 |
|
18364 | enterPage.style.display = 'none';
|
18365 | callback && callback();
|
18366 | done();
|
18367 | }));
|
18368 | }
|
18369 | }
|
18370 | }, {
|
18371 | key: "popSwipe",
|
18372 | value: function popSwipe(enterPage, leavePage, callback) {
|
18373 | var _this3 = this;
|
18374 |
|
18375 | if (this.isDragStart) {
|
18376 | return;
|
18377 | }
|
18378 |
|
18379 | if (this.shouldAnimateToolbar) {
|
18380 | Animit.runAll(
|
18381 | /* Enter page */
|
18382 | Animit([this.decomp.enter.content, this.decomp.enter.bottomToolbar, this.decomp.enter.background]).queue({
|
18383 | transform: 'translate3d(0, 0, 0)',
|
18384 | opacity: 1
|
18385 | }, this.optSwipe), Animit(this.decomp.enter.toolbarCenter).queue({
|
18386 | transform: "translate3d(0, 0, 0)",
|
18387 | transition: "opacity ".concat(this.durationSwipe, "s linear, transform ").concat(this.durationSwipe, "s ").concat(this.timingSwipe),
|
18388 | opacity: 1
|
18389 | }), Animit(this.decomp.enter.backButtonLabel).queue({
|
18390 | transform: "translate3d(0, 0, 0)"
|
18391 | }, this.optSwipe), Animit(this.decomp.enter.other).queue({
|
18392 | opacity: 1
|
18393 | }, this.optSwipe),
|
18394 | /* Leave page */
|
18395 | Animit([this.decomp.leave.content, this.decomp.leave.bottomToolbar, this.decomp.leave.background]).queue({
|
18396 | transform: "translate3d(100%, 0, 0)"
|
18397 | }, this.optSwipe), Animit(this.decomp.leave.toolbar).queue({
|
18398 | opacity: 0
|
18399 | }, this.optSwipe), Animit(this.decomp.leave.toolbarCenter).queue({
|
18400 | transform: "translate3d(125%, 0, 0)"
|
18401 | }, this.optSwipe), Animit(this.decomp.leave.backButtonLabel).queue({
|
18402 | opacity: 0,
|
18403 | transform: "translate3d(".concat(this.delta.title, "px, 0, 0)"),
|
18404 | transition: "opacity ".concat(this.durationSwipe, "s linear, transform ").concat(this.durationSwipe, "s ").concat(this.timingSwipe)
|
18405 | }),
|
18406 | /* Other */
|
18407 | Animit(this.swipeShadow).queue({
|
18408 | opacity: 0,
|
18409 | transform: "translate3d(".concat(this.maxWidth, "px, 0, 0)")
|
18410 | }, this.optSwipe).queue(function (done) {
|
18411 | _this3._reset(_this3.target.enter, _this3.target.leave);
|
18412 |
|
18413 | callback && callback();
|
18414 | done();
|
18415 | }));
|
18416 | } else {
|
18417 | Animit.runAll(Animit(enterPage).queue({
|
18418 | transform: 'translate3D(0, 0, 0)',
|
18419 | opacity: 1.0
|
18420 | }, this.optSwipe), Animit(leavePage).queue({
|
18421 | transform: 'translate3D(100%, 0, 0)'
|
18422 | }, this.optSwipe).queue(function (done) {
|
18423 | _this3._reset(enterPage, leavePage);
|
18424 |
|
18425 | callback && callback();
|
18426 | done();
|
18427 | }));
|
18428 | }
|
18429 | }
|
18430 | }, {
|
18431 | key: "_saveStyle",
|
18432 | value: function _saveStyle() {
|
18433 | var _this4 = this;
|
18434 |
|
18435 | this._savedStyle = new WeakMap();
|
18436 |
|
18437 | var save = function save(el) {
|
18438 | return _this4._savedStyle.set(el, el.getAttribute('style'));
|
18439 | };
|
18440 |
|
18441 | for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
18442 | args[_key] = arguments[_key];
|
18443 | }
|
18444 |
|
18445 | args.forEach(save);
|
18446 | Object.keys(this.decomp).forEach(function (p) {
|
18447 | Object.keys(_this4.decomp[p]).forEach(function (k) {
|
18448 | (_this4.decomp[p][k] instanceof Array ? _this4.decomp[p][k] : [_this4.decomp[p][k]]).forEach(save);
|
18449 | });
|
18450 | });
|
18451 | }
|
18452 | }, {
|
18453 | key: "_restoreStyle",
|
18454 | value: function _restoreStyle() {
|
18455 | var _this5 = this;
|
18456 |
|
18457 | var restore = function restore(el) {
|
18458 | _this5._savedStyle.get(el) === null ? el.removeAttribute('style') : el.setAttribute('style', _this5._savedStyle.get(el));
|
18459 |
|
18460 | _this5._savedStyle.delete(el);
|
18461 | };
|
18462 |
|
18463 | for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
18464 | args[_key2] = arguments[_key2];
|
18465 | }
|
18466 |
|
18467 | args.forEach(restore);
|
18468 | Object.keys(this.decomp).forEach(function (p) {
|
18469 | Object.keys(_this5.decomp[p]).forEach(function (k) {
|
18470 | (_this5.decomp[p][k] instanceof Array ? _this5.decomp[p][k] : [_this5.decomp[p][k]]).forEach(restore);
|
18471 | });
|
18472 | });
|
18473 | }
|
18474 | }, {
|
18475 | key: "_reset",
|
18476 | value: function _reset() {
|
18477 | this.isSwiping = false;
|
18478 | this._savedStyle && this._restoreStyle.apply(this, arguments);
|
18479 | this.unblock && this.unblock();
|
18480 | this.swipeShadow.remove();
|
18481 | this.backgroundMask.remove();
|
18482 | this.overflowElement.classList.remove('overflow-visible');
|
18483 | this.decomp.leave.content.classList.remove('content-swiping');
|
18484 | this.decomp = this.target = this.overflowElement = this._savedStyle = null;
|
18485 | this.isDragStart = true;
|
18486 | }
|
18487 | }], [{
|
18488 | key: "swipeable",
|
18489 | get: function get() {
|
18490 | return true;
|
18491 | }
|
18492 | }]);
|
18493 |
|
18494 | return IOSSwipeNavigatorAnimator;
|
18495 | }(NavigatorAnimator);
|
18496 |
|
18497 | var _excluded = ["timing", "delay", "duration"];
|
18498 |
|
18499 | var translate3d = function translate3d() {
|
18500 | var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
|
18501 | var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
18502 | var z = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
|
18503 | return "translate3d(".concat(x, ", ").concat(y, ", ").concat(z, ")");
|
18504 | };
|
18505 | /**
|
18506 | * Slide animator for navigator transition like iOS's screen slide transition.
|
18507 | */
|
18508 |
|
18509 |
|
18510 | var IOSSlideNavigatorAnimator = /*#__PURE__*/function (_IOSSwipeNavigatorAni) {
|
18511 | _inherits(IOSSlideNavigatorAnimator, _IOSSwipeNavigatorAni);
|
18512 |
|
18513 | var _super = _createSuper(IOSSlideNavigatorAnimator);
|
18514 |
|
18515 | function IOSSlideNavigatorAnimator() {
|
18516 | var _this;
|
18517 |
|
18518 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
18519 | _ref$timing = _ref.timing,
|
18520 | timing = _ref$timing === void 0 ? 'cubic-bezier(0.3, .4, 0, .9)' : _ref$timing,
|
18521 | _ref$delay = _ref.delay,
|
18522 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
18523 | _ref$duration = _ref.duration,
|
18524 | duration = _ref$duration === void 0 ? 0.4 : _ref$duration,
|
18525 | rest = _objectWithoutProperties(_ref, _excluded);
|
18526 |
|
18527 | _classCallCheck(this, IOSSlideNavigatorAnimator);
|
18528 |
|
18529 | _this = _super.call(this, _objectSpread2({
|
18530 | timing: timing,
|
18531 | delay: delay,
|
18532 | duration: duration
|
18533 | }, rest));
|
18534 | _this.backgroundMask = util$4.createElement("<div style=\"position: absolute; width: 100%; height: 100%;" + "background-color: black; z-index: 2\"></div>");
|
18535 | return _this;
|
18536 | }
|
18537 |
|
18538 | _createClass(IOSSlideNavigatorAnimator, [{
|
18539 | key: "_decompose",
|
18540 | value: function _decompose(page) {
|
18541 | var toolbar = page._getToolbarElement();
|
18542 |
|
18543 | var left = toolbar._getToolbarLeftItemsElement();
|
18544 |
|
18545 | var right = toolbar._getToolbarRightItemsElement();
|
18546 |
|
18547 | var excludeBackButton = function excludeBackButton(elements) {
|
18548 | var result = [];
|
18549 |
|
18550 | for (var i = 0; i < elements.length; i++) {
|
18551 | if (elements[i].nodeName.toLowerCase() !== 'ons-back-button') {
|
18552 | result.push(elements[i]);
|
18553 | }
|
18554 | }
|
18555 |
|
18556 | return result;
|
18557 | };
|
18558 |
|
18559 | var other = [].concat(left.children.length === 0 ? left : excludeBackButton(left.children)).concat(right.children.length === 0 ? right : excludeBackButton(right.children));
|
18560 | return {
|
18561 | toolbarCenter: toolbar._getToolbarCenterItemsElement(),
|
18562 | backButtonIcon: toolbar._getToolbarBackButtonIconElement(),
|
18563 | backButtonLabel: toolbar._getToolbarBackButtonLabelElement(),
|
18564 | other: other,
|
18565 | content: page._getContentElement(),
|
18566 | background: page._getBackgroundElement(),
|
18567 | toolbar: toolbar,
|
18568 | bottomToolbar: page._getBottomToolbarElement()
|
18569 | };
|
18570 | }
|
18571 | }, {
|
18572 | key: "_shouldAnimateToolbar",
|
18573 | value: function _shouldAnimateToolbar(enterPage, leavePage) {
|
18574 | var toolbars = enterPage._canAnimateToolbar() && leavePage._canAnimateToolbar();
|
18575 |
|
18576 | var enterToolbar = enterPage._getToolbarElement();
|
18577 |
|
18578 | var leaveToolbar = leavePage._getToolbarElement();
|
18579 |
|
18580 | var isStatic = enterToolbar.hasAttribute('static') || leaveToolbar.hasAttribute('static');
|
18581 | var isMaterial = util$4.hasModifier(enterToolbar, 'material') || util$4.hasModifier(leaveToolbar, 'material');
|
18582 | var isTransparent = util$4.hasModifier(enterToolbar, 'transparent') || util$4.hasModifier(leaveToolbar, 'transparent');
|
18583 | return toolbars && !isStatic && !isMaterial && !isTransparent;
|
18584 | }
|
18585 | }, {
|
18586 | key: "_calculateDelta",
|
18587 | value: function _calculateDelta(element, decomposition) {
|
18588 | var title, label;
|
18589 | var pageRect = element.getBoundingClientRect();
|
18590 |
|
18591 | if (decomposition.backButtonLabel.classList.contains('back-button__label')) {
|
18592 | var labelRect = decomposition.backButtonLabel.getBoundingClientRect();
|
18593 | title = Math.round(pageRect.width / 2 - labelRect.width / 2 - labelRect.left);
|
18594 | } else {
|
18595 | title = Math.round(pageRect.width / 2 * 0.6);
|
18596 | }
|
18597 |
|
18598 | if (decomposition.backButtonIcon.classList.contains('back-button__icon')) {
|
18599 | label = decomposition.backButtonIcon.getBoundingClientRect().right - 2;
|
18600 | }
|
18601 |
|
18602 | return {
|
18603 | title: title,
|
18604 | label: label
|
18605 | };
|
18606 | }
|
18607 | /**
|
18608 | * @param {Object} enterPage
|
18609 | * @param {Object} leavePage
|
18610 | * @param {Function} callback
|
18611 | */
|
18612 |
|
18613 | }, {
|
18614 | key: "push",
|
18615 | value: function push(enterPage, leavePage, callback) {
|
18616 | var _this2 = this;
|
18617 |
|
18618 | this.backgroundMask.remove();
|
18619 | leavePage.parentNode.insertBefore(this.backgroundMask, leavePage);
|
18620 |
|
18621 | var unblock = _get(_getPrototypeOf(IOSSlideNavigatorAnimator.prototype), "block", this).call(this, enterPage);
|
18622 |
|
18623 | contentReady(enterPage, function () {
|
18624 | var enterPageTarget = util$4.findToolbarPage(enterPage) || enterPage;
|
18625 | var leavePageTarget = util$4.findToolbarPage(leavePage) || leavePage;
|
18626 |
|
18627 | var enterPageDecomposition = _this2._decompose(enterPageTarget);
|
18628 |
|
18629 | var leavePageDecomposition = _this2._decompose(leavePageTarget);
|
18630 |
|
18631 | var delta = _this2._calculateDelta(leavePage, enterPageDecomposition);
|
18632 |
|
18633 | var shouldAnimateToolbar = _this2._shouldAnimateToolbar(enterPageTarget, leavePageTarget);
|
18634 |
|
18635 | if (shouldAnimateToolbar) {
|
18636 | Animit.runAll(Animit([enterPageDecomposition.content, enterPageDecomposition.bottomToolbar, enterPageDecomposition.background], _this2.def).default({
|
18637 | transform: translate3d('100%')
|
18638 | }, {
|
18639 | transform: translate3d()
|
18640 | }), Animit(enterPageDecomposition.toolbar, _this2.def).default({
|
18641 | opacity: 0
|
18642 | }, {
|
18643 | opacity: 1
|
18644 | }), Animit(enterPageDecomposition.toolbarCenter, _this2.def).default({
|
18645 | transform: translate3d('125%'),
|
18646 | opacity: 1
|
18647 | }, {
|
18648 | transform: translate3d(),
|
18649 | opacity: 1
|
18650 | }), Animit(enterPageDecomposition.backButtonLabel, _this2.def).default({
|
18651 | transform: translate3d("".concat(delta.title, "px")),
|
18652 | opacity: 0
|
18653 | }, {
|
18654 | transform: translate3d(),
|
18655 | opacity: 1,
|
18656 | transition: "opacity ".concat(_this2.duration, "s linear, transform ").concat(_this2.duration, "s ").concat(_this2.timing)
|
18657 | }), Animit(enterPageDecomposition.other, _this2.def).default({
|
18658 | opacity: 0
|
18659 | }, {
|
18660 | css: {
|
18661 | opacity: 1
|
18662 | },
|
18663 | timing: 'linear'
|
18664 | }), Animit([leavePageDecomposition.content, leavePageDecomposition.bottomToolbar, leavePageDecomposition.background], _this2.def).default({
|
18665 | transform: translate3d(),
|
18666 | opacity: 1
|
18667 | }, {
|
18668 | transform: translate3d('-25%'),
|
18669 | opacity: 0.9
|
18670 | }).queue(function (done) {
|
18671 | _this2.backgroundMask.remove();
|
18672 |
|
18673 | unblock();
|
18674 | callback();
|
18675 | done();
|
18676 | }), Animit(leavePageDecomposition.toolbarCenter, _this2.def).default({
|
18677 | transform: translate3d(),
|
18678 | opacity: 1
|
18679 | }, {
|
18680 | transform: translate3d("-".concat(delta.title, "px")),
|
18681 | opacity: 0,
|
18682 | transition: "opacity ".concat(_this2.duration, "s linear, transform ").concat(_this2.duration, "s ").concat(_this2.timing)
|
18683 | }), Animit(leavePageDecomposition.backButtonLabel, _this2.def).default({
|
18684 | transform: translate3d(),
|
18685 | opacity: 1
|
18686 | }, {
|
18687 | transform: translate3d("-".concat(delta.label, "px")),
|
18688 | opacity: 0
|
18689 | }), Animit(leavePageDecomposition.other, _this2.def).default({
|
18690 | opacity: 1
|
18691 | }, {
|
18692 | css: {
|
18693 | opacity: 0
|
18694 | },
|
18695 | timing: 'linear'
|
18696 | }));
|
18697 | } else {
|
18698 | Animit.runAll(Animit(enterPage, _this2.def).default({
|
18699 | transform: translate3d('100%')
|
18700 | }, {
|
18701 | transform: translate3d()
|
18702 | }), Animit(leavePage, _this2.def).default({
|
18703 | transform: translate3d(),
|
18704 | opacity: 1
|
18705 | }, {
|
18706 | transform: translate3d('-25%'),
|
18707 | opacity: .9
|
18708 | }).queue(function (done) {
|
18709 | _this2.backgroundMask.remove();
|
18710 |
|
18711 | unblock();
|
18712 | callback();
|
18713 | done();
|
18714 | }));
|
18715 | }
|
18716 | });
|
18717 | }
|
18718 | /**
|
18719 | * @param {Object} enterPage
|
18720 | * @param {Object} leavePage
|
18721 | * @param {Function} callback
|
18722 | */
|
18723 |
|
18724 | }, {
|
18725 | key: "pop",
|
18726 | value: function pop(enterPage, leavePage, callback) {
|
18727 | var _this3 = this;
|
18728 |
|
18729 | if (this.isSwiping) {
|
18730 | return this.popSwipe(enterPage, leavePage, callback);
|
18731 | }
|
18732 |
|
18733 | this.backgroundMask.remove();
|
18734 | enterPage.parentNode.insertBefore(this.backgroundMask, enterPage);
|
18735 |
|
18736 | var unblock = _get(_getPrototypeOf(IOSSlideNavigatorAnimator.prototype), "block", this).call(this, enterPage);
|
18737 |
|
18738 | var enterPageTarget = util$4.findToolbarPage(enterPage) || enterPage;
|
18739 | var leavePageTarget = util$4.findToolbarPage(leavePage) || leavePage;
|
18740 |
|
18741 | var enterPageDecomposition = this._decompose(enterPageTarget);
|
18742 |
|
18743 | var leavePageDecomposition = this._decompose(leavePageTarget);
|
18744 |
|
18745 | var delta = this._calculateDelta(leavePage, leavePageDecomposition);
|
18746 |
|
18747 | var shouldAnimateToolbar = this._shouldAnimateToolbar(enterPageTarget, leavePageTarget);
|
18748 |
|
18749 | if (shouldAnimateToolbar) {
|
18750 | Animit.runAll(Animit([enterPageDecomposition.content, enterPageDecomposition.bottomToolbar, enterPageDecomposition.background], this.def).default({
|
18751 | transform: translate3d('-25%'),
|
18752 | opacity: .9
|
18753 | }, {
|
18754 | transform: translate3d(),
|
18755 | opacity: 1
|
18756 | }), Animit(enterPageDecomposition.toolbarCenter, this.def).default({
|
18757 | transform: translate3d("-".concat(delta.title, "px")),
|
18758 | opacity: 0
|
18759 | }, {
|
18760 | transform: translate3d(),
|
18761 | opacity: 1,
|
18762 | transition: "opacity ".concat(this.duration, "s linear, transform ").concat(this.duration, "s ").concat(this.timing)
|
18763 | }), Animit(enterPageDecomposition.backButtonLabel, this.def).default({
|
18764 | transform: translate3d("-".concat(delta.label, "px"))
|
18765 | }, {
|
18766 | transform: translate3d()
|
18767 | }), Animit(enterPageDecomposition.other, this.def).default({
|
18768 | opacity: 0
|
18769 | }, {
|
18770 | css: {
|
18771 | opacity: 1
|
18772 | },
|
18773 | timing: 'linear'
|
18774 | }), Animit([leavePageDecomposition.content, leavePageDecomposition.bottomToolbar, leavePageDecomposition.background], this.def).default({
|
18775 | transform: translate3d()
|
18776 | }, {
|
18777 | transform: translate3d('100%')
|
18778 | }).wait(0).queue(function (done) {
|
18779 | _this3.backgroundMask.remove();
|
18780 |
|
18781 | unblock();
|
18782 | callback();
|
18783 | done();
|
18784 | }), Animit(leavePageDecomposition.toolbar, this.def).default({
|
18785 | opacity: 1
|
18786 | }, {
|
18787 | opacity: 0
|
18788 | }), Animit(leavePageDecomposition.toolbarCenter, this.def).default({
|
18789 | transform: translate3d()
|
18790 | }, {
|
18791 | transform: translate3d('125%')
|
18792 | }), Animit(leavePageDecomposition.backButtonLabel, this.def).default({
|
18793 | transform: translate3d(),
|
18794 | opacity: 1
|
18795 | }, {
|
18796 | transform: translate3d("".concat(delta.title, "px")),
|
18797 | opacity: 0,
|
18798 | transition: "opacity ".concat(this.duration, "s linear, transform ").concat(this.duration, "s ").concat(this.timing)
|
18799 | }));
|
18800 | } else {
|
18801 | Animit.runAll(Animit(enterPage, this.def).default({
|
18802 | transform: translate3d('-25%'),
|
18803 | opacity: .9
|
18804 | }, {
|
18805 | transform: translate3d(),
|
18806 | opacity: 1
|
18807 | }), Animit(leavePage, this.def).default({
|
18808 | transform: translate3d()
|
18809 | }, {
|
18810 | transform: translate3d('100%')
|
18811 | }).queue(function (done) {
|
18812 | _this3.backgroundMask.remove();
|
18813 |
|
18814 | unblock();
|
18815 | callback();
|
18816 | done();
|
18817 | }));
|
18818 | }
|
18819 | }
|
18820 | }]);
|
18821 |
|
18822 | return IOSSlideNavigatorAnimator;
|
18823 | }(IOSSwipeNavigatorAnimator);
|
18824 |
|
18825 | /**
|
18826 | * Lift screen transition.
|
18827 | */
|
18828 |
|
18829 | var IOSLiftNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
|
18830 | _inherits(IOSLiftNavigatorAnimator, _NavigatorAnimator);
|
18831 |
|
18832 | var _super = _createSuper(IOSLiftNavigatorAnimator);
|
18833 |
|
18834 | function IOSLiftNavigatorAnimator() {
|
18835 | var _this;
|
18836 |
|
18837 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
18838 | _ref$timing = _ref.timing,
|
18839 | timing = _ref$timing === void 0 ? 'cubic-bezier(.1, .7, .1, 1)' : _ref$timing,
|
18840 | _ref$delay = _ref.delay,
|
18841 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
18842 | _ref$duration = _ref.duration,
|
18843 | duration = _ref$duration === void 0 ? 0.4 : _ref$duration;
|
18844 |
|
18845 | _classCallCheck(this, IOSLiftNavigatorAnimator);
|
18846 |
|
18847 | _this = _super.call(this, {
|
18848 | timing: timing,
|
18849 | delay: delay,
|
18850 | duration: duration
|
18851 | });
|
18852 | _this.backgroundMask = util$4.createElement('<div style="position: absolute; width: 100%; height: 100%;' + 'background: linear-gradient(black, white);"></div>');
|
18853 | return _this;
|
18854 | }
|
18855 | /**
|
18856 | * @param {Object} enterPage
|
18857 | * @param {Object} leavePage
|
18858 | * @param {Function} callback
|
18859 | */
|
18860 |
|
18861 |
|
18862 | _createClass(IOSLiftNavigatorAnimator, [{
|
18863 | key: "push",
|
18864 | value: function push(enterPage, leavePage, callback) {
|
18865 | var _this2 = this;
|
18866 |
|
18867 | this.backgroundMask.remove();
|
18868 | leavePage.parentNode.insertBefore(this.backgroundMask, leavePage);
|
18869 |
|
18870 | var unblock = _get(_getPrototypeOf(IOSLiftNavigatorAnimator.prototype), "block", this).call(this, enterPage);
|
18871 |
|
18872 | Animit.runAll(Animit(enterPage, this.def).default({
|
18873 | transform: 'translate3D(0, 100%, 0)'
|
18874 | }, {
|
18875 | transform: 'translate3D(0, 0, 0)'
|
18876 | }), Animit(leavePage, this.def).default({
|
18877 | transform: 'translate3D(0, 0, 0)',
|
18878 | opacity: 1
|
18879 | }, {
|
18880 | transform: 'translate3D(0, -10%, 0)',
|
18881 | opacity: .9
|
18882 | }).queue(function (done) {
|
18883 | _this2.backgroundMask.remove();
|
18884 |
|
18885 | unblock();
|
18886 | callback();
|
18887 | done();
|
18888 | }));
|
18889 | }
|
18890 | /**
|
18891 | * @param {Object} enterPage
|
18892 | * @param {Object} leavePage
|
18893 | * @param {Function} callback
|
18894 | */
|
18895 |
|
18896 | }, {
|
18897 | key: "pop",
|
18898 | value: function pop(enterPage, leavePage, callback) {
|
18899 | var _this3 = this;
|
18900 |
|
18901 | this.backgroundMask.remove();
|
18902 | enterPage.parentNode.insertBefore(this.backgroundMask, enterPage);
|
18903 |
|
18904 | var unblock = _get(_getPrototypeOf(IOSLiftNavigatorAnimator.prototype), "block", this).call(this, enterPage);
|
18905 |
|
18906 | Animit.runAll(Animit(enterPage, this.def).default({
|
18907 | transform: 'translate3D(0, -43px, 0)',
|
18908 | opacity: .9
|
18909 | }, {
|
18910 | transform: 'translate3D(0, 0, 0)',
|
18911 | opacity: 1
|
18912 | }).queue(function (done) {
|
18913 | _this3.backgroundMask.remove();
|
18914 |
|
18915 | unblock();
|
18916 | callback();
|
18917 | done();
|
18918 | }), Animit(leavePage, this.def).default({
|
18919 | transform: 'translate3D(0, 0, 0)'
|
18920 | }, {
|
18921 | transform: 'translate3D(0, 100%, 0)'
|
18922 | }));
|
18923 | }
|
18924 | }]);
|
18925 |
|
18926 | return IOSLiftNavigatorAnimator;
|
18927 | }(NavigatorAnimator);
|
18928 |
|
18929 | var transform = 'translate3d(0, 0, 0)';
|
18930 | /**
|
18931 | * Fade-in screen transition.
|
18932 | */
|
18933 |
|
18934 | var IOSFadeNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
|
18935 | _inherits(IOSFadeNavigatorAnimator, _NavigatorAnimator);
|
18936 |
|
18937 | var _super = _createSuper(IOSFadeNavigatorAnimator);
|
18938 |
|
18939 | function IOSFadeNavigatorAnimator() {
|
18940 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
18941 | _ref$timing = _ref.timing,
|
18942 | timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
|
18943 | _ref$delay = _ref.delay,
|
18944 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
18945 | _ref$duration = _ref.duration,
|
18946 | duration = _ref$duration === void 0 ? 0.4 : _ref$duration;
|
18947 |
|
18948 | _classCallCheck(this, IOSFadeNavigatorAnimator);
|
18949 |
|
18950 | return _super.call(this, {
|
18951 | timing: timing,
|
18952 | delay: delay,
|
18953 | duration: duration
|
18954 | });
|
18955 | }
|
18956 | /**
|
18957 | * @param {Object} enterPage
|
18958 | * @param {Object} leavePage
|
18959 | * @param {Function} callback
|
18960 | */
|
18961 |
|
18962 |
|
18963 | _createClass(IOSFadeNavigatorAnimator, [{
|
18964 | key: "push",
|
18965 | value: function push(enterPage, leavePage, callback) {
|
18966 | var unblock = _get(_getPrototypeOf(IOSFadeNavigatorAnimator.prototype), "block", this).call(this, enterPage);
|
18967 |
|
18968 | Animit.runAll(Animit(enterPage, this.def).default({
|
18969 | transform: transform,
|
18970 | opacity: 0
|
18971 | }, {
|
18972 | transform: transform,
|
18973 | opacity: 1
|
18974 | }).queue(function (done) {
|
18975 | unblock();
|
18976 | callback();
|
18977 | done();
|
18978 | }));
|
18979 | }
|
18980 | /**
|
18981 | * @param {Object} enterPage
|
18982 | * @param {Object} leavePage
|
18983 | * @param {Function} done
|
18984 | */
|
18985 |
|
18986 | }, {
|
18987 | key: "pop",
|
18988 | value: function pop(enterPage, leavePage, callback) {
|
18989 | var unblock = _get(_getPrototypeOf(IOSFadeNavigatorAnimator.prototype), "block", this).call(this, enterPage);
|
18990 |
|
18991 | Animit.runAll(Animit(leavePage, this.def).default({
|
18992 | transform: transform,
|
18993 | opacity: 1
|
18994 | }, {
|
18995 | transform: transform,
|
18996 | opacity: 0
|
18997 | }).queue(function (done) {
|
18998 | unblock();
|
18999 | callback();
|
19000 | done();
|
19001 | }));
|
19002 | }
|
19003 | }]);
|
19004 |
|
19005 | return IOSFadeNavigatorAnimator;
|
19006 | }(NavigatorAnimator);
|
19007 |
|
19008 | /**
|
19009 | * Slide animator for navigator transition.
|
19010 | */
|
19011 |
|
19012 | var MDSlideNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
|
19013 | _inherits(MDSlideNavigatorAnimator, _NavigatorAnimator);
|
19014 |
|
19015 | var _super = _createSuper(MDSlideNavigatorAnimator);
|
19016 |
|
19017 | function MDSlideNavigatorAnimator() {
|
19018 | var _this;
|
19019 |
|
19020 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
19021 | _ref$timing = _ref.timing,
|
19022 | timing = _ref$timing === void 0 ? 'cubic-bezier(.1, .7, .4, 1)' : _ref$timing,
|
19023 | _ref$delay = _ref.delay,
|
19024 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
19025 | _ref$duration = _ref.duration,
|
19026 | duration = _ref$duration === void 0 ? 0.3 : _ref$duration;
|
19027 |
|
19028 | _classCallCheck(this, MDSlideNavigatorAnimator);
|
19029 |
|
19030 | _this = _super.call(this, {
|
19031 | timing: timing,
|
19032 | delay: delay,
|
19033 | duration: duration
|
19034 | });
|
19035 | _this.blackMaskOpacity = 0.4;
|
19036 | _this.backgroundMask = util$4.createElement('<div style="position: absolute; width: 100%; height: 100%; z-index: 2;' + 'background-color: black; opacity: 0;"></div>');
|
19037 | return _this;
|
19038 | }
|
19039 | /**
|
19040 | * @param {Object} enterPage
|
19041 | * @param {Object} leavePage
|
19042 | * @param {Function} callback
|
19043 | */
|
19044 |
|
19045 |
|
19046 | _createClass(MDSlideNavigatorAnimator, [{
|
19047 | key: "push",
|
19048 | value: function push(enterPage, leavePage, callback) {
|
19049 | var _this2 = this;
|
19050 |
|
19051 | this.backgroundMask.remove();
|
19052 | leavePage.parentElement.insertBefore(this.backgroundMask, leavePage.nextSibling);
|
19053 |
|
19054 | var unblock = _get(_getPrototypeOf(MDSlideNavigatorAnimator.prototype), "block", this).call(this, enterPage);
|
19055 |
|
19056 | Animit.runAll(Animit(this.backgroundMask, this.def).default({
|
19057 | transform: 'translate3d(0, 0, 0)',
|
19058 | opacity: 0
|
19059 | }, {
|
19060 | opacity: this.blackMaskOpacity
|
19061 | }).queue(function (done) {
|
19062 | _this2.backgroundMask.remove();
|
19063 |
|
19064 | done();
|
19065 | }), Animit(enterPage, this.def).default({
|
19066 | transform: 'translate3d(100%, 0, 0)'
|
19067 | }, {
|
19068 | transform: 'translate3d(0, 0, 0)'
|
19069 | }), Animit(leavePage, this.def).default({
|
19070 | transform: 'translate3d(0, 0, 0)'
|
19071 | }, {
|
19072 | transform: 'translate3d(-45%, 0, 0)'
|
19073 | }).queue(function (done) {
|
19074 | unblock();
|
19075 | callback();
|
19076 | done();
|
19077 | }));
|
19078 | }
|
19079 | /**
|
19080 | * @param {Object} enterPage
|
19081 | * @param {Object} leavePage
|
19082 | * @param {Function} callback
|
19083 | */
|
19084 |
|
19085 | }, {
|
19086 | key: "pop",
|
19087 | value: function pop(enterPage, leavePage, callback) {
|
19088 | var _this3 = this;
|
19089 |
|
19090 | this.backgroundMask.remove();
|
19091 | enterPage.parentNode.insertBefore(this.backgroundMask, enterPage.nextSibling);
|
19092 |
|
19093 | var unblock = _get(_getPrototypeOf(MDSlideNavigatorAnimator.prototype), "block", this).call(this, enterPage);
|
19094 |
|
19095 | Animit.runAll(Animit(this.backgroundMask, this.def).default({
|
19096 | transform: 'translate3d(0, 0, 0)',
|
19097 | opacity: this.blackMaskOpacity
|
19098 | }, {
|
19099 | opacity: 0
|
19100 | }).queue(function (done) {
|
19101 | _this3.backgroundMask.remove();
|
19102 |
|
19103 | done();
|
19104 | }), Animit(enterPage, this.def).default({
|
19105 | transform: 'translate3d(-45%, 0, 0)',
|
19106 | opacity: .9
|
19107 | }, {
|
19108 | transform: 'translate3d(0, 0, 0)',
|
19109 | opacity: 1
|
19110 | }), Animit(leavePage, this.def).default({
|
19111 | transform: 'translate3d(0, 0, 0)'
|
19112 | }, {
|
19113 | transform: 'translate3d(100%, 0, 0)'
|
19114 | }).queue(function (done) {
|
19115 | unblock();
|
19116 | callback();
|
19117 | done();
|
19118 | }));
|
19119 | }
|
19120 | }]);
|
19121 |
|
19122 | return MDSlideNavigatorAnimator;
|
19123 | }(NavigatorAnimator);
|
19124 |
|
19125 | /**
|
19126 | * Lift screen transition.
|
19127 | */
|
19128 |
|
19129 | var MDLiftNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
|
19130 | _inherits(MDLiftNavigatorAnimator, _NavigatorAnimator);
|
19131 |
|
19132 | var _super = _createSuper(MDLiftNavigatorAnimator);
|
19133 |
|
19134 | function MDLiftNavigatorAnimator() {
|
19135 | var _this;
|
19136 |
|
19137 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
19138 | _ref$timing = _ref.timing,
|
19139 | timing = _ref$timing === void 0 ? 'cubic-bezier(.1, .7, .1, 1)' : _ref$timing,
|
19140 | _ref$delay = _ref.delay,
|
19141 | delay = _ref$delay === void 0 ? 0.05 : _ref$delay,
|
19142 | _ref$duration = _ref.duration,
|
19143 | duration = _ref$duration === void 0 ? 0.4 : _ref$duration;
|
19144 |
|
19145 | _classCallCheck(this, MDLiftNavigatorAnimator);
|
19146 |
|
19147 | _this = _super.call(this, {
|
19148 | timing: timing,
|
19149 | delay: delay,
|
19150 | duration: duration
|
19151 | });
|
19152 | _this.backgroundMask = util$4.createElement('<div style="position: absolute; width: 100%; height: 100%;' + 'background-color: black;"></div>');
|
19153 | return _this;
|
19154 | }
|
19155 | /**
|
19156 | * @param {Object} enterPage
|
19157 | * @param {Object} leavePage
|
19158 | * @param {Function} callback
|
19159 | */
|
19160 |
|
19161 |
|
19162 | _createClass(MDLiftNavigatorAnimator, [{
|
19163 | key: "push",
|
19164 | value: function push(enterPage, leavePage, callback) {
|
19165 | var _this2 = this;
|
19166 |
|
19167 | this.backgroundMask.remove();
|
19168 | leavePage.parentNode.insertBefore(this.backgroundMask, leavePage);
|
19169 |
|
19170 | var unblock = _get(_getPrototypeOf(MDLiftNavigatorAnimator.prototype), "block", this).call(this, enterPage);
|
19171 |
|
19172 | var maskClear = Animit(this.backgroundMask).wait(this.delay + this.duration).queue(function (done) {
|
19173 | _this2.backgroundMask.remove();
|
19174 |
|
19175 | done();
|
19176 | });
|
19177 | Animit.runAll(maskClear, Animit(enterPage, this.def).default({
|
19178 | transform: 'translate3d(0, 100%, 0)'
|
19179 | }, {
|
19180 | transform: 'translate3d(0, 0, 0)'
|
19181 | }), Animit(leavePage, this.def).default({
|
19182 | opacity: 1
|
19183 | }, {
|
19184 | opacity: .4
|
19185 | }).queue(function (done) {
|
19186 | unblock();
|
19187 | callback();
|
19188 | done();
|
19189 | }));
|
19190 | }
|
19191 | /**
|
19192 | * @param {Object} enterPage
|
19193 | * @param {Object} leavePage
|
19194 | * @param {Function} callback
|
19195 | */
|
19196 |
|
19197 | }, {
|
19198 | key: "pop",
|
19199 | value: function pop(enterPage, leavePage, callback) {
|
19200 | var _this3 = this;
|
19201 |
|
19202 | this.backgroundMask.remove();
|
19203 | enterPage.parentNode.insertBefore(this.backgroundMask, enterPage);
|
19204 |
|
19205 | var unblock = _get(_getPrototypeOf(MDLiftNavigatorAnimator.prototype), "block", this).call(this, enterPage);
|
19206 |
|
19207 | Animit.runAll(Animit(this.backgroundMask).wait(this.delay + this.duration).queue(function (done) {
|
19208 | _this3.backgroundMask.remove();
|
19209 |
|
19210 | done();
|
19211 | }), Animit(enterPage, this.def).default({
|
19212 | opacity: .4
|
19213 | }, {
|
19214 | opacity: 1
|
19215 | }).queue(function (done) {
|
19216 | unblock();
|
19217 | callback();
|
19218 | done();
|
19219 | }), Animit(leavePage, this.def).default({
|
19220 | transform: 'translate3d(0, 0, 0)'
|
19221 | }, {
|
19222 | transform: 'translate3d(0, 100%, 0)'
|
19223 | }));
|
19224 | }
|
19225 | }]);
|
19226 |
|
19227 | return MDLiftNavigatorAnimator;
|
19228 | }(NavigatorAnimator);
|
19229 |
|
19230 | /**
|
19231 | * Fade-in + Lift screen transition.
|
19232 | */
|
19233 |
|
19234 | var MDFadeNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
|
19235 | _inherits(MDFadeNavigatorAnimator, _NavigatorAnimator);
|
19236 |
|
19237 | var _super = _createSuper(MDFadeNavigatorAnimator);
|
19238 |
|
19239 | function MDFadeNavigatorAnimator() {
|
19240 | var _this;
|
19241 |
|
19242 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
19243 | _ref$timing = _ref.timing,
|
19244 | timing = _ref$timing === void 0 ? 'cubic-bezier(0.4, 0, 0.2, 1)' : _ref$timing,
|
19245 | _ref$timingPop = _ref.timingPop,
|
19246 | timingPop = _ref$timingPop === void 0 ? 'cubic-bezier(0.4, 0, 1, 1)' : _ref$timingPop,
|
19247 | _ref$delay = _ref.delay,
|
19248 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
19249 | _ref$duration = _ref.duration,
|
19250 | duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
|
19251 |
|
19252 | _classCallCheck(this, MDFadeNavigatorAnimator);
|
19253 |
|
19254 | _this = _super.call(this, {
|
19255 | timing: timing,
|
19256 | delay: delay,
|
19257 | duration: duration
|
19258 | });
|
19259 | _this.timingPop = timingPop;
|
19260 | return _this;
|
19261 | }
|
19262 | /**
|
19263 | * @param {Object} enterPage
|
19264 | * @param {Object} leavePage
|
19265 | * @param {Function} callback
|
19266 | */
|
19267 |
|
19268 |
|
19269 | _createClass(MDFadeNavigatorAnimator, [{
|
19270 | key: "push",
|
19271 | value: function push(enterPage, leavePage, callback) {
|
19272 | var unblock = _get(_getPrototypeOf(MDFadeNavigatorAnimator.prototype), "block", this).call(this, enterPage);
|
19273 |
|
19274 | Animit.runAll(Animit(enterPage, this.def).default({
|
19275 | transform: 'translate3D(0, 42px, 0)',
|
19276 | opacity: 0
|
19277 | }, {
|
19278 | transform: 'translate3D(0, 0, 0)',
|
19279 | opacity: 1
|
19280 | }).queue(function (done) {
|
19281 | unblock();
|
19282 | callback();
|
19283 | done();
|
19284 | }));
|
19285 | }
|
19286 | /**
|
19287 | * @param {Object} enterPage
|
19288 | * @param {Object} leavePage
|
19289 | * @param {Function} done
|
19290 | */
|
19291 |
|
19292 | }, {
|
19293 | key: "pop",
|
19294 | value: function pop(enterPage, leavePage, callback) {
|
19295 | var unblock = _get(_getPrototypeOf(MDFadeNavigatorAnimator.prototype), "block", this).call(this, enterPage);
|
19296 |
|
19297 | Animit.runAll(Animit(leavePage, this.def).default({
|
19298 | transform: 'translate3D(0, 0, 0)',
|
19299 | opacity: 1
|
19300 | }, {
|
19301 | css: {
|
19302 | transform: 'translate3D(0, 38px, 0)',
|
19303 | opacity: 0
|
19304 | },
|
19305 | timing: this.timingPop
|
19306 | }).queue(function (done) {
|
19307 | unblock();
|
19308 | callback();
|
19309 | done();
|
19310 | }));
|
19311 | }
|
19312 | }]);
|
19313 |
|
19314 | return MDFadeNavigatorAnimator;
|
19315 | }(NavigatorAnimator);
|
19316 |
|
19317 | var NoneNavigatorAnimator = /*#__PURE__*/function (_NavigatorAnimator) {
|
19318 | _inherits(NoneNavigatorAnimator, _NavigatorAnimator);
|
19319 |
|
19320 | var _super = _createSuper(NoneNavigatorAnimator);
|
19321 |
|
19322 | function NoneNavigatorAnimator(options) {
|
19323 | _classCallCheck(this, NoneNavigatorAnimator);
|
19324 |
|
19325 | return _super.call(this, options);
|
19326 | }
|
19327 |
|
19328 | _createClass(NoneNavigatorAnimator, [{
|
19329 | key: "push",
|
19330 | value: function push(enterPage, leavePage, callback) {
|
19331 | callback();
|
19332 | }
|
19333 | }, {
|
19334 | key: "pop",
|
19335 | value: function pop(enterPage, leavePage, callback) {
|
19336 | callback();
|
19337 | }
|
19338 | }]);
|
19339 |
|
19340 | return NoneNavigatorAnimator;
|
19341 | }(NavigatorAnimator);
|
19342 |
|
19343 | var _animatorDict$3 = {
|
19344 | 'default': function _default() {
|
19345 | return platform.isAndroid() ? MDFadeNavigatorAnimator : IOSSlideNavigatorAnimator;
|
19346 | },
|
19347 | 'slide': function slide() {
|
19348 | return platform.isAndroid() ? MDSlideNavigatorAnimator : IOSSlideNavigatorAnimator;
|
19349 | },
|
19350 | 'lift': function lift() {
|
19351 | return platform.isAndroid() ? MDLiftNavigatorAnimator : IOSLiftNavigatorAnimator;
|
19352 | },
|
19353 | 'fade': function fade() {
|
19354 | return platform.isAndroid() ? MDFadeNavigatorAnimator : IOSFadeNavigatorAnimator;
|
19355 | },
|
19356 | 'slide-ios': IOSSlideNavigatorAnimator,
|
19357 | 'slide-md': MDSlideNavigatorAnimator,
|
19358 | 'lift-ios': IOSLiftNavigatorAnimator,
|
19359 | 'lift-md': MDLiftNavigatorAnimator,
|
19360 | 'fade-ios': IOSFadeNavigatorAnimator,
|
19361 | 'fade-md': MDFadeNavigatorAnimator,
|
19362 | 'none': NoneNavigatorAnimator
|
19363 | };
|
19364 | var rewritables$3 = {
|
19365 | /**
|
19366 | * @param {Element} navigatorSideElement
|
19367 | * @param {Function} callback
|
19368 | */
|
19369 | ready: function ready(navigatorElement, callback) {
|
19370 | callback();
|
19371 | }
|
19372 | };
|
19373 |
|
19374 | var verifyPageElement = function verifyPageElement(el) {
|
19375 | return el.nodeName !== 'ONS-PAGE' && util$4.throw('Only page elements can be children of navigator');
|
19376 | };
|
19377 | /**
|
19378 | * @element ons-navigator
|
19379 | * @category navigation
|
19380 | * @description
|
19381 | * [en]
|
19382 | * A component that provides page stack management and navigation. Stack navigation is the most common navigation pattern for mobile apps.
|
19383 | *
|
19384 | * When a page is pushed on top of the stack it is displayed with a transition animation. When the user returns to the previous page the top page will be popped from the top of the stack and hidden with an opposite transition animation.
|
19385 | * [/en]
|
19386 | * [ja][/ja]
|
19387 | * @codepen yrhtv
|
19388 | * @tutorial vanilla/Reference/navigator
|
19389 | * @guide lifecycle.html#events
|
19390 | * [en]Overview of page events[/en]
|
19391 | * [ja]Overview of page events[/ja]
|
19392 | * @seealso ons-toolbar
|
19393 | * [en]The `<ons-toolbar>` component is used to display a toolbar on the top of a page.[/en]
|
19394 | * [ja][/ja]
|
19395 | * @seealso ons-back-button
|
19396 | * [en]The `<ons-back-button>` component lets the user return to the previous page.[/en]
|
19397 | * [ja][/ja]
|
19398 | * @example
|
19399 | * <ons-navigator id="navigator">
|
19400 | * <ons-page>
|
19401 | * <ons-toolbar>
|
19402 | * <div class="center">
|
19403 | * Title
|
19404 | * </div>
|
19405 | * </ons-toolbar>
|
19406 | * <p>
|
19407 | * <ons-button
|
19408 | * onclick="document.getElementById('navigator').pushPage('page.html')">
|
19409 | * Push page
|
19410 | * </ons-button>
|
19411 | * </p>
|
19412 | * </ons-page>
|
19413 | * </ons-navigator>
|
19414 | *
|
19415 | * <template id="page.html">
|
19416 | * <ons-page>
|
19417 | * <ons-toolbar>
|
19418 | * <div class="left">
|
19419 | * <ons-back-button>Back</ons-back-button>
|
19420 | * </div>
|
19421 | * <div class="center">
|
19422 | * Another page
|
19423 | * </div>
|
19424 | * </ons-toolbar>
|
19425 | * </ons-page>
|
19426 | * </template>
|
19427 | */
|
19428 |
|
19429 |
|
19430 | var NavigatorElement = /*#__PURE__*/function (_BaseElement) {
|
19431 | _inherits(NavigatorElement, _BaseElement);
|
19432 |
|
19433 | var _super = _createSuper(NavigatorElement);
|
19434 |
|
19435 | function NavigatorElement() {
|
19436 | var _this;
|
19437 |
|
19438 | _classCallCheck(this, NavigatorElement);
|
19439 |
|
19440 | _this = _super.call(this);
|
19441 | _this._isRunning = false;
|
19442 | _this._initialized = false;
|
19443 | _this._pageLoader = defaultPageLoader;
|
19444 | _this._pageMap = new WeakMap();
|
19445 |
|
19446 | _this._updateAnimatorFactory();
|
19447 |
|
19448 | return _this;
|
19449 | }
|
19450 | /**
|
19451 | * @property pageLoader
|
19452 | * @type {PageLoader}
|
19453 | * @description
|
19454 | * [en]PageLoader instance. It can be overriden to change the way pages are loaded by this element. Useful for lib developers.[/en]
|
19455 | * [ja]PageLoaderインスタンスを格納しています。[/ja]
|
19456 | */
|
19457 |
|
19458 |
|
19459 | _createClass(NavigatorElement, [{
|
19460 | key: "animatorFactory",
|
19461 | get:
|
19462 | /**
|
19463 | * @attribute page
|
19464 | * @initonly
|
19465 | * @type {String}
|
19466 | * @description
|
19467 | * [en]First page to show when navigator is initialized.[/en]
|
19468 | * [ja]ナビゲーターが初期化された時に表示するページを指定します。[/ja]
|
19469 | */
|
19470 |
|
19471 | /**
|
19472 | * @attribute swipeable
|
19473 | * @type {Boolean}
|
19474 | * @description
|
19475 | * [en]Enable iOS "swipe to pop" feature.[/en]
|
19476 | * [ja][/ja]
|
19477 | */
|
19478 |
|
19479 | /**
|
19480 | * @attribute swipe-target-width
|
19481 | * @type {String}
|
19482 | * @default 20px
|
19483 | * @description
|
19484 | * [en]The width of swipeable area calculated from the edge (in pixels). Use this to enable swipe only when the finger touch on the screen edge.[/en]
|
19485 | * [ja]スワイプの判定領域をピクセル単位で指定します。画面の端から指定した距離に達するとページが表示されます。[/ja]
|
19486 | */
|
19487 |
|
19488 | /**
|
19489 | * @attribute swipe-threshold
|
19490 | * @type {Number}
|
19491 | * @default 0.2
|
19492 | * @description
|
19493 | * [en]Specify how much the page needs to be swiped before popping. A value between `0` and `1`.[/en]
|
19494 | * [ja][/ja]
|
19495 | */
|
19496 |
|
19497 | /**
|
19498 | * @attribute animation
|
19499 | * @type {String}
|
19500 | * @default default
|
19501 | * @description
|
19502 | * [en]
|
19503 | * Animation name. Available animations are `"slide"`, `"lift"`, `"fade"` and `"none"`.
|
19504 | *
|
19505 | * These are platform based animations. For fixed animations, add `"-ios"` or `"-md"` suffix to the animation name. E.g. `"lift-ios"`, `"lift-md"`. Defaults values are `"slide-ios"` and `"fade-md"` depending on the platform.
|
19506 | * [/en]
|
19507 | * [ja][/ja]
|
19508 | */
|
19509 |
|
19510 | /**
|
19511 | * @attribute animation-options
|
19512 | * @type {Expression}
|
19513 | * @description
|
19514 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/en]
|
19515 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/ja]
|
19516 | */
|
19517 |
|
19518 | /**
|
19519 | * @property animationOptions
|
19520 | * @type {Object}
|
19521 | * @description
|
19522 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/en]
|
19523 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`[/ja]
|
19524 | */
|
19525 |
|
19526 | /**
|
19527 | * @event prepush
|
19528 | * @description
|
19529 | * [en]Fired just before a page is pushed.[/en]
|
19530 | * [ja]pageがpushされる直前に発火されます。[/ja]
|
19531 | * @param {Object} event [en]Event object.[/en]
|
19532 | * @param {Object} event.navigator
|
19533 | * [en]Component object.[/en]
|
19534 | * [ja]コンポーネントのオブジェクト。[/ja]
|
19535 | * @param {Object} event.currentPage
|
19536 | * [en]Current page object.[/en]
|
19537 | * [ja]現在のpageオブジェクト。[/ja]
|
19538 | * @param {Function} event.cancel
|
19539 | * [en]Call this function to cancel the push.[/en]
|
19540 | * [ja]この関数を呼び出すと、push処理がキャンセルされます。[/ja]
|
19541 | */
|
19542 |
|
19543 | /**
|
19544 | * @event prepop
|
19545 | * @description
|
19546 | * [en]Fired just before a page is popped.[/en]
|
19547 | * [ja]pageがpopされる直前に発火されます。[/ja]
|
19548 | * @param {Object} event [en]Event object.[/en]
|
19549 | * @param {Object} event.navigator
|
19550 | * [en]Component object.[/en]
|
19551 | * [ja]コンポーネントのオブジェクト。[/ja]
|
19552 | * @param {Object} event.currentPage
|
19553 | * [en]Current page object.[/en]
|
19554 | * [ja]現在のpageオブジェクト。[/ja]
|
19555 | * @param {Function} event.cancel
|
19556 | * [en]Call this function to cancel the pop.[/en]
|
19557 | * [ja]この関数を呼び出すと、pageのpopがキャンセルされます。[/ja]
|
19558 | */
|
19559 |
|
19560 | /**
|
19561 | * @event postpush
|
19562 | * @description
|
19563 | * [en]Fired just after a page is pushed.[/en]
|
19564 | * [ja]pageがpushされてアニメーションが終了してから発火されます。[/ja]
|
19565 | * @param {Object} event [en]Event object.[/en]
|
19566 | * @param {Object} event.navigator
|
19567 | * [en]Component object.[/en]
|
19568 | * [ja]コンポーネントのオブジェクト。[/ja]
|
19569 | * @param {Object} event.enterPage
|
19570 | * [en]Object of the next page.[/en]
|
19571 | * [ja]pushされたpageオブジェクト。[/ja]
|
19572 | * @param {Object} event.leavePage
|
19573 | * [en]Object of the previous page.[/en]
|
19574 | * [ja]以前のpageオブジェクト。[/ja]
|
19575 | */
|
19576 |
|
19577 | /**
|
19578 | * @event postpop
|
19579 | * @description
|
19580 | * [en]Fired just after a page is popped.[/en]
|
19581 | * [ja]pageがpopされてアニメーションが終わった後に発火されます。[/ja]
|
19582 | * @param {Object} event [en]Event object.[/en]
|
19583 | * @param {Object} event.navigator
|
19584 | * [en]Component object.[/en]
|
19585 | * [ja]コンポーネントのオブジェクト。[/ja]
|
19586 | * @param {Object} event.enterPage
|
19587 | * [en]Object of the next page.[/en]
|
19588 | * [ja]popされて表示されるページのオブジェクト。[/ja]
|
19589 | * @param {Object} event.leavePage
|
19590 | * [en]Object of the previous page.[/en]
|
19591 | * [ja]popされて消えるページのオブジェクト。[/ja]
|
19592 | * @param {Object} event.swipeToPop
|
19593 | * [en]True if the pop was triggered by the user swiping to pop.[/en]
|
19594 | * [ja][/ja]
|
19595 | * @param {Object} event.onsBackButton
|
19596 | * [en]True if the pop was caused by pressing an ons-back-button.[/en]
|
19597 | * [ja][/ja]
|
19598 | */
|
19599 |
|
19600 | /**
|
19601 | * @event swipe
|
19602 | * @description
|
19603 | * [en]Fired whenever the user slides the navigator (swipe-to-pop).[/en]
|
19604 | * [ja][/ja]
|
19605 | * @param {Object} event [en]Event object.[/en]
|
19606 | * @param {Object} event.ratio
|
19607 | * [en]Decimal ratio (0-1).[/en]
|
19608 | * [ja][/ja]
|
19609 | * @param {Object} event.animationOptions
|
19610 | * [en][/en]
|
19611 | * [ja][/ja]
|
19612 | */
|
19613 | function get() {
|
19614 | return this._animatorFactory;
|
19615 | }
|
19616 | }, {
|
19617 | key: "pageLoader",
|
19618 | get: function get() {
|
19619 | return this._pageLoader;
|
19620 | },
|
19621 | set: function set(pageLoader) {
|
19622 | if (!(pageLoader instanceof PageLoader)) {
|
19623 | util$4.throwPageLoader();
|
19624 | }
|
19625 |
|
19626 | this._pageLoader = pageLoader;
|
19627 | }
|
19628 | }, {
|
19629 | key: "_getPageTarget",
|
19630 | value: function _getPageTarget() {
|
19631 | return this._page || this.getAttribute('page');
|
19632 | }
|
19633 | /**
|
19634 | * @property page
|
19635 | * @type {*}
|
19636 | * @description
|
19637 | * [en]Specify the page to be loaded during initialization. This value takes precedence over the `page` attribute. Useful for lib developers.[/en]
|
19638 | * [ja]初期化時に読み込むページを指定します。`page`属性で指定した値よりも`page`プロパティに指定した値を優先します。[/ja]
|
19639 | */
|
19640 |
|
19641 | }, {
|
19642 | key: "page",
|
19643 | get: function get() {
|
19644 | return this._page;
|
19645 | },
|
19646 | set: function set(page) {
|
19647 | this._page = page;
|
19648 | }
|
19649 | }, {
|
19650 | key: "connectedCallback",
|
19651 | value: function connectedCallback() {
|
19652 | var _this2 = this;
|
19653 |
|
19654 | this.onDeviceBackButton = this._onDeviceBackButton.bind(this);
|
19655 |
|
19656 | if (!platform.isAndroid() || this.getAttribute('swipeable') === 'force') {
|
19657 | var swipeAnimator;
|
19658 | this._swipe = new SwipeReveal({
|
19659 | element: this,
|
19660 | getThreshold: function getThreshold() {
|
19661 | return Math.max(0.2, parseFloat(_this2.getAttribute('swipe-threshold')) || 0);
|
19662 | },
|
19663 | swipeMax: function swipeMax() {
|
19664 | var ratio = 1;
|
19665 | var animationOptions = {
|
19666 | duration: swipeAnimator.durationSwipe,
|
19667 | timing: swipeAnimator.timingSwipe
|
19668 | };
|
19669 | _this2._onSwipe && _this2._onSwipe(ratio, animationOptions);
|
19670 | util$4.triggerElementEvent(_this2, 'swipe', {
|
19671 | ratio: ratio,
|
19672 | animationOptions: animationOptions
|
19673 | });
|
19674 |
|
19675 | _this2[_this2.swipeMax ? 'swipeMax' : 'popPage']({
|
19676 | animator: swipeAnimator,
|
19677 | swipeToPop: true
|
19678 | });
|
19679 |
|
19680 | swipeAnimator = null;
|
19681 | },
|
19682 | swipeMid: function swipeMid(distance, width) {
|
19683 | var ratio = distance / width;
|
19684 | _this2._onSwipe && _this2._onSwipe(ratio);
|
19685 | util$4.triggerElementEvent(_this2, 'swipe', {
|
19686 | ratio: ratio
|
19687 | });
|
19688 | swipeAnimator.translate(distance, width, _this2.topPage.previousElementSibling, _this2.topPage);
|
19689 | },
|
19690 | swipeMin: function swipeMin() {
|
19691 | var ratio = 0;
|
19692 | var animationOptions = {
|
19693 | duration: swipeAnimator.durationRestore,
|
19694 | timing: swipeAnimator.timingSwipe
|
19695 | };
|
19696 | _this2._onSwipe && _this2._onSwipe(ratio, animationOptions);
|
19697 | util$4.triggerElementEvent(_this2, 'swipe', {
|
19698 | ratio: ratio,
|
19699 | animationOptions: animationOptions
|
19700 | });
|
19701 | swipeAnimator.restore(_this2.topPage.previousElementSibling, _this2.topPage);
|
19702 | swipeAnimator = null;
|
19703 | },
|
19704 | ignoreSwipe: function ignoreSwipe(event, distance) {
|
19705 | // Basic conditions
|
19706 | if (!_this2._isRunning && _this2.children.length > 1) {
|
19707 | // Area or directional issues
|
19708 | var area = parseInt(_this2.getAttribute('swipe-target-width') || 25, 10);
|
19709 |
|
19710 | if (event.gesture.direction === 'right' && area > distance) {
|
19711 | // Swipes on ons-back-button and its children
|
19712 | var isBB = function isBB(el) {
|
19713 | return /ons-back-button/i.test(el.tagName);
|
19714 | };
|
19715 |
|
19716 | if (!isBB(event.target) && !util$4.findParent(event.target, isBB, function (p) {
|
19717 | return /ons-page/i.test(p.tagName);
|
19718 | })) {
|
19719 | // Animator is swipeable
|
19720 | var animation = (_this2.topPage.pushedOptions || {}).animation || _this2.animatorFactory._animation;
|
19721 | var Animator = _animatorDict$3[animation] instanceof Function ? _animatorDict$3[animation].call() : _animatorDict$3[animation];
|
19722 |
|
19723 | if (typeof Animator !== 'undefined' && Animator.swipeable) {
|
19724 | swipeAnimator = new Animator(); // Prepare for the swipe
|
19725 |
|
19726 | return false;
|
19727 | }
|
19728 | }
|
19729 | }
|
19730 | }
|
19731 |
|
19732 | return true; // Ignore swipe
|
19733 | }
|
19734 | });
|
19735 | this.attributeChangedCallback('swipeable');
|
19736 | }
|
19737 |
|
19738 | if (this._initialized) {
|
19739 | return;
|
19740 | }
|
19741 |
|
19742 | this._initialized = true;
|
19743 | var deferred = util$4.defer();
|
19744 | this.loaded = deferred.promise;
|
19745 | rewritables$3.ready(this, function () {
|
19746 | var show = !util$4.hasAnyComponentAsParent(_this2);
|
19747 | var options = {
|
19748 | animation: 'none',
|
19749 | show: show
|
19750 | };
|
19751 |
|
19752 | if (_this2.pages.length === 0 && _this2._getPageTarget()) {
|
19753 | _this2.pushPage(_this2._getPageTarget(), options).then(function () {
|
19754 | return deferred.resolve();
|
19755 | });
|
19756 | } else if (_this2.pages.length > 0) {
|
19757 | for (var i = 0; i < _this2.pages.length; i++) {
|
19758 | verifyPageElement(_this2.pages[i]);
|
19759 | }
|
19760 |
|
19761 | if (_this2.topPage) {
|
19762 | contentReady(_this2.topPage, function () {
|
19763 | return setTimeout(function () {
|
19764 | deferred.resolve();
|
19765 | show && _this2.topPage._show();
|
19766 |
|
19767 | _this2._updateLastPageBackButton();
|
19768 | }, 0);
|
19769 | });
|
19770 | }
|
19771 | } else {
|
19772 | contentReady(_this2, function () {
|
19773 | if (_this2.pages.length === 0 && _this2._getPageTarget()) {
|
19774 | _this2.pushPage(_this2._getPageTarget(), options).then(function () {
|
19775 | return deferred.resolve();
|
19776 | });
|
19777 | } else {
|
19778 | deferred.resolve();
|
19779 | }
|
19780 | });
|
19781 | }
|
19782 | });
|
19783 | }
|
19784 | }, {
|
19785 | key: "_updateAnimatorFactory",
|
19786 | value: function _updateAnimatorFactory() {
|
19787 | this._animatorFactory = new AnimatorFactory({
|
19788 | animators: _animatorDict$3,
|
19789 | baseClass: NavigatorAnimator,
|
19790 | baseClassName: 'NavigatorAnimator',
|
19791 | defaultAnimation: this.getAttribute('animation')
|
19792 | });
|
19793 | }
|
19794 | }, {
|
19795 | key: "disconnectedCallback",
|
19796 | value: function disconnectedCallback() {
|
19797 | this._backButtonHandler.destroy();
|
19798 |
|
19799 | this._backButtonHandler = null;
|
19800 | this._swipe && this._swipe.dispose();
|
19801 | this._swipe = null;
|
19802 | }
|
19803 | }, {
|
19804 | key: "attributeChangedCallback",
|
19805 | value: function attributeChangedCallback(name, last, current) {
|
19806 | switch (name) {
|
19807 | case 'animation':
|
19808 | this._updateAnimatorFactory();
|
19809 |
|
19810 | break;
|
19811 |
|
19812 | case 'swipeable':
|
19813 | this._swipe && this._swipe.update();
|
19814 | break;
|
19815 | }
|
19816 | }
|
19817 | /**
|
19818 | * @method popPage
|
19819 | * @signature popPage([options])
|
19820 | * @param {Object} [options]
|
19821 | * [en]Parameter object.[/en]
|
19822 | * [ja]オプションを指定するオブジェクト。[/ja]
|
19823 | * @param {String} [options.animation]
|
19824 | * [en]
|
19825 | * Animation name. Available animations are `"slide"`, `"lift"`, `"fade"` and `"none"`.
|
19826 | *
|
19827 | * These are platform based animations. For fixed animations, add `"-ios"` or `"-md"` suffix to the animation name. E.g. `"lift-ios"`, `"lift-md"`. Defaults values are `"slide-ios"` and `"fade-md"`.
|
19828 | * [/en]
|
19829 | * [ja][/ja]
|
19830 | * @param {String} [options.animationOptions]
|
19831 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
|
19832 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
|
19833 | * @param {Function} [options.callback]
|
19834 | * [en]Function that is called when the transition has ended.[/en]
|
19835 | * [ja]このメソッドによる画面遷移が終了した際に呼び出される関数オブジェクトを指定します。[/ja]
|
19836 | * @param {Object} [options.data]
|
19837 | * [en]Custom data that will be stored in the new page element.[/en]
|
19838 | * [ja][/ja]
|
19839 | * @param {Number} [options.times]
|
19840 | * [en]Number of pages to be popped. Only one animation will be shown.[/en]
|
19841 | * [ja][/ja]
|
19842 | * @return {Promise}
|
19843 | * [en]Promise which resolves to the revealed page.[/en]
|
19844 | * [ja]明らかにしたページを解決するPromiseを返します。[/ja]
|
19845 | * @description
|
19846 | * [en]Pops the current page from the page stack. The previous page will be displayed.[/en]
|
19847 | * [ja]現在表示中のページをページスタックから取り除きます。一つ前のページに戻ります。[/ja]
|
19848 | */
|
19849 |
|
19850 | }, {
|
19851 | key: "popPage",
|
19852 | value: function popPage() {
|
19853 | var _this3 = this;
|
19854 |
|
19855 | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
19856 |
|
19857 | var _this$_preparePageAnd = this._preparePageAndOptions(null, options);
|
19858 |
|
19859 | options = _this$_preparePageAnd.options;
|
19860 |
|
19861 | if (util$4.isInteger(options.times) && options.times > 1) {
|
19862 | this._removePages(options.times);
|
19863 | }
|
19864 |
|
19865 | var popUpdate = function popUpdate() {
|
19866 | return new Promise(function (resolve) {
|
19867 | _this3._pageLoader.unload(_this3.pages[_this3.pages.length - 1]);
|
19868 |
|
19869 | resolve();
|
19870 | });
|
19871 | };
|
19872 |
|
19873 | return this._popPage(options, popUpdate);
|
19874 | }
|
19875 | }, {
|
19876 | key: "_popPage",
|
19877 | value: function _popPage(options) {
|
19878 | var _this4 = this;
|
19879 |
|
19880 | var update = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
|
19881 | return Promise.resolve();
|
19882 | };
|
19883 |
|
19884 | if (this._isRunning) {
|
19885 | return Promise.reject('popPage is already running.');
|
19886 | }
|
19887 |
|
19888 | if (this.pages.length <= 1) {
|
19889 | return Promise.reject('ons-navigator\'s page stack is empty.');
|
19890 | }
|
19891 |
|
19892 | if (this._emitPrePopEvent()) {
|
19893 | return Promise.reject('Canceled in prepop event.');
|
19894 | }
|
19895 |
|
19896 | var length = this.pages.length;
|
19897 | this._isRunning = true;
|
19898 | this.pages[length - 2].updateBackButton(length - 2 > 0);
|
19899 | return new Promise(function (resolve) {
|
19900 | var leavePage = _this4.pages[length - 1];
|
19901 | var enterPage = _this4.pages[length - 2];
|
19902 | options = util$4.extend({}, _this4.options || {}, options);
|
19903 |
|
19904 | if (options.data) {
|
19905 | enterPage.data = util$4.extend({}, enterPage.data || {}, options.data || {});
|
19906 | }
|
19907 |
|
19908 | var done = function done() {
|
19909 | update().then(function () {
|
19910 | _this4._isRunning = false;
|
19911 |
|
19912 | enterPage._show();
|
19913 |
|
19914 | util$4.triggerElementEvent(_this4, 'postpop', {
|
19915 | leavePage: leavePage,
|
19916 | enterPage: enterPage,
|
19917 | navigator: _this4,
|
19918 | swipeToPop: !!options.swipeToPop,
|
19919 | // whether the pop was triggered by the user swiping
|
19920 | onsBackButton: !!options.onsBackButton // whether the pop was triggered by clicking ons-back-button
|
19921 |
|
19922 | });
|
19923 | options.callback && options.callback(enterPage);
|
19924 | resolve(enterPage);
|
19925 | });
|
19926 | };
|
19927 |
|
19928 | leavePage._hide();
|
19929 |
|
19930 | enterPage.style.display = '';
|
19931 |
|
19932 | var animator = options.animator || _this4._animatorFactory.newAnimator(options);
|
19933 |
|
19934 | animator.pop(_this4.pages[length - 2], _this4.pages[length - 1], done);
|
19935 | }).catch(function () {
|
19936 | return _this4._isRunning = false;
|
19937 | });
|
19938 | }
|
19939 | /**
|
19940 | * @method pushPage
|
19941 | * @signature pushPage(page, [options])
|
19942 | * @param {String} page
|
19943 | * [en]Page URL. Can be either a HTML document or a template defined with the `<template>` tag.[/en]
|
19944 | * [ja]pageのURLか、もしくは`<template>`で宣言したテンプレートのid属性の値を指定できます。[/ja]
|
19945 | * @param {Object} [options]
|
19946 | * [en]Parameter object.[/en]
|
19947 | * [ja]オプションを指定するオブジェクト。[/ja]
|
19948 | * @param {String} [options.page]
|
19949 | * [en]Page URL. Only necessary if `page` parameter is null or undefined.[/en]
|
19950 | * [ja][/ja]
|
19951 | * @param {String} [options.pageHTML]
|
19952 | * [en]HTML code that will be computed as a new page. Overwrites `page` parameter.[/en]
|
19953 | * [ja][/ja]
|
19954 | * @param {String} [options.animation]
|
19955 | * [en]
|
19956 | * Animation name. Available animations are `"slide"`, `"lift"`, `"fade"` and `"none"`.
|
19957 | *
|
19958 | * These are platform based animations. For fixed animations, add `"-ios"` or `"-md"` suffix to the animation name. E.g. `"lift-ios"`, `"lift-md"`. Defaults values are `"slide-ios"` and `"fade-md"`.
|
19959 | * [/en]
|
19960 | * [ja][/ja]
|
19961 | * @param {String} [options.animationOptions]
|
19962 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`[/en]
|
19963 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}` [/ja]
|
19964 | * @param {Function} [options.callback]
|
19965 | * [en]Function that is called when the transition has ended.[/en]
|
19966 | * [ja]pushPage()による画面遷移が終了した時に呼び出される関数オブジェクトを指定します。[/ja]
|
19967 | * @param {Object} [options.data]
|
19968 | * [en]Custom data that will be stored in the new page element.[/en]
|
19969 | * [ja][/ja]
|
19970 | * @return {Promise}
|
19971 | * [en]Promise which resolves to the pushed page.[/en]
|
19972 | * [ja]追加したページを解決するPromiseを返します。[/ja]
|
19973 | * @description
|
19974 | * [en]Pushes the specified page into the stack.[/en]
|
19975 | * [ja]指定したpageを新しいページスタックに追加します。新しいページが表示されます。[/ja]
|
19976 | */
|
19977 |
|
19978 | }, {
|
19979 | key: "pushPage",
|
19980 | value: function pushPage(page) {
|
19981 | var _this5 = this;
|
19982 |
|
19983 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
19984 |
|
19985 | var _this$_preparePageAnd2 = this._preparePageAndOptions(page, options);
|
19986 |
|
19987 | page = _this$_preparePageAnd2.page;
|
19988 | options = _this$_preparePageAnd2.options;
|
19989 |
|
19990 | var prepare = function prepare(pageElement) {
|
19991 | verifyPageElement(pageElement);
|
19992 |
|
19993 | _this5._pageMap.set(pageElement, page);
|
19994 |
|
19995 | pageElement = util$4.extend(pageElement, {
|
19996 | data: options.data
|
19997 | });
|
19998 | pageElement.style.visibility = 'hidden';
|
19999 | };
|
20000 |
|
20001 | if (options.pageHTML) {
|
20002 | return this._pushPage(options, function () {
|
20003 | return new Promise(function (resolve) {
|
20004 | instantPageLoader.load({
|
20005 | page: options.pageHTML,
|
20006 | parent: _this5,
|
20007 | params: options.data
|
20008 | }, function (pageElement) {
|
20009 | prepare(pageElement);
|
20010 | resolve();
|
20011 | });
|
20012 | });
|
20013 | });
|
20014 | }
|
20015 |
|
20016 | return this._pushPage(options, function () {
|
20017 | return new Promise(function (resolve) {
|
20018 | _this5._pageLoader.load({
|
20019 | page: page,
|
20020 | parent: _this5,
|
20021 | params: options.data
|
20022 | }, function (pageElement) {
|
20023 | prepare(pageElement);
|
20024 | resolve();
|
20025 | }, function (error) {
|
20026 | _this5._isRunning = false;
|
20027 | throw error;
|
20028 | });
|
20029 | });
|
20030 | });
|
20031 | }
|
20032 | }, {
|
20033 | key: "_pushPage",
|
20034 | value: function _pushPage() {
|
20035 | var _this6 = this;
|
20036 |
|
20037 | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
20038 | var update = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
|
20039 | return Promise.resolve();
|
20040 | };
|
20041 |
|
20042 | if (this._isRunning) {
|
20043 | return Promise.reject('pushPage is already running.');
|
20044 | }
|
20045 |
|
20046 | if (this._emitPrePushEvent()) {
|
20047 | return Promise.reject('Canceled in prepush event.');
|
20048 | }
|
20049 |
|
20050 | this._isRunning = true;
|
20051 | var animationOptions = this.animationOptions;
|
20052 | options = util$4.extend({}, this.options || {}, {
|
20053 | animationOptions: animationOptions
|
20054 | }, options);
|
20055 |
|
20056 | var animator = this._animatorFactory.newAnimator(options);
|
20057 |
|
20058 | return update().then(function () {
|
20059 | var pageLength = _this6.pages.length;
|
20060 | var enterPage = _this6.pages[pageLength - 1];
|
20061 | var leavePage = options.leavePage || _this6.pages[pageLength - 2];
|
20062 | verifyPageElement(enterPage);
|
20063 | enterPage.updateBackButton(pageLength > (options._replacePage ? 2 : 1));
|
20064 | enterPage.pushedOptions = util$4.extend({}, enterPage.pushedOptions || {}, options || {});
|
20065 | enterPage.data = util$4.extend({}, enterPage.data || {}, options.data || {});
|
20066 | enterPage.unload = enterPage.unload || options.unload;
|
20067 | return new Promise(function (resolve) {
|
20068 | var done = function done() {
|
20069 | _this6._isRunning = false;
|
20070 | options.show !== false && setImmediate(function () {
|
20071 | return enterPage._show();
|
20072 | });
|
20073 | util$4.triggerElementEvent(_this6, 'postpush', {
|
20074 | leavePage: leavePage,
|
20075 | enterPage: enterPage,
|
20076 | navigator: _this6
|
20077 | });
|
20078 |
|
20079 | if (leavePage) {
|
20080 | leavePage.style.display = 'none';
|
20081 | }
|
20082 |
|
20083 | options.callback && options.callback(enterPage);
|
20084 | resolve(enterPage);
|
20085 | };
|
20086 |
|
20087 | enterPage.style.visibility = '';
|
20088 |
|
20089 | if (leavePage) {
|
20090 | leavePage._hide();
|
20091 |
|
20092 | animator.push(enterPage, leavePage, done);
|
20093 | } else {
|
20094 | done();
|
20095 | }
|
20096 | });
|
20097 | }).catch(function (error) {
|
20098 | _this6._isRunning = false;
|
20099 | throw error;
|
20100 | });
|
20101 | }
|
20102 | /**
|
20103 | * @method replacePage
|
20104 | * @signature replacePage(page, [options])
|
20105 | * @return {Promise}
|
20106 | * [en]Promise which resolves to the new page.[/en]
|
20107 | * [ja]新しいページを解決するPromiseを返します。[/ja]
|
20108 | * @description
|
20109 | * [en]Replaces the current top page with the specified one. Extends `pushPage()` parameters.[/en]
|
20110 | * [ja]現在表示中のページをを指定したページに置き換えます。[/ja]
|
20111 | */
|
20112 |
|
20113 | }, {
|
20114 | key: "replacePage",
|
20115 | value: function replacePage(page) {
|
20116 | var _this7 = this;
|
20117 |
|
20118 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
20119 | return this.pushPage(page, options).then(function (resolvedValue) {
|
20120 | if (_this7.pages.length > 1) {
|
20121 | _this7._pageLoader.unload(_this7.pages[_this7.pages.length - 2]);
|
20122 | }
|
20123 |
|
20124 | _this7._updateLastPageBackButton();
|
20125 |
|
20126 | return Promise.resolve(resolvedValue);
|
20127 | });
|
20128 | }
|
20129 | /**
|
20130 | * @method insertPage
|
20131 | * @signature insertPage(index, page, [options])
|
20132 | * @param {Number} index
|
20133 | * [en]The index where it should be inserted.[/en]
|
20134 | * [ja]スタックに挿入する位置のインデックスを指定します。[/ja]
|
20135 | * @return {Promise}
|
20136 | * [en]Promise which resolves to the inserted page.[/en]
|
20137 | * [ja]指定したページを解決するPromiseを返します。[/ja]
|
20138 | * @description
|
20139 | * [en]Insert the specified page into the stack with at a position defined by the `index` argument. Extends `pushPage()` parameters.[/en]
|
20140 | * [ja]指定したpageをページスタックのindexで指定した位置に追加します。[/ja]
|
20141 | */
|
20142 |
|
20143 | }, {
|
20144 | key: "insertPage",
|
20145 | value: function insertPage(index, page) {
|
20146 | var _this8 = this;
|
20147 |
|
20148 | var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
20149 |
|
20150 | var _this$_preparePageAnd3 = this._preparePageAndOptions(page, options);
|
20151 |
|
20152 | page = _this$_preparePageAnd3.page;
|
20153 | options = _this$_preparePageAnd3.options;
|
20154 | index = this._normalizeIndex(index);
|
20155 |
|
20156 | if (index >= this.pages.length) {
|
20157 | return this.pushPage(page, options);
|
20158 | }
|
20159 |
|
20160 | page = typeof options.pageHTML === 'string' ? options.pageHTML : page;
|
20161 | var loader = typeof options.pageHTML === 'string' ? instantPageLoader : this._pageLoader;
|
20162 | return new Promise(function (resolve) {
|
20163 | loader.load({
|
20164 | page: page,
|
20165 | parent: _this8
|
20166 | }, function (pageElement) {
|
20167 | verifyPageElement(pageElement);
|
20168 |
|
20169 | _this8._pageMap.set(pageElement, page);
|
20170 |
|
20171 | pageElement = util$4.extend(pageElement, {
|
20172 | data: options.data,
|
20173 | pushedOptions: options
|
20174 | });
|
20175 | options.animationOptions = util$4.extend({}, _this8.animationOptions, options.animationOptions || {});
|
20176 | pageElement.style.display = 'none';
|
20177 |
|
20178 | _this8.insertBefore(pageElement, _this8.pages[index]);
|
20179 |
|
20180 | _this8.topPage.updateBackButton(true);
|
20181 |
|
20182 | setTimeout(function () {
|
20183 | pageElement = null;
|
20184 | resolve(_this8.pages[index]);
|
20185 | }, 1000 / 60);
|
20186 | });
|
20187 | });
|
20188 | }
|
20189 | /**
|
20190 | * @method removePage
|
20191 | * @signature removePage(index, [options])
|
20192 | * @param {Number} index
|
20193 | * [en]The index where it should be removed.[/en]
|
20194 | * [ja]スタックから削除するページのインデックスを指定します。[/ja]
|
20195 | * @return {Promise}
|
20196 | * [en]Promise which resolves to the revealed page.[/en]
|
20197 | * [ja]削除によって表示されたページを解決するPromiseを返します。[/ja]
|
20198 | * @description
|
20199 | * [en]Remove the specified page at a position in the stack defined by the `index` argument. Extends `popPage()` parameters.[/en]
|
20200 | * [ja]指定したインデックスにあるページを削除します。[/ja]
|
20201 | */
|
20202 |
|
20203 | }, {
|
20204 | key: "removePage",
|
20205 | value: function removePage(index) {
|
20206 | var _this9 = this;
|
20207 |
|
20208 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
20209 | index = this._normalizeIndex(index);
|
20210 |
|
20211 | if (index < this.pages.length - 1) {
|
20212 | return new Promise(function (resolve) {
|
20213 | var leavePage = _this9.pages[index];
|
20214 | var enterPage = _this9.topPage;
|
20215 |
|
20216 | _this9._pageMap.delete(leavePage);
|
20217 |
|
20218 | _this9._pageLoader.unload(leavePage);
|
20219 |
|
20220 | if (_this9.pages.length === 1) {
|
20221 | // edge case
|
20222 | _this9.topPage.updateBackButton(false);
|
20223 | }
|
20224 |
|
20225 | resolve(enterPage);
|
20226 | });
|
20227 | } else {
|
20228 | return this.popPage(options);
|
20229 | }
|
20230 | }
|
20231 | /**
|
20232 | * @method resetToPage
|
20233 | * @signature resetToPage(page, [options])
|
20234 | * @return {Promise}
|
20235 | * [en]Promise which resolves to the new top page.[/en]
|
20236 | * [ja]新しいトップページを解決するPromiseを返します。[/ja]
|
20237 | * @param {Boolean} [options.pop]
|
20238 | * [en]Performs 'pop' effect if `true` instead of 'push' or none. This also sets `options.animation` value to `default` instead of `none`.[/en]
|
20239 | * [ja][/ja]
|
20240 | * @description
|
20241 | * [en]Clears page stack and adds the specified page to the stack. Extends `pushPage()` parameters.[/en]
|
20242 | * [ja]ページスタックをリセットし、指定したページを表示します。[/ja]
|
20243 | */
|
20244 |
|
20245 | }, {
|
20246 | key: "resetToPage",
|
20247 | value: function resetToPage(page) {
|
20248 | var _this10 = this;
|
20249 |
|
20250 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
20251 |
|
20252 | var _this$_preparePageAnd4 = this._preparePageAndOptions(page, options);
|
20253 |
|
20254 | page = _this$_preparePageAnd4.page;
|
20255 | options = _this$_preparePageAnd4.options;
|
20256 |
|
20257 | if (!options.animator && !options.animation && !options.pop) {
|
20258 | options.animation = 'none';
|
20259 | }
|
20260 |
|
20261 | if (!options.page && !options.pageHTML && this._getPageTarget()) {
|
20262 | page = options.page = this._getPageTarget();
|
20263 | }
|
20264 |
|
20265 | if (options.pop) {
|
20266 | this._removePages();
|
20267 |
|
20268 | return this.insertPage(0, page, {
|
20269 | data: options.data
|
20270 | }).then(function () {
|
20271 | return _this10.popPage(options);
|
20272 | });
|
20273 | } // Tip: callback runs before resolved promise
|
20274 |
|
20275 |
|
20276 | var callback = options.callback;
|
20277 |
|
20278 | options.callback = function (newPage) {
|
20279 | _this10._removePages();
|
20280 |
|
20281 | newPage.updateBackButton(false);
|
20282 | callback && callback(newPage);
|
20283 | };
|
20284 |
|
20285 | return this.pushPage(page, options);
|
20286 | }
|
20287 | /**
|
20288 | * @method bringPageTop
|
20289 | * @signature bringPageTop(item, [options])
|
20290 | * @param {String|Number} item
|
20291 | * [en]Page URL or index of an existing page in navigator's stack.[/en]
|
20292 | * [ja]ページのURLかもしくはons-navigatorのページスタックのインデックス値を指定します。[/ja]
|
20293 | * @return {Promise}
|
20294 | * [en]Promise which resolves to the new top page.[/en]
|
20295 | * [ja]新しいトップページを解決するPromiseを返します。[/ja]
|
20296 | * @description
|
20297 | * [en]Brings the given page to the top of the page stack if it already exists or pushes it into the stack if doesn't. Extends `pushPage()` parameters.[/en]
|
20298 | * [ja]指定したページをページスタックの一番上に移動します。もし指定したページが無かった場合新しくpushされます。[/ja]
|
20299 | */
|
20300 |
|
20301 | }, {
|
20302 | key: "bringPageTop",
|
20303 | value: function bringPageTop(item) {
|
20304 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
20305 |
|
20306 | if (['number', 'string'].indexOf(_typeof(item)) === -1) {
|
20307 | util$4.throw('First argument must be a page name or the index of an existing page. You supplied ' + item);
|
20308 | }
|
20309 |
|
20310 | var index = typeof item === 'number' ? this._normalizeIndex(item) : this._lastIndexOfPage(item);
|
20311 | var page = this.pages[index];
|
20312 |
|
20313 | if (index < 0) {
|
20314 | return this.pushPage(item, options);
|
20315 | }
|
20316 |
|
20317 | var _this$_preparePageAnd5 = this._preparePageAndOptions(page, options);
|
20318 |
|
20319 | options = _this$_preparePageAnd5.options;
|
20320 |
|
20321 | if (index === this.pages.length - 1) {
|
20322 | return Promise.resolve(page);
|
20323 | }
|
20324 |
|
20325 | if (!page) {
|
20326 | util$4.throw('Failed to find item ' + item);
|
20327 | }
|
20328 |
|
20329 | if (this._isRunning) {
|
20330 | return Promise.reject('pushPage is already running.');
|
20331 | }
|
20332 |
|
20333 | if (this._emitPrePushEvent()) {
|
20334 | return Promise.reject('Canceled in prepush event.');
|
20335 | }
|
20336 |
|
20337 | page.style.display = '';
|
20338 | page.style.visibility = 'hidden';
|
20339 | page.parentNode.appendChild(page);
|
20340 | return this._pushPage(options);
|
20341 | }
|
20342 | }, {
|
20343 | key: "_preparePageAndOptions",
|
20344 | value: function _preparePageAndOptions(page) {
|
20345 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
20346 |
|
20347 | if (_typeof(options) != 'object') {
|
20348 | util$4.throw('options must be an object. You supplied ' + options);
|
20349 | }
|
20350 |
|
20351 | if ((page === null || page === undefined) && options.page) {
|
20352 | page = options.page;
|
20353 | }
|
20354 |
|
20355 | options = util$4.extend({}, this.options || {}, options, {
|
20356 | page: page
|
20357 | });
|
20358 | return {
|
20359 | page: page,
|
20360 | options: options
|
20361 | };
|
20362 | }
|
20363 | }, {
|
20364 | key: "_removePages",
|
20365 | value: function _removePages(times) {
|
20366 | var pages = this.pages;
|
20367 | var until = times === undefined ? 0 : pages.length - times;
|
20368 | until = until < 0 ? 1 : until;
|
20369 |
|
20370 | for (var i = pages.length - 2; i >= until; i--) {
|
20371 | this._pageMap.delete(pages[i]);
|
20372 |
|
20373 | this._pageLoader.unload(pages[i]);
|
20374 | }
|
20375 | }
|
20376 | }, {
|
20377 | key: "_updateLastPageBackButton",
|
20378 | value: function _updateLastPageBackButton() {
|
20379 | var index = this.pages.length - 1;
|
20380 |
|
20381 | if (index >= 0) {
|
20382 | this.pages[index].updateBackButton(index > 0);
|
20383 | }
|
20384 | }
|
20385 | }, {
|
20386 | key: "_normalizeIndex",
|
20387 | value: function _normalizeIndex(index) {
|
20388 | return index >= 0 ? index : Math.abs(this.pages.length + index) % this.pages.length;
|
20389 | }
|
20390 | }, {
|
20391 | key: "_onDeviceBackButton",
|
20392 | value: function _onDeviceBackButton(event) {
|
20393 | if (this.pages.length > 1) {
|
20394 | this.popPage();
|
20395 | } else {
|
20396 | event.callParentHandler();
|
20397 | }
|
20398 | }
|
20399 | }, {
|
20400 | key: "_lastIndexOfPage",
|
20401 | value: function _lastIndexOfPage(pageName) {
|
20402 | var index;
|
20403 |
|
20404 | for (index = this.pages.length - 1; index >= 0; index--) {
|
20405 | if (pageName === this._pageMap.get(this.pages[index])) {
|
20406 | break;
|
20407 | }
|
20408 | }
|
20409 |
|
20410 | return index;
|
20411 | }
|
20412 | }, {
|
20413 | key: "_emitPreEvent",
|
20414 | value: function _emitPreEvent(name) {
|
20415 | var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
20416 | var isCanceled = false;
|
20417 | util$4.triggerElementEvent(this, 'pre' + name, util$4.extend({
|
20418 | navigator: this,
|
20419 | currentPage: this.pages[this.pages.length - 1],
|
20420 | cancel: function cancel() {
|
20421 | return isCanceled = true;
|
20422 | }
|
20423 | }, data));
|
20424 | return isCanceled;
|
20425 | }
|
20426 | }, {
|
20427 | key: "_emitPrePushEvent",
|
20428 | value: function _emitPrePushEvent() {
|
20429 | return this._emitPreEvent('push');
|
20430 | }
|
20431 | }, {
|
20432 | key: "_emitPrePopEvent",
|
20433 | value: function _emitPrePopEvent() {
|
20434 | var l = this.pages.length;
|
20435 | return this._emitPreEvent('pop', {
|
20436 | leavePage: this.pages[l - 1],
|
20437 | enterPage: this.pages[l - 2]
|
20438 | });
|
20439 | } // TODO: 書き直す
|
20440 |
|
20441 | }, {
|
20442 | key: "_createPageElement",
|
20443 | value: function _createPageElement(templateHTML) {
|
20444 | var pageElement = util$4.createElement(internal$1.normalizePageHTML(templateHTML));
|
20445 | verifyPageElement(pageElement);
|
20446 | return pageElement;
|
20447 | }
|
20448 | /**
|
20449 | * @property onDeviceBackButton
|
20450 | * @type {Object}
|
20451 | * @description
|
20452 | * [en]Back-button handler.[/en]
|
20453 | * [ja]バックボタンハンドラ。[/ja]
|
20454 | */
|
20455 |
|
20456 | }, {
|
20457 | key: "onDeviceBackButton",
|
20458 | get: function get() {
|
20459 | return this._backButtonHandler;
|
20460 | },
|
20461 | set: function set(callback) {
|
20462 | if (this._backButtonHandler) {
|
20463 | this._backButtonHandler.destroy();
|
20464 | }
|
20465 |
|
20466 | this._backButtonHandler = deviceBackButtonDispatcher.createHandler(this, callback);
|
20467 | }
|
20468 | /**
|
20469 | * @property topPage
|
20470 | * @readonly
|
20471 | * @type {HTMLElement}
|
20472 | * @description
|
20473 | * [en]Current top page element. Use this method to access options passed by `pushPage()`-like methods.[/en]
|
20474 | * [ja]現在のページを取得します。pushPage()やresetToPage()メソッドの引数を取得できます。[/ja]
|
20475 | */
|
20476 |
|
20477 | }, {
|
20478 | key: "topPage",
|
20479 | get: function get() {
|
20480 | var last = this.lastElementChild;
|
20481 |
|
20482 | while (last && last.tagName !== 'ONS-PAGE') {
|
20483 | last = last.previousElementSibling;
|
20484 | }
|
20485 |
|
20486 | return last;
|
20487 | }
|
20488 | /**
|
20489 | * @property pages
|
20490 | * @readonly
|
20491 | * @type {Array}
|
20492 | * @description
|
20493 | * [en]Copy of the navigator's page stack.[/en]
|
20494 | * [ja][/ja]
|
20495 | */
|
20496 |
|
20497 | }, {
|
20498 | key: "pages",
|
20499 | get: function get() {
|
20500 | return util$4.arrayFrom(this.children).filter(function (element) {
|
20501 | return element.tagName === 'ONS-PAGE';
|
20502 | });
|
20503 | }
|
20504 | /**
|
20505 | * @property onSwipe
|
20506 | * @type {Function}
|
20507 | * @description
|
20508 | * [en]Hook called whenever the user slides the navigator (swipe-to-pop). It gets a decimal ratio (0-1) and an animationOptions object as arguments.[/en]
|
20509 | * [ja][/ja]
|
20510 | */
|
20511 |
|
20512 | }, {
|
20513 | key: "onSwipe",
|
20514 | get: function get() {
|
20515 | return this._onSwipe;
|
20516 | },
|
20517 | set: function set(value) {
|
20518 | if (value && !(value instanceof Function)) {
|
20519 | util$4.throw('"onSwipe" must be a function');
|
20520 | }
|
20521 |
|
20522 | this._onSwipe = value;
|
20523 | }
|
20524 | /**
|
20525 | * @property options
|
20526 | * @type {Object}
|
20527 | * @description
|
20528 | * [en]Default options object. Attributes have priority over this property.[/en]
|
20529 | * [ja][/ja]
|
20530 | */
|
20531 |
|
20532 | /**
|
20533 | * @property options.animation
|
20534 | * @type {String}
|
20535 | * @description
|
20536 | * [en]
|
20537 | * Animation name. Available animations are `"slide"`, `"lift"`, `"fade"` and `"none"`.
|
20538 | * These are platform based animations. For fixed animations, add `"-ios"` or `"-md"` suffix to the animation name. E.g. `"lift-ios"`, `"lift-md"`. Defaults values are `"slide-ios"` and `"fade-md"`.
|
20539 | * [/en]
|
20540 | * [ja][/ja]
|
20541 | */
|
20542 |
|
20543 | /**
|
20544 | * @property options.animationOptions
|
20545 | * @type {String}
|
20546 | * @description
|
20547 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
|
20548 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}` [/ja]
|
20549 | */
|
20550 |
|
20551 | /**
|
20552 | * @property options.callback
|
20553 | * @type {String}
|
20554 | * @description
|
20555 | * [en]Function that is called when the transition has ended.[/en]
|
20556 | * [ja]このメソッドによる画面遷移が終了した際に呼び出される関数オブジェクトを指定します。[/ja]
|
20557 | */
|
20558 |
|
20559 | }, {
|
20560 | key: "options",
|
20561 | get: function get() {
|
20562 | return this._options;
|
20563 | },
|
20564 | set: function set(object) {
|
20565 | this._options = object;
|
20566 | }
|
20567 | }, {
|
20568 | key: "animationOptions",
|
20569 | get: function get() {
|
20570 | return this.hasAttribute('animation-options') ? AnimatorFactory.parseAnimationOptionsString(this.getAttribute('animation-options')) : {};
|
20571 | },
|
20572 | set: function set(value) {
|
20573 | if (value === undefined || value === null) {
|
20574 | this.removeAttribute('animation-options');
|
20575 | } else {
|
20576 | this.setAttribute('animation-options', JSON.stringify(value));
|
20577 | }
|
20578 | }
|
20579 | }, {
|
20580 | key: "_isRunning",
|
20581 | get: function get() {
|
20582 | return JSON.parse(this.getAttribute('_is-running'));
|
20583 | },
|
20584 | set: function set(value) {
|
20585 | this.setAttribute('_is-running', value ? 'true' : 'false');
|
20586 | }
|
20587 | }, {
|
20588 | key: "_show",
|
20589 | value: function _show() {
|
20590 | var _this11 = this;
|
20591 |
|
20592 | this.loaded.then(function () {
|
20593 | return _this11.topPage && _this11.topPage._show();
|
20594 | });
|
20595 | }
|
20596 | }, {
|
20597 | key: "_hide",
|
20598 | value: function _hide() {
|
20599 | this.topPage && this.topPage._hide();
|
20600 | }
|
20601 | }, {
|
20602 | key: "_destroy",
|
20603 | value: function _destroy() {
|
20604 | for (var i = this.pages.length - 1; i >= 0; i--) {
|
20605 | this._pageLoader.unload(this.pages[i]);
|
20606 | }
|
20607 |
|
20608 | this.remove();
|
20609 | }
|
20610 | /**
|
20611 | * @param {String} name
|
20612 | * @param {Function} Animator
|
20613 | */
|
20614 |
|
20615 | }], [{
|
20616 | key: "observedAttributes",
|
20617 | get: function get() {
|
20618 | return ['animation', 'swipeable'];
|
20619 | }
|
20620 | }, {
|
20621 | key: "registerAnimator",
|
20622 | value: function registerAnimator(name, Animator) {
|
20623 | if (!(Animator.prototype instanceof NavigatorAnimator)) {
|
20624 | util$4.throwAnimator('Navigator');
|
20625 | }
|
20626 |
|
20627 | _animatorDict$3[name] = Animator;
|
20628 | }
|
20629 | }, {
|
20630 | key: "animators",
|
20631 | get: function get() {
|
20632 | return _animatorDict$3;
|
20633 | }
|
20634 | }, {
|
20635 | key: "NavigatorAnimator",
|
20636 | get: function get() {
|
20637 | return NavigatorAnimator;
|
20638 | }
|
20639 | }, {
|
20640 | key: "events",
|
20641 | get: function get() {
|
20642 | return ['prepush', 'postpush', 'prepop', 'postpop', 'swipe'];
|
20643 | }
|
20644 | }, {
|
20645 | key: "rewritables",
|
20646 | get: function get() {
|
20647 | return rewritables$3;
|
20648 | }
|
20649 | }]);
|
20650 |
|
20651 | return NavigatorElement;
|
20652 | }(BaseElement);
|
20653 | onsElements.Navigator = NavigatorElement;
|
20654 | customElements.define('ons-navigator', NavigatorElement);
|
20655 |
|
20656 | var defaultClassName$7 = 'toolbar';
|
20657 | var scheme$d = {
|
20658 | '': 'toolbar--*',
|
20659 | '.toolbar__left': 'toolbar--*__left',
|
20660 | '.toolbar__center': 'toolbar--*__center',
|
20661 | '.toolbar__right': 'toolbar--*__right'
|
20662 | };
|
20663 | /**
|
20664 | * @element ons-toolbar
|
20665 | * @category page
|
20666 | * @modifier material
|
20667 | * [en]Material Design toolbar.[/en]
|
20668 | * [ja][/ja]
|
20669 | * @modifier transparent
|
20670 | * [en]Transparent toolbar.[/en]
|
20671 | * [ja]透明な背景を持つツールバーを表示します。[/ja]
|
20672 | * @modifier cover-content
|
20673 | * [en]Displays the toolbar on top of the page's content. Should be combined with `transparent` modifier.[/en]
|
20674 | * [ja][/ja]
|
20675 | * @modifier noshadow
|
20676 | * [en]Toolbar without shadow.[/en]
|
20677 | * [ja]ツールバーに影を付けずに表示します。[/ja]
|
20678 | * @description
|
20679 | * [en]
|
20680 | * Toolbar component that can be used with navigation.
|
20681 | *
|
20682 | * Left, center and right containers can be specified by class names.
|
20683 | *
|
20684 | * This component will automatically display as a Material Design toolbar when running on Android devices.
|
20685 | * [/en]
|
20686 | * [ja]ナビゲーションで使用するツールバー用コンポーネントです。クラス名により、左、中央、右のコンテナを指定できます。[/ja]
|
20687 | * @codepen aHmGL
|
20688 | * @tutorial vanilla/Reference/toolbar
|
20689 | * @guide compilation.html#toolbar-compilation [en]Adding a toolbar[/en][ja]ツールバーの追加[/ja]
|
20690 | * @seealso ons-bottom-toolbar
|
20691 | * [en]The `<ons-bottom-toolbar>` displays a toolbar on the bottom of the page.[/en]
|
20692 | * [ja]ons-bottom-toolbarコンポーネント[/ja]
|
20693 | * @seealso ons-back-button
|
20694 | * [en]The `<ons-back-button>` component displays a back button inside the toolbar.[/en]
|
20695 | * [ja]ons-back-buttonコンポーネント[/ja]
|
20696 | * @seealso ons-toolbar-button
|
20697 | * [en]The `<ons-toolbar-button>` component displays a toolbar button inside the toolbar.[/en]
|
20698 | * [ja]ons-toolbar-buttonコンポーネント[/ja]
|
20699 | * @example
|
20700 | * <ons-page>
|
20701 | * <ons-toolbar>
|
20702 | * <div class="left">
|
20703 | * <ons-back-button>
|
20704 | * Back
|
20705 | * </ons-back-button>
|
20706 | * </div>
|
20707 | * <div class="center">
|
20708 | * Title
|
20709 | * </div>
|
20710 | * <div class="right">
|
20711 | * <ons-toolbar-button>
|
20712 | * <ons-icon icon="md-menu"></ons-icon>
|
20713 | * </ons-toolbar-button>
|
20714 | * </div>
|
20715 | * </ons-toolbar>
|
20716 | * </ons-page>
|
20717 | */
|
20718 |
|
20719 | var ToolbarElement = /*#__PURE__*/function (_BaseElement) {
|
20720 | _inherits(ToolbarElement, _BaseElement);
|
20721 |
|
20722 | var _super = _createSuper(ToolbarElement);
|
20723 |
|
20724 | /**
|
20725 | * @attribute inline
|
20726 | * @initonly
|
20727 | * @description
|
20728 | * [en]Display the toolbar as an inline element.[/en]
|
20729 | * [ja]ツールバーをインラインに置きます。スクロール領域内にそのまま表示されます。[/ja]
|
20730 | */
|
20731 |
|
20732 | /**
|
20733 | * @attribute static
|
20734 | * @description
|
20735 | * [en]Static toolbars are not animated by `ons-navigator` when pushing or popping pages. This can be useful to improve performance in some situations.[/en]
|
20736 | * [ja][/ja]
|
20737 | */
|
20738 |
|
20739 | /**
|
20740 | * @property static
|
20741 | * @type {Boolean}
|
20742 | * @description
|
20743 | * [en]Static toolbars are not animated by `ons-navigator` when pushing or popping pages. This can be useful to improve performance in some situations.[/en]
|
20744 | * [ja][/ja]
|
20745 | */
|
20746 |
|
20747 | /**
|
20748 | * @attribute modifier
|
20749 | * @description
|
20750 | * [en]The appearance of the toolbar.[/en]
|
20751 | * [ja]ツールバーの表現を指定します。[/ja]
|
20752 | */
|
20753 |
|
20754 | /**
|
20755 | * @property visible
|
20756 | * @description
|
20757 | * [en]Whether the toolbar is shown or not.[/en]
|
20758 | * [ja][/ja]
|
20759 | */
|
20760 | function ToolbarElement() {
|
20761 | var _this;
|
20762 |
|
20763 | _classCallCheck(this, ToolbarElement);
|
20764 |
|
20765 | _this = _super.call(this);
|
20766 | _this._visible = true;
|
20767 | contentReady(_assertThisInitialized(_this), function () {
|
20768 | _this._compile();
|
20769 | });
|
20770 | return _this;
|
20771 | }
|
20772 |
|
20773 | _createClass(ToolbarElement, [{
|
20774 | key: "attributeChangedCallback",
|
20775 | value: function attributeChangedCallback(name, last, current) {
|
20776 | switch (name) {
|
20777 | case 'class':
|
20778 | util$4.restoreClass(this, defaultClassName$7, scheme$d);
|
20779 | break;
|
20780 |
|
20781 | case 'modifier':
|
20782 | ModifierUtil.onModifierChanged(last, current, this, scheme$d);
|
20783 | break;
|
20784 | }
|
20785 | }
|
20786 | /**
|
20787 | * @method setVisibility
|
20788 | * @signature setVisibility(visible)
|
20789 | * @param {Boolean} visible
|
20790 | * [en]Set to true to show the toolbar, false to hide it[/en]
|
20791 | * [ja][/ja]
|
20792 | * @description
|
20793 | * [en]Shows the toolbar if visible is true, otherwise hides it.[/en]
|
20794 | * [ja][/ja]
|
20795 | */
|
20796 |
|
20797 | }, {
|
20798 | key: "setVisibility",
|
20799 | value: function setVisibility(visible) {
|
20800 | var _this2 = this;
|
20801 |
|
20802 | contentReady(this, function () {
|
20803 | _this2._visible = visible;
|
20804 | _this2.style.display = visible ? '' : 'none';
|
20805 |
|
20806 | if (_this2.parentNode) {
|
20807 | var siblingBackground = util$4.findChild(_this2.parentNode, '.page__background');
|
20808 |
|
20809 | if (siblingBackground) {
|
20810 | siblingBackground.style.top = visible ? null : 0;
|
20811 | }
|
20812 |
|
20813 | var siblingContent = util$4.findChild(_this2.parentNode, '.page__content');
|
20814 |
|
20815 | if (siblingContent) {
|
20816 | siblingContent.style.top = visible ? null : 0;
|
20817 | }
|
20818 | }
|
20819 | });
|
20820 | }
|
20821 | /**
|
20822 | * @method show
|
20823 | * @signature show()
|
20824 | * @description
|
20825 | * [en]Show the toolbar.[/en]
|
20826 | * [ja][/ja]
|
20827 | */
|
20828 |
|
20829 | }, {
|
20830 | key: "show",
|
20831 | value: function show() {
|
20832 | this.setVisibility(true);
|
20833 | }
|
20834 | /**
|
20835 | * @method hide
|
20836 | * @signature hide()
|
20837 | * @description
|
20838 | * [en]Hide the toolbar.[/en]
|
20839 | * [ja][/ja]
|
20840 | */
|
20841 |
|
20842 | }, {
|
20843 | key: "hide",
|
20844 | value: function hide() {
|
20845 | this.setVisibility(false);
|
20846 | }
|
20847 | }, {
|
20848 | key: "visible",
|
20849 | get: function get() {
|
20850 | return this._visible;
|
20851 | },
|
20852 | set: function set(value) {
|
20853 | this.setVisibility(value);
|
20854 | }
|
20855 | /**
|
20856 | * @return {HTMLElement}
|
20857 | */
|
20858 |
|
20859 | }, {
|
20860 | key: "_getToolbarLeftItemsElement",
|
20861 | value: function _getToolbarLeftItemsElement() {
|
20862 | return this.querySelector('.left') || internal$1.nullElement;
|
20863 | }
|
20864 | /**
|
20865 | * @return {HTMLElement}
|
20866 | */
|
20867 |
|
20868 | }, {
|
20869 | key: "_getToolbarCenterItemsElement",
|
20870 | value: function _getToolbarCenterItemsElement() {
|
20871 | return this.querySelector('.center') || internal$1.nullElement;
|
20872 | }
|
20873 | /**
|
20874 | * @return {HTMLElement}
|
20875 | */
|
20876 |
|
20877 | }, {
|
20878 | key: "_getToolbarRightItemsElement",
|
20879 | value: function _getToolbarRightItemsElement() {
|
20880 | return this.querySelector('.right') || internal$1.nullElement;
|
20881 | }
|
20882 | /**
|
20883 | * @return {HTMLElement}
|
20884 | */
|
20885 |
|
20886 | }, {
|
20887 | key: "_getToolbarBackButtonLabelElement",
|
20888 | value: function _getToolbarBackButtonLabelElement() {
|
20889 | return this.querySelector('ons-back-button .back-button__label') || internal$1.nullElement;
|
20890 | }
|
20891 | /**
|
20892 | * @return {HTMLElement}
|
20893 | */
|
20894 |
|
20895 | }, {
|
20896 | key: "_getToolbarBackButtonIconElement",
|
20897 | value: function _getToolbarBackButtonIconElement() {
|
20898 | return this.querySelector('ons-back-button .back-button__icon') || internal$1.nullElement;
|
20899 | }
|
20900 | }, {
|
20901 | key: "_compile",
|
20902 | value: function _compile() {
|
20903 | autoStyle.prepare(this);
|
20904 | this.classList.add(defaultClassName$7);
|
20905 |
|
20906 | this._ensureToolbarItemElements();
|
20907 |
|
20908 | ModifierUtil.initModifier(this, scheme$d);
|
20909 | }
|
20910 | }, {
|
20911 | key: "_ensureToolbarItemElements",
|
20912 | value: function _ensureToolbarItemElements() {
|
20913 | for (var i = this.childNodes.length - 1; i >= 0; i--) {
|
20914 | // case of not element
|
20915 | if (this.childNodes[i].nodeType != 1) {
|
20916 | this.removeChild(this.childNodes[i]);
|
20917 | }
|
20918 | }
|
20919 |
|
20920 | var center = this._ensureToolbarElement('center');
|
20921 |
|
20922 | center.classList.add('toolbar__title');
|
20923 |
|
20924 | if (this.children.length !== 1 || !this.children[0].classList.contains('center')) {
|
20925 | var left = this._ensureToolbarElement('left');
|
20926 |
|
20927 | var right = this._ensureToolbarElement('right');
|
20928 |
|
20929 | if (this.children[0] !== left || this.children[1] !== center || this.children[2] !== right) {
|
20930 | this.appendChild(left);
|
20931 | this.appendChild(center);
|
20932 | this.appendChild(right);
|
20933 | }
|
20934 | }
|
20935 | }
|
20936 | }, {
|
20937 | key: "_ensureToolbarElement",
|
20938 | value: function _ensureToolbarElement(name) {
|
20939 | if (util$4.findChild(this, '.toolbar__' + name)) {
|
20940 | var _element = util$4.findChild(this, '.toolbar__' + name);
|
20941 |
|
20942 | _element.classList.add(name);
|
20943 |
|
20944 | return _element;
|
20945 | }
|
20946 |
|
20947 | var element = util$4.findChild(this, '.' + name) || util$4.create('.' + name);
|
20948 | element.classList.add('toolbar__' + name);
|
20949 | return element;
|
20950 | }
|
20951 | }], [{
|
20952 | key: "observedAttributes",
|
20953 | get: function get() {
|
20954 | return ['modifier', 'class'];
|
20955 | }
|
20956 | }]);
|
20957 |
|
20958 | return ToolbarElement;
|
20959 | }(BaseElement);
|
20960 | util$4.defineBooleanProperties(ToolbarElement, ['static']);
|
20961 | onsElements.Toolbar = ToolbarElement;
|
20962 | customElements.define('ons-toolbar', ToolbarElement);
|
20963 |
|
20964 | var defaultClassName$6 = 'page';
|
20965 | var scheme$c = {
|
20966 | '': 'page--*',
|
20967 | '.page__content': 'page--*__content',
|
20968 | '.page__background': 'page--*__background'
|
20969 | };
|
20970 | /**
|
20971 | * @element ons-page
|
20972 | * @category page
|
20973 | * @modifier material
|
20974 | * [en]Material Design style[/en]
|
20975 | * [ja][/ja]
|
20976 | * @description
|
20977 | * [en]
|
20978 | * This component defines the root of each page. If the content is large it will become scrollable.
|
20979 | *
|
20980 | * A navigation bar can be added to the top of the page using the `<ons-toolbar>` element.
|
20981 | * [/en]
|
20982 | * [ja]ページ定義のためのコンポーネントです。このコンポーネントの内容はスクロールが許可されます。[/ja]
|
20983 | * @tutorial vanilla/Reference/page
|
20984 | * @guide lifecycle.html#events
|
20985 | * [en]Overview of page events[/en]
|
20986 | * [ja]Overview of page events[/ja]
|
20987 | * @guide fundamentals.html#managing-pages
|
20988 | * [en]Managing multiple pages[/en]
|
20989 | * [ja]複数のページを管理する[/ja]
|
20990 | * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
|
20991 | * @seealso ons-toolbar
|
20992 | * [en]Use the `<ons-toolbar>` element to add a navigation bar to the top of the page.[/en]
|
20993 | * [ja][/ja]
|
20994 | * @example
|
20995 | * <ons-page>
|
20996 | * <ons-toolbar>
|
20997 | * <div class="left">
|
20998 | * <ons-back-button>Back</ons-back-button>
|
20999 | * </div>
|
21000 | * <div class="center">Title</div>
|
21001 | * <div class="right">
|
21002 | * <ons-toolbar-button>
|
21003 | * <ons-icon icon="md-menu"></ons-icon>
|
21004 | * </ons-toolbar-button>
|
21005 | * </div>
|
21006 | * </ons-toolbar>
|
21007 | *
|
21008 | * <p>Page content</p>
|
21009 | * </ons-page>
|
21010 | *
|
21011 | * @example
|
21012 | * <script>
|
21013 | * myApp.handler = function(done) {
|
21014 | * loadMore().then(done);
|
21015 | * }
|
21016 | * </script>
|
21017 | *
|
21018 | * <ons-page on-infinite-scroll="myApp.handler">
|
21019 | * <ons-toolbar>
|
21020 | * <div class="center">List</div>
|
21021 | * </ons-toolbar>
|
21022 | *
|
21023 | * <ons-list>
|
21024 | * <ons-list-item>#1</ons-list-item>
|
21025 | * <ons-list-item>#2</ons-list-item>
|
21026 | * <ons-list-item>#3</ons-list-item>
|
21027 | * ...
|
21028 | * </ons-list>
|
21029 | * </ons-page>
|
21030 | */
|
21031 |
|
21032 | var PageElement = /*#__PURE__*/function (_BaseElement) {
|
21033 | _inherits(PageElement, _BaseElement);
|
21034 |
|
21035 | var _super = _createSuper(PageElement);
|
21036 |
|
21037 | /**
|
21038 | * @event init
|
21039 | * @description
|
21040 | * [en]Fired right after the page is attached.[/en]
|
21041 | * [ja]ページがアタッチされた後に発火します。[/ja]
|
21042 | * @param {Object} event [en]Event object.[/en]
|
21043 | */
|
21044 |
|
21045 | /**
|
21046 | * @event show
|
21047 | * @description
|
21048 | * [en]Fired right after the page is shown.[/en]
|
21049 | * [ja]ページが表示された後に発火します。[/ja]
|
21050 | * @param {Object} event [en]Event object.[/en]
|
21051 | */
|
21052 |
|
21053 | /**
|
21054 | * @event hide
|
21055 | * @description
|
21056 | * [en]Fired right after the page is hidden.[/en]
|
21057 | * [ja]ページが隠れた後に発火します。[/ja]
|
21058 | * @param {Object} event [en]Event object.[/en]
|
21059 | */
|
21060 |
|
21061 | /**
|
21062 | * @event destroy
|
21063 | * @description
|
21064 | * [en]Fired right before the page is destroyed.[/en]
|
21065 | * [ja]ページが破棄される前に発火します。[/ja]
|
21066 | * @param {Object} event [en]Event object.[/en]
|
21067 | */
|
21068 |
|
21069 | /**
|
21070 | * @attribute modifier
|
21071 | * @type {String}
|
21072 | * @description
|
21073 | * [en]Specify modifier name to specify custom styles.[/en]
|
21074 | * [ja]スタイル定義をカスタマイズするための名前を指定します。[/ja]
|
21075 | */
|
21076 |
|
21077 | /**
|
21078 | * @attribute on-infinite-scroll
|
21079 | * @type {String}
|
21080 | * @description
|
21081 | * [en]Path of the function to be executed on infinite scrolling. Example: `app.loadData`. The function receives a done callback that must be called when it's finished.[/en]
|
21082 | * [ja][/ja]
|
21083 | */
|
21084 | function PageElement() {
|
21085 | var _this;
|
21086 |
|
21087 | _classCallCheck(this, PageElement);
|
21088 |
|
21089 | _this = _super.call(this);
|
21090 |
|
21091 | _this._deriveHooks();
|
21092 |
|
21093 | _this._defaultClassName = defaultClassName$6;
|
21094 |
|
21095 | _this.classList.add(defaultClassName$6);
|
21096 |
|
21097 | _this._initialized = false;
|
21098 | contentReady(_assertThisInitialized(_this), function () {
|
21099 | _this._compile();
|
21100 |
|
21101 | _this._isShown = false;
|
21102 | _this._contentElement = _this._getContentElement();
|
21103 | _this._backgroundElement = _this._getBackgroundElement();
|
21104 | });
|
21105 | return _this;
|
21106 | }
|
21107 |
|
21108 | _createClass(PageElement, [{
|
21109 | key: "_compile",
|
21110 | value: function _compile() {
|
21111 | var _this2 = this;
|
21112 |
|
21113 | autoStyle.prepare(this);
|
21114 | var toolbar = util$4.findChild(this, 'ons-toolbar');
|
21115 | var background = util$4.findChild(this, '.page__background') || util$4.findChild(this, '.background') || document.createElement('div');
|
21116 | background.classList.add('page__background');
|
21117 | this.insertBefore(background, !toolbar && this.firstChild || toolbar && toolbar.nextSibling);
|
21118 | var content = util$4.findChild(this, '.page__content') || util$4.findChild(this, '.content') || document.createElement('div');
|
21119 | content.classList.add('page__content');
|
21120 |
|
21121 | if (!content.parentElement) {
|
21122 | util$4.arrayFrom(this.childNodes).forEach(function (node) {
|
21123 | if (node.nodeType !== 1 || _this2._elementShouldBeMoved(node)) {
|
21124 | content.appendChild(node); // Can trigger detached connectedCallbacks
|
21125 | }
|
21126 | });
|
21127 | }
|
21128 |
|
21129 | this._tryToFillStatusBar(content); // Must run before child pages try to fill status bar.
|
21130 |
|
21131 |
|
21132 | this.insertBefore(content, background.nextSibling); // Can trigger attached connectedCallbacks
|
21133 |
|
21134 | if ((!toolbar || !util$4.hasModifier(toolbar, 'transparent')) && content.children.length === 1 && util$4.isPageControl(content.children[0])) {
|
21135 | this._defaultClassName += ' page--wrapper';
|
21136 | this.attributeChangedCallback('class');
|
21137 | }
|
21138 |
|
21139 | var bottomToolbar = util$4.findChild(this, 'ons-bottom-toolbar');
|
21140 |
|
21141 | if (bottomToolbar) {
|
21142 | this._defaultClassName += ' page-with-bottom-toolbar';
|
21143 | this.attributeChangedCallback('class');
|
21144 | }
|
21145 |
|
21146 | ModifierUtil.initModifier(this, scheme$c);
|
21147 | }
|
21148 | }, {
|
21149 | key: "_elementShouldBeMoved",
|
21150 | value: function _elementShouldBeMoved(el) {
|
21151 | if (el.classList.contains('page__background')) {
|
21152 | return false;
|
21153 | }
|
21154 |
|
21155 | var tagName = el.tagName.toLowerCase();
|
21156 |
|
21157 | if (tagName === 'ons-fab') {
|
21158 | return !el.hasAttribute('position');
|
21159 | }
|
21160 |
|
21161 | var fixedElements = ['script', 'ons-toolbar', 'ons-bottom-toolbar', 'ons-modal', 'ons-speed-dial', 'ons-dialog', 'ons-alert-dialog', 'ons-popover', 'ons-action-sheet'];
|
21162 | return el.hasAttribute('inline') || fixedElements.indexOf(tagName) === -1;
|
21163 | }
|
21164 | }, {
|
21165 | key: "_tryToFillStatusBar",
|
21166 | value: function _tryToFillStatusBar() {
|
21167 | var _this3 = this;
|
21168 |
|
21169 | var content = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._contentElement;
|
21170 | internal$1.autoStatusBarFill(function () {
|
21171 | util$4.toggleAttribute(_this3, 'status-bar-fill', !util$4.findParent(_this3, function (e) {
|
21172 | return e.hasAttribute('status-bar-fill');
|
21173 | }) // Not already filled
|
21174 | && (_this3._canAnimateToolbar(content) || !util$4.findChild(content, util$4.isPageControl)) // Has toolbar or cannot delegate
|
21175 | );
|
21176 | });
|
21177 | }
|
21178 | }, {
|
21179 | key: "_canAnimateToolbar",
|
21180 | value: function _canAnimateToolbar() {
|
21181 | var content = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._contentElement;
|
21182 |
|
21183 | if (util$4.findChild(this, 'ons-toolbar')) {
|
21184 | return true;
|
21185 | }
|
21186 |
|
21187 | return !!util$4.findChild(content, function (el) {
|
21188 | return util$4.match(el, 'ons-toolbar') && !el.hasAttribute('inline');
|
21189 | });
|
21190 | }
|
21191 | }, {
|
21192 | key: "connectedCallback",
|
21193 | value: function connectedCallback() {
|
21194 | var _this4 = this;
|
21195 |
|
21196 | if (!util$4.isAttached(this)) {
|
21197 | // Avoid detached calls
|
21198 | return;
|
21199 | }
|
21200 |
|
21201 | contentReady(this, function () {
|
21202 | _this4._tryToFillStatusBar(); // Ensure status bar when the element was compiled before connected
|
21203 |
|
21204 |
|
21205 | if (_this4.hasAttribute('on-infinite-scroll')) {
|
21206 | _this4.attributeChangedCallback('on-infinite-scroll', null, _this4.getAttribute('on-infinite-scroll'));
|
21207 | }
|
21208 |
|
21209 | if (!_this4._initialized) {
|
21210 | _this4._initialized = true;
|
21211 | setImmediate(function () {
|
21212 | _this4.onInit && _this4.onInit();
|
21213 | util$4.triggerElementEvent(_this4, 'init');
|
21214 | });
|
21215 |
|
21216 | if (!util$4.hasAnyComponentAsParent(_this4)) {
|
21217 | setImmediate(function () {
|
21218 | return _this4._show();
|
21219 | });
|
21220 | }
|
21221 | }
|
21222 | });
|
21223 | }
|
21224 | }, {
|
21225 | key: "updateBackButton",
|
21226 | value: function updateBackButton(show) {
|
21227 | if (this.backButton) {
|
21228 | show ? this.backButton.show() : this.backButton.hide();
|
21229 | }
|
21230 | }
|
21231 | }, {
|
21232 | key: "name",
|
21233 | get: function get() {
|
21234 | return this.getAttribute('name');
|
21235 | },
|
21236 | set: function set(str) {
|
21237 | this.setAttribute('name', str);
|
21238 | }
|
21239 | }, {
|
21240 | key: "backButton",
|
21241 | get: function get() {
|
21242 | return this.querySelector('ons-back-button');
|
21243 | }
|
21244 | /**
|
21245 | * @property onInfiniteScroll
|
21246 | * @description
|
21247 | * [en]Function to be executed when scrolling to the bottom of the page. The function receives a done callback as an argument that must be called when it's finished.[/en]
|
21248 | * [ja][/ja]
|
21249 | */
|
21250 |
|
21251 | }, {
|
21252 | key: "onInfiniteScroll",
|
21253 | get: function get() {
|
21254 | return this._onInfiniteScroll;
|
21255 | },
|
21256 | set: function set(value) {
|
21257 | var _this5 = this;
|
21258 |
|
21259 | if (value && !(value instanceof Function)) {
|
21260 | util$4.throw('"onInfiniteScroll" must be function or null');
|
21261 | }
|
21262 |
|
21263 | contentReady(this, function () {
|
21264 | if (!value) {
|
21265 | _this5._contentElement.removeEventListener('scroll', _this5._boundOnScroll);
|
21266 | } else if (!_this5._onInfiniteScroll) {
|
21267 | _this5._infiniteScrollLimit = 0.9;
|
21268 | _this5._boundOnScroll = _this5._onScroll.bind(_this5);
|
21269 | setImmediate(function () {
|
21270 | return _this5._contentElement.addEventListener('scroll', _this5._boundOnScroll);
|
21271 | });
|
21272 | }
|
21273 |
|
21274 | _this5._onInfiniteScroll = value;
|
21275 | });
|
21276 | }
|
21277 | }, {
|
21278 | key: "_onScroll",
|
21279 | value: function _onScroll() {
|
21280 | var _this6 = this;
|
21281 |
|
21282 | var c = this._contentElement,
|
21283 | overLimit = (c.scrollTop + c.clientHeight) / c.scrollHeight >= this._infiniteScrollLimit;
|
21284 |
|
21285 | if (this._onInfiniteScroll && !this._loadingContent && overLimit) {
|
21286 | this._loadingContent = true;
|
21287 |
|
21288 | this._onInfiniteScroll(function () {
|
21289 | return _this6._loadingContent = false;
|
21290 | });
|
21291 | }
|
21292 | }
|
21293 | /**
|
21294 | * @property onDeviceBackButton
|
21295 | * @type {Object}
|
21296 | * @description
|
21297 | * [en]Back-button handler.[/en]
|
21298 | * [ja]バックボタンハンドラ。[/ja]
|
21299 | */
|
21300 |
|
21301 | }, {
|
21302 | key: "onDeviceBackButton",
|
21303 | get: function get() {
|
21304 | return this._backButtonHandler;
|
21305 | },
|
21306 | set: function set(callback) {
|
21307 | if (this._backButtonHandler) {
|
21308 | this._backButtonHandler.destroy();
|
21309 | }
|
21310 |
|
21311 | this._backButtonHandler = deviceBackButtonDispatcher.createHandler(this, callback);
|
21312 | }
|
21313 | }, {
|
21314 | key: "scrollTop",
|
21315 | get: function get() {
|
21316 | return this._contentElement.scrollTop;
|
21317 | },
|
21318 | set: function set(newValue) {
|
21319 | this._contentElement.scrollTop = newValue;
|
21320 | }
|
21321 | }, {
|
21322 | key: "_getContentElement",
|
21323 | value: function _getContentElement() {
|
21324 | var result = util$4.findChild(this, '.page__content');
|
21325 |
|
21326 | if (result) {
|
21327 | return result;
|
21328 | }
|
21329 |
|
21330 | util$4.throw('Fail to get ".page__content" element');
|
21331 | }
|
21332 | }, {
|
21333 | key: "_getBackgroundElement",
|
21334 | value: function _getBackgroundElement() {
|
21335 | var result = util$4.findChild(this, '.page__background');
|
21336 |
|
21337 | if (result) {
|
21338 | return result;
|
21339 | }
|
21340 |
|
21341 | util$4.throw('Fail to get ".page__background" element');
|
21342 | }
|
21343 | }, {
|
21344 | key: "_getBottomToolbarElement",
|
21345 | value: function _getBottomToolbarElement() {
|
21346 | return util$4.findChild(this, 'ons-bottom-toolbar') || internal$1.nullElement;
|
21347 | }
|
21348 | }, {
|
21349 | key: "_getToolbarElement",
|
21350 | value: function _getToolbarElement() {
|
21351 | return util$4.findChild(this, 'ons-toolbar') || document.createElement('ons-toolbar');
|
21352 | }
|
21353 | }, {
|
21354 | key: "attributeChangedCallback",
|
21355 | value: function attributeChangedCallback(name, last, current) {
|
21356 | var _this7 = this;
|
21357 |
|
21358 | switch (name) {
|
21359 | case 'class':
|
21360 | util$4.restoreClass(this, this._defaultClassName, scheme$c);
|
21361 | break;
|
21362 |
|
21363 | case 'modifier':
|
21364 | ModifierUtil.onModifierChanged(last, current, this, scheme$c);
|
21365 | break;
|
21366 |
|
21367 | case 'on-infinite-scroll':
|
21368 | if (current === null) {
|
21369 | this.onInfiniteScroll = null;
|
21370 | } else {
|
21371 | this.onInfiniteScroll = function (done) {
|
21372 | var f = util$4.findFromPath(current);
|
21373 | _this7.onInfiniteScroll = f;
|
21374 | f(done);
|
21375 | };
|
21376 | }
|
21377 |
|
21378 | break;
|
21379 | }
|
21380 | }
|
21381 | }, {
|
21382 | key: "_show",
|
21383 | value: function _show() {
|
21384 | if (!this._isShown && util$4.isAttached(this)) {
|
21385 | this._isShown = true;
|
21386 | this.setAttribute('shown', '');
|
21387 | this.onShow && this.onShow();
|
21388 | util$4.triggerElementEvent(this, 'show');
|
21389 | util$4.propagateAction(this, '_show');
|
21390 | }
|
21391 | }
|
21392 | }, {
|
21393 | key: "_hide",
|
21394 | value: function _hide() {
|
21395 | if (this._isShown) {
|
21396 | this._isShown = false;
|
21397 | this.removeAttribute('shown');
|
21398 | this.onHide && this.onHide();
|
21399 | util$4.triggerElementEvent(this, 'hide');
|
21400 | util$4.propagateAction(this, '_hide');
|
21401 | }
|
21402 | }
|
21403 | }, {
|
21404 | key: "_destroy",
|
21405 | value: function _destroy() {
|
21406 | this._hide();
|
21407 |
|
21408 | this.onDestroy && this.onDestroy();
|
21409 | util$4.triggerElementEvent(this, 'destroy');
|
21410 |
|
21411 | if (this.onDeviceBackButton) {
|
21412 | this.onDeviceBackButton.destroy();
|
21413 | }
|
21414 |
|
21415 | util$4.propagateAction(this, '_destroy');
|
21416 | this.remove();
|
21417 | }
|
21418 | }, {
|
21419 | key: "_deriveHooks",
|
21420 | value: function _deriveHooks() {
|
21421 | var _this8 = this;
|
21422 |
|
21423 | this.constructor.events.forEach(function (event) {
|
21424 | var key = 'on' + event.charAt(0).toUpperCase() + event.slice(1);
|
21425 | Object.defineProperty(_this8, key, {
|
21426 | configurable: true,
|
21427 | enumerable: true,
|
21428 | get: function get() {
|
21429 | return _this8["_".concat(key)];
|
21430 | },
|
21431 | set: function set(value) {
|
21432 | if (!(value instanceof Function)) {
|
21433 | util$4.throw("\"".concat(key, "\" hook must be a function"));
|
21434 | }
|
21435 |
|
21436 | _this8["_".concat(key)] = value.bind(_this8);
|
21437 | }
|
21438 | });
|
21439 | });
|
21440 | }
|
21441 | }], [{
|
21442 | key: "observedAttributes",
|
21443 | get: function get() {
|
21444 | return ['modifier', 'on-infinite-scroll', 'class'];
|
21445 | }
|
21446 | }, {
|
21447 | key: "events",
|
21448 | get: function get() {
|
21449 | return ['init', 'show', 'hide', 'destroy'];
|
21450 | }
|
21451 | /**
|
21452 | * @property data
|
21453 | * @type {*}
|
21454 | * @description
|
21455 | * [en]User's custom data passed to `pushPage()`-like methods.[/en]
|
21456 | * [ja][/ja]
|
21457 | */
|
21458 |
|
21459 | }]);
|
21460 |
|
21461 | return PageElement;
|
21462 | }(BaseElement);
|
21463 | onsElements.Page = PageElement;
|
21464 | customElements.define('ons-page', PageElement);
|
21465 |
|
21466 | var PopoverAnimator = /*#__PURE__*/function (_BaseAnimator) {
|
21467 | _inherits(PopoverAnimator, _BaseAnimator);
|
21468 |
|
21469 | var _super = _createSuper(PopoverAnimator);
|
21470 |
|
21471 | /**
|
21472 | * @param {Object} options
|
21473 | * @param {String} options.timing
|
21474 | * @param {Number} options.duration
|
21475 | * @param {Number} options.delay
|
21476 | */
|
21477 | function PopoverAnimator() {
|
21478 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
21479 | _ref$timing = _ref.timing,
|
21480 | timing = _ref$timing === void 0 ? 'cubic-bezier(.1, .7, .4, 1)' : _ref$timing,
|
21481 | _ref$delay = _ref.delay,
|
21482 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
21483 | _ref$duration = _ref.duration,
|
21484 | duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
|
21485 |
|
21486 | _classCallCheck(this, PopoverAnimator);
|
21487 |
|
21488 | return _super.call(this, {
|
21489 | timing: timing,
|
21490 | delay: delay,
|
21491 | duration: duration
|
21492 | });
|
21493 | }
|
21494 |
|
21495 | _createClass(PopoverAnimator, [{
|
21496 | key: "show",
|
21497 | value: function show(popover, callback) {
|
21498 | callback();
|
21499 | }
|
21500 | }, {
|
21501 | key: "hide",
|
21502 | value: function hide(popover, callback) {
|
21503 | callback();
|
21504 | }
|
21505 | }, {
|
21506 | key: "_animate",
|
21507 | value: function _animate(element, _ref2) {
|
21508 | var from = _ref2.from,
|
21509 | to = _ref2.to,
|
21510 | options = _ref2.options,
|
21511 | callback = _ref2.callback,
|
21512 | _ref2$restore = _ref2.restore,
|
21513 | restore = _ref2$restore === void 0 ? false : _ref2$restore,
|
21514 | animation = _ref2.animation;
|
21515 | options = util$4.extend({}, this.options, options);
|
21516 |
|
21517 | if (animation) {
|
21518 | from = animation.from;
|
21519 | to = animation.to;
|
21520 | }
|
21521 |
|
21522 | animation = Animit(element);
|
21523 |
|
21524 | if (restore) {
|
21525 | animation = animation.saveStyle();
|
21526 | }
|
21527 |
|
21528 | animation = animation.queue(from).wait(this.delay).queue({
|
21529 | css: to,
|
21530 | duration: this.duration,
|
21531 | timing: this.timing
|
21532 | });
|
21533 |
|
21534 | if (restore) {
|
21535 | animation = animation.restoreStyle();
|
21536 | }
|
21537 |
|
21538 | if (callback) {
|
21539 | animation = animation.queue(function (done) {
|
21540 | callback();
|
21541 | done();
|
21542 | });
|
21543 | }
|
21544 |
|
21545 | return animation;
|
21546 | }
|
21547 | }, {
|
21548 | key: "_animateAll",
|
21549 | value: function _animateAll(element, animations) {
|
21550 | var _this = this;
|
21551 |
|
21552 | Object.keys(animations).forEach(function (key) {
|
21553 | return _this._animate(element[key], animations[key]).play();
|
21554 | });
|
21555 | }
|
21556 | }]);
|
21557 |
|
21558 | return PopoverAnimator;
|
21559 | }(BaseAnimator);
|
21560 | var fade = {
|
21561 | out: {
|
21562 | from: {
|
21563 | opacity: 1.0
|
21564 | },
|
21565 | to: {
|
21566 | opacity: 0
|
21567 | }
|
21568 | },
|
21569 | in: {
|
21570 | from: {
|
21571 | opacity: 0
|
21572 | },
|
21573 | to: {
|
21574 | opacity: 1.0
|
21575 | }
|
21576 | }
|
21577 | };
|
21578 | var MDFadePopoverAnimator = /*#__PURE__*/function (_PopoverAnimator) {
|
21579 | _inherits(MDFadePopoverAnimator, _PopoverAnimator);
|
21580 |
|
21581 | var _super2 = _createSuper(MDFadePopoverAnimator);
|
21582 |
|
21583 | function MDFadePopoverAnimator() {
|
21584 | _classCallCheck(this, MDFadePopoverAnimator);
|
21585 |
|
21586 | return _super2.apply(this, arguments);
|
21587 | }
|
21588 |
|
21589 | _createClass(MDFadePopoverAnimator, [{
|
21590 | key: "show",
|
21591 | value: function show(popover, callback) {
|
21592 | this._animateAll(popover, {
|
21593 | _mask: fade.in,
|
21594 | _popover: {
|
21595 | animation: fade.in,
|
21596 | restore: true,
|
21597 | callback: callback
|
21598 | }
|
21599 | });
|
21600 | }
|
21601 | }, {
|
21602 | key: "hide",
|
21603 | value: function hide(popover, callback) {
|
21604 | this._animateAll(popover, {
|
21605 | _mask: fade.out,
|
21606 | _popover: {
|
21607 | animation: fade.out,
|
21608 | restore: true,
|
21609 | callback: callback
|
21610 | }
|
21611 | });
|
21612 | }
|
21613 | }]);
|
21614 |
|
21615 | return MDFadePopoverAnimator;
|
21616 | }(PopoverAnimator);
|
21617 | var IOSFadePopoverAnimator = /*#__PURE__*/function (_MDFadePopoverAnimato) {
|
21618 | _inherits(IOSFadePopoverAnimator, _MDFadePopoverAnimato);
|
21619 |
|
21620 | var _super3 = _createSuper(IOSFadePopoverAnimator);
|
21621 |
|
21622 | function IOSFadePopoverAnimator() {
|
21623 | _classCallCheck(this, IOSFadePopoverAnimator);
|
21624 |
|
21625 | return _super3.apply(this, arguments);
|
21626 | }
|
21627 |
|
21628 | _createClass(IOSFadePopoverAnimator, [{
|
21629 | key: "show",
|
21630 | value: function show(popover, callback) {
|
21631 | this._animateAll(popover, {
|
21632 | _mask: fade.in,
|
21633 | _popover: {
|
21634 | from: {
|
21635 | transform: 'scale3d(1.3, 1.3, 1.0)',
|
21636 | opacity: 0
|
21637 | },
|
21638 | to: {
|
21639 | transform: 'scale3d(1.0, 1.0, 1.0)',
|
21640 | opacity: 1.0
|
21641 | },
|
21642 | restore: true,
|
21643 | callback: callback
|
21644 | }
|
21645 | });
|
21646 | }
|
21647 | }]);
|
21648 |
|
21649 | return IOSFadePopoverAnimator;
|
21650 | }(MDFadePopoverAnimator);
|
21651 |
|
21652 | var scheme$b = {
|
21653 | '.popover': 'popover--*',
|
21654 | '.popover-mask': 'popover-mask--*',
|
21655 | '.popover__content': 'popover--*__content',
|
21656 | '.popover__arrow': 'popover--*__arrow'
|
21657 | };
|
21658 | var _animatorDict$2 = {
|
21659 | 'default': function _default() {
|
21660 | return platform.isAndroid() ? MDFadePopoverAnimator : IOSFadePopoverAnimator;
|
21661 | },
|
21662 | 'none': PopoverAnimator,
|
21663 | 'fade-ios': IOSFadePopoverAnimator,
|
21664 | 'fade-md': MDFadePopoverAnimator
|
21665 | };
|
21666 | var positions = {
|
21667 | up: 'bottom',
|
21668 | left: 'right',
|
21669 | down: 'top',
|
21670 | right: 'left'
|
21671 | };
|
21672 | /**
|
21673 | * @element ons-popover
|
21674 | * @category dialog
|
21675 | * @description
|
21676 | * [en]
|
21677 | * A component that displays a popover next to an element. The popover can be used to display extra information about a component or a tooltip.
|
21678 | *
|
21679 | * To use the element it can either be attached directly to the `<body>` element or dynamically created from a template using the `ons.createPopover(template)` utility function and the `<template>` tag.
|
21680 | *
|
21681 | * Another common way to use the popover is to display a menu when a button on the screen is tapped. For Material Design, popover looks exactly as a dropdown menu.
|
21682 | * [/en]
|
21683 | * [ja]ある要素を対象とするポップオーバーを表示するコンポーネントです。[/ja]
|
21684 | * @codepen ZYYRKo
|
21685 | * @tutorial vanilla/Reference/popover
|
21686 | * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
|
21687 | * @example
|
21688 | * <ons-button onclick="showPopover(this)">
|
21689 | * Click me!
|
21690 | * </ons-button>
|
21691 | *
|
21692 | * <ons-popover direction="down" id="popover">
|
21693 | * <p>This is a popover!</p>
|
21694 | * </ons-popover>
|
21695 | *
|
21696 | * <script>
|
21697 | * var showPopover = function(element) {
|
21698 | * var popover = document.getElementById('popover');
|
21699 | * popover.show(element);
|
21700 | * };
|
21701 | * </script>
|
21702 | */
|
21703 |
|
21704 | var PopoverElement = /*#__PURE__*/function (_BaseDialogElement) {
|
21705 | _inherits(PopoverElement, _BaseDialogElement);
|
21706 |
|
21707 | var _super = _createSuper(PopoverElement);
|
21708 |
|
21709 | /**
|
21710 | * @event preshow
|
21711 | * @description
|
21712 | * [en]Fired just before the popover is displayed.[/en]
|
21713 | * [ja]ポップオーバーが表示される直前に発火します。[/ja]
|
21714 | * @param {Object} event [en]Event object.[/en]
|
21715 | * @param {Object} event.popover
|
21716 | * [en]Component object.[/en]
|
21717 | * [ja]コンポーネントのオブジェクト。[/ja]
|
21718 | * @param {Function} event.cancel
|
21719 | * [en]Call this function to stop the popover from being shown.[/en]
|
21720 | * [ja]この関数を呼び出すと、ポップオーバーの表示がキャンセルされます。[/ja]
|
21721 | */
|
21722 |
|
21723 | /**
|
21724 | * @event postshow
|
21725 | * @description
|
21726 | * [en]Fired just after the popover is displayed.[/en]
|
21727 | * [ja]ポップオーバーが表示された直後に発火します。[/ja]
|
21728 | * @param {Object} event [en]Event object.[/en]
|
21729 | * @param {Object} event.popover
|
21730 | * [en]Component object.[/en]
|
21731 | * [ja]コンポーネントのオブジェクト。[/ja]
|
21732 | */
|
21733 |
|
21734 | /**
|
21735 | * @event prehide
|
21736 | * @description
|
21737 | * [en]Fired just before the popover is hidden.[/en]
|
21738 | * [ja]ポップオーバーが隠れる直前に発火します。[/ja]
|
21739 | * @param {Object} event [en]Event object.[/en]
|
21740 | * @param {Object} event.popover
|
21741 | * [en]Component object.[/en]
|
21742 | * [ja]コンポーネントのオブジェクト。[/ja]
|
21743 | * @param {Function} event.cancel
|
21744 | * [en]Call this function to stop the popover from being hidden.[/en]
|
21745 | * [ja]この関数を呼び出すと、ポップオーバーが隠れる処理をキャンセルします。[/ja]
|
21746 | */
|
21747 |
|
21748 | /**
|
21749 | * @event posthide
|
21750 | * @description
|
21751 | * [en]Fired just after the popover is hidden.[/en]
|
21752 | * [ja]ポップオーバーが隠れた後に発火します。[/ja]
|
21753 | * @param {Object} event [en]Event object.[/en]
|
21754 | * @param {Object} event.popover
|
21755 | * [en]Component object.[/en]
|
21756 | * [ja]コンポーネントのオブジェクト。[/ja]
|
21757 | */
|
21758 |
|
21759 | /**
|
21760 | * @event dialogcancel
|
21761 | * @description
|
21762 | * [en]Fired when the popover is canceled.[/en]
|
21763 | * [ja][/ja]
|
21764 | */
|
21765 |
|
21766 | /**
|
21767 | * @attribute modifier
|
21768 | * @type {String}
|
21769 | * @description
|
21770 | * [en]The appearance of the popover.[/en]
|
21771 | * [ja]ポップオーバーの表現を指定します。[/ja]
|
21772 | */
|
21773 |
|
21774 | /**
|
21775 | * @attribute direction
|
21776 | * @type {String}
|
21777 | * @description
|
21778 | * [en]
|
21779 | * A space separated list of directions. If more than one direction is specified,
|
21780 | * it will be chosen automatically. Valid directions are `"up"`, `"down"`, `"left"` and `"right"`.
|
21781 | * [/en]
|
21782 | * [ja]
|
21783 | * ポップオーバーを表示する方向を空白区切りで複数指定できます。
|
21784 | * 指定できる方向は、"up", "down", "left", "right"の4つです。空白区切りで複数指定することもできます。
|
21785 | * 複数指定された場合、対象とする要素に合わせて指定した値から自動的に選択されます。
|
21786 | * [/ja]
|
21787 | */
|
21788 |
|
21789 | /**
|
21790 | * @attribute cancelable
|
21791 | * @description
|
21792 | * [en]If this attribute is set the popover can be closed by tapping the background or by pressing the back button.[/en]
|
21793 | * [ja]この属性があると、ポップオーバーが表示された時に、背景やバックボタンをタップした時にをポップオーバー閉じます。[/ja]
|
21794 | */
|
21795 |
|
21796 | /**
|
21797 | * @attribute cover-target
|
21798 | * @description
|
21799 | * [en]If set the popover will cover the target on the screen.[/en]
|
21800 | * [ja][/ja]
|
21801 | */
|
21802 |
|
21803 | /**
|
21804 | * @property coverTarget
|
21805 | * @description
|
21806 | * [en]If set the popover will cover the target on the screen.[/en]
|
21807 | * [ja][/ja]
|
21808 | */
|
21809 |
|
21810 | /**
|
21811 | * @attribute animation
|
21812 | * @type {String}
|
21813 | * @description
|
21814 | * [en]The animation used when showing an hiding the popover. Can be either `"none"`, `"default"`, `"fade-ios"` or `"fade-md"`.[/en]
|
21815 | * [ja]ポップオーバーを表示する際のアニメーション名を指定します。[/ja]
|
21816 | */
|
21817 |
|
21818 | /**
|
21819 | * @attribute animation-options
|
21820 | * @type {Expression}
|
21821 | * @description
|
21822 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
21823 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. {duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
|
21824 | */
|
21825 |
|
21826 | /**
|
21827 | * @property animationOptions
|
21828 | * @type {Object}
|
21829 | * @description
|
21830 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
21831 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
|
21832 | */
|
21833 |
|
21834 | /**
|
21835 | * @attribute mask-color
|
21836 | * @type {Color}
|
21837 | * @description
|
21838 | * [en]Color of the background mask. Default is `"rgba(0, 0, 0, 0.2)"`.[/en]
|
21839 | * [ja]背景のマスクの色を指定します。デフォルトは"rgba(0, 0, 0, 0.2)"です。[/ja]
|
21840 | */
|
21841 |
|
21842 | /**
|
21843 | * @attribute visible
|
21844 | * @type {Boolean}
|
21845 | * @description
|
21846 | * [en]Whether the popover is visible or not.[/en]
|
21847 | * [ja]要素が見える場合に`true`。[/ja]
|
21848 | */
|
21849 | function PopoverElement() {
|
21850 | var _this;
|
21851 |
|
21852 | _classCallCheck(this, PopoverElement);
|
21853 |
|
21854 | _this = _super.call(this);
|
21855 | _this._boundOnChange = _this._onChange.bind(_assertThisInitialized(_this));
|
21856 | contentReady(_assertThisInitialized(_this), function () {
|
21857 | _this._compile();
|
21858 |
|
21859 | _this.style.display = 'none';
|
21860 | });
|
21861 | return _this;
|
21862 | }
|
21863 |
|
21864 | _createClass(PopoverElement, [{
|
21865 | key: "_scheme",
|
21866 | get: function get() {
|
21867 | return scheme$b;
|
21868 | }
|
21869 | }, {
|
21870 | key: "_mask",
|
21871 | get: function get() {
|
21872 | return util$4.findChild(this, '.popover-mask');
|
21873 | }
|
21874 | }, {
|
21875 | key: "_popover",
|
21876 | get: function get() {
|
21877 | return util$4.findChild(this, '.popover');
|
21878 | }
|
21879 | }, {
|
21880 | key: "_content",
|
21881 | get: function get() {
|
21882 | return util$4.findChild(this._popover, '.popover__content');
|
21883 | }
|
21884 | }, {
|
21885 | key: "_arrow",
|
21886 | get: function get() {
|
21887 | return util$4.findChild(this._popover, '.popover__arrow');
|
21888 | }
|
21889 | }, {
|
21890 | key: "_updateAnimatorFactory",
|
21891 | value: function _updateAnimatorFactory() {
|
21892 | return new AnimatorFactory({
|
21893 | animators: _animatorDict$2,
|
21894 | baseClass: PopoverAnimator,
|
21895 | baseClassName: 'PopoverAnimator',
|
21896 | defaultAnimation: this.getAttribute('animation') || 'default'
|
21897 | });
|
21898 | }
|
21899 | }, {
|
21900 | key: "_toggleStyle",
|
21901 | value: function _toggleStyle(shouldShow) {
|
21902 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
21903 |
|
21904 | if (shouldShow) {
|
21905 | this.style.display = 'block';
|
21906 | this._currentTarget = options.target;
|
21907 |
|
21908 | this._positionPopover(options.target);
|
21909 | } else {
|
21910 | this.style.display = 'none';
|
21911 |
|
21912 | this._clearStyles();
|
21913 | }
|
21914 | }
|
21915 | }, {
|
21916 | key: "_positionPopover",
|
21917 | value: function _positionPopover(target) {
|
21918 | var radius = this._radius,
|
21919 | contentElement = this._content,
|
21920 | margin = this._margin;
|
21921 | var safeAreaLengths = iPhoneXPatch.getSafeAreaLengths();
|
21922 | var safeAreaRect = iPhoneXPatch.getSafeAreaDOMRect();
|
21923 | var targetRect = target.getBoundingClientRect();
|
21924 | var isMD = util$4.hasModifier(this, 'material');
|
21925 | var cover = isMD && this.hasAttribute('cover-target');
|
21926 | var parent = util$4.findParent(this, 'ons-page') || document.body;
|
21927 | var parentDimensions = parent.getBoundingClientRect();
|
21928 | var maxPositions = {
|
21929 | top: Math.max(parentDimensions.top, safeAreaRect.top),
|
21930 | left: Math.max(parentDimensions.left, safeAreaRect.left),
|
21931 | bottom: Math.min(parentDimensions.bottom, safeAreaRect.bottom),
|
21932 | right: Math.min(parentDimensions.right, safeAreaRect.right)
|
21933 | }; // Distance from each side of the safe area (with margin) to the target element
|
21934 |
|
21935 | var targetDistance = {
|
21936 | top: targetRect.top - (maxPositions.top + margin),
|
21937 | left: targetRect.left - (maxPositions.left + margin),
|
21938 | bottom: maxPositions.bottom - margin - targetRect.bottom,
|
21939 | right: maxPositions.right - margin - targetRect.right
|
21940 | }; // Distance from each side of the safe area (with margin) to the geometric center of the target element
|
21941 |
|
21942 | var targetCenterDistanceFrom = {
|
21943 | top: targetRect.top + Math.round(targetRect.height / 2) - (maxPositions.top + margin),
|
21944 | left: targetRect.left + Math.round(targetRect.width / 2) - (maxPositions.left + margin),
|
21945 | bottom: maxPositions.bottom - margin - targetRect.bottom + Math.round(targetRect.height / 2),
|
21946 | right: maxPositions.right - margin - targetRect.right + Math.round(targetRect.width / 2)
|
21947 | };
|
21948 |
|
21949 | var _this$_calculateDirec = this._calculateDirections(targetDistance),
|
21950 | vertical = _this$_calculateDirec.vertical,
|
21951 | primaryDirection = _this$_calculateDirec.primary,
|
21952 | secondaryDirection = _this$_calculateDirec.secondary;
|
21953 |
|
21954 | this._currentDirection = primaryDirection;
|
21955 | util$4.addModifier(this, primaryDirection);
|
21956 | var sizeName = vertical ? 'width' : 'height'; // Get .popover__content size
|
21957 |
|
21958 | var contentSize = function (style) {
|
21959 | return {
|
21960 | width: parseInt(style.getPropertyValue('width'), 10),
|
21961 | height: parseInt(style.getPropertyValue('height'), 10)
|
21962 | };
|
21963 | }(window.getComputedStyle(contentElement)); // Setting .popover position.
|
21964 |
|
21965 |
|
21966 | var targetAndArrowLength = cover ? 0 : (vertical ? targetRect.height : targetRect.width) + (isMD ? 0 : 14);
|
21967 | var primaryOffset = Math.max(safeAreaLengths[primaryDirection] + margin, safeAreaLengths[primaryDirection] + margin + targetDistance[primaryDirection] + targetAndArrowLength);
|
21968 | var secondaryOffset = Math.max(safeAreaLengths[secondaryDirection] + margin, safeAreaLengths[secondaryDirection] + margin + targetCenterDistanceFrom[secondaryDirection] - contentSize[sizeName] / 2);
|
21969 | this._popover.style[primaryDirection] = primaryOffset + 'px';
|
21970 | this._popover.style[secondaryDirection] = secondaryOffset + 'px'; // Setting .popover__arrow position.
|
21971 |
|
21972 | this._arrow.style[secondaryDirection] = Math.max(radius, safeAreaLengths[secondaryDirection] + margin + targetCenterDistanceFrom[secondaryDirection] - secondaryOffset) + 'px';
|
21973 | }
|
21974 | }, {
|
21975 | key: "_calculateDirections",
|
21976 | value: function _calculateDirections(distance) {
|
21977 | var options = (this.getAttribute('direction') || 'up down left right').split(/\s+/).map(function (e) {
|
21978 | return positions[e];
|
21979 | });
|
21980 | var primary = options.sort(function (a, b) {
|
21981 | return distance[a] - distance[b];
|
21982 | })[0];
|
21983 | var vertical = 'top' == primary || 'bottom' == primary;
|
21984 | var secondary;
|
21985 |
|
21986 | if (vertical) {
|
21987 | secondary = distance.left < distance.right ? 'left' : 'right';
|
21988 | } else {
|
21989 | secondary = distance.top < distance.bottom ? 'top' : 'bottom';
|
21990 | }
|
21991 |
|
21992 | return {
|
21993 | vertical: vertical,
|
21994 | primary: primary,
|
21995 | secondary: secondary
|
21996 | };
|
21997 | }
|
21998 | }, {
|
21999 | key: "_clearStyles",
|
22000 | value: function _clearStyles() {
|
22001 | var _this2 = this;
|
22002 |
|
22003 | this._currentDirection = null;
|
22004 | ['top', 'bottom', 'left', 'right'].forEach(function (e) {
|
22005 | _this2._arrow.style[e] = _this2._content.style[e] = _this2._popover.style[e] = '';
|
22006 | util$4.removeModifier(_this2, e);
|
22007 | });
|
22008 | }
|
22009 | }, {
|
22010 | key: "_onChange",
|
22011 | value: function _onChange() {
|
22012 | var _this3 = this;
|
22013 |
|
22014 | setImmediate(function () {
|
22015 | if (_this3._currentTarget) {
|
22016 | _this3._positionPopover(_this3._currentTarget);
|
22017 | }
|
22018 | });
|
22019 | }
|
22020 | }, {
|
22021 | key: "_compile",
|
22022 | value: function _compile() {
|
22023 | autoStyle.prepare(this);
|
22024 |
|
22025 | if (this._popover && this._mask) {
|
22026 | return;
|
22027 | }
|
22028 |
|
22029 | var hasDefaultContainer = this._popover && this._content;
|
22030 |
|
22031 | if (hasDefaultContainer) {
|
22032 | if (!this._mask) {
|
22033 | var mask = document.createElement('div');
|
22034 | mask.classList.add('popover-mask');
|
22035 | this.insertBefore(mask, this.firstChild);
|
22036 | }
|
22037 |
|
22038 | if (!this._arrow) {
|
22039 | var arrow = document.createElement('div');
|
22040 | arrow.classList.add('popover__arrow');
|
22041 |
|
22042 | this._popover.appendChild(arrow);
|
22043 | }
|
22044 | } else {
|
22045 | var template = util$4.createFragment("\n <div class=\"popover-mask\"></div>\n <div class=\"popover\">\n <div class=\"popover__content\"></div>\n <div class=\"popover__arrow\"></div>\n </div>\n ");
|
22046 | var content = template.querySelector('.popover__content');
|
22047 |
|
22048 | while (this.childNodes[0]) {
|
22049 | content.appendChild(this.childNodes[0]);
|
22050 | }
|
22051 |
|
22052 | this.appendChild(template);
|
22053 | } // FIXME!
|
22054 |
|
22055 |
|
22056 | if (this.hasAttribute('style')) {
|
22057 | this._popover.setAttribute('style', this.getAttribute('style'));
|
22058 |
|
22059 | this.removeAttribute('style');
|
22060 | }
|
22061 |
|
22062 | ModifierUtil.initModifier(this, this._scheme);
|
22063 | }
|
22064 | /**
|
22065 | * @method show
|
22066 | * @signature show(target, [options])
|
22067 | * @param {String|Event|HTMLElement} target
|
22068 | * [en]Target element. Can be either a CSS selector, an event object or a DOM element. It can be also provided as 'options.target' instead. [/en]
|
22069 | * [ja]ポップオーバーのターゲットとなる要素を指定します。CSSセレクタかeventオブジェクトかDOM要素のいずれかを渡せます。[/ja]
|
22070 | * @param {Object} [options]
|
22071 | * [en]Parameter object.[/en]
|
22072 | * [ja]オプションを指定するオブジェクト。[/ja]
|
22073 | * @param {String} [options.animation]
|
22074 | * [en]Animation name. Use one of `"fade-ios"`, `"fade-md"`, `"none"` and `"default"`.[/en]
|
22075 | * [ja]アニメーション名を指定します。"fade-ios", "fade-md", "none", "default"のいずれかを指定できます。[/ja]
|
22076 | * @param {String} [options.animationOptions]
|
22077 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
|
22078 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
|
22079 | * @param {Function} [options.callback]
|
22080 | * [en]This function is called after the popover has been revealed.[/en]
|
22081 | * [ja]ポップオーバーが表示され終わった後に呼び出される関数オブジェクトを指定します。[/ja]
|
22082 | * @description
|
22083 | * [en]Open the popover and point it at a target. The target can be either an event, a CSS selector or a DOM element..[/en]
|
22084 | * [ja]対象とする要素にポップオーバーを表示します。target引数には、$eventオブジェクトやDOMエレメントやCSSセレクタを渡すことが出来ます。[/ja]
|
22085 | * @return {Promise}
|
22086 | * [en]Resolves to the displayed element[/en]
|
22087 | * [ja][/ja]
|
22088 | */
|
22089 |
|
22090 | }, {
|
22091 | key: "show",
|
22092 | value: function show(target) {
|
22093 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
22094 |
|
22095 | // Copy options and include options.target
|
22096 | if (target && _typeof(target) === 'object' && !(target instanceof Event) && !(target instanceof HTMLElement)) {
|
22097 | options = _objectSpread2({}, target);
|
22098 | } else {
|
22099 | options = _objectSpread2(_objectSpread2({}, options), {}, {
|
22100 | target: target
|
22101 | });
|
22102 | }
|
22103 |
|
22104 | if (typeof options.target === 'string') {
|
22105 | options.target = document.querySelector(options.target);
|
22106 | } else if (options.target instanceof Event) {
|
22107 | options.target = options.target.target;
|
22108 | }
|
22109 |
|
22110 | if (!(options.target instanceof HTMLElement)) {
|
22111 | util$4.throw('Invalid target type or undefined');
|
22112 | }
|
22113 |
|
22114 | return _get(_getPrototypeOf(PopoverElement.prototype), "show", this).call(this, options);
|
22115 | }
|
22116 | /**
|
22117 | * @method hide
|
22118 | * @signature hide([options])
|
22119 | * @param {Object} [options]
|
22120 | * [en]Parameter object.[/en]
|
22121 | * [ja]オプションを指定するオブジェクト。[/ja]
|
22122 | * @param {String} [options.animation]
|
22123 | * [en]Animation name. Use one of `"fade-ios"`, `"fade-md"`, `"none"` and `"default"`.[/en]
|
22124 | * [ja]アニメーション名を指定します。"fade-ios", "fade-md", "none", "default"のいずれかを指定できます。[/ja]
|
22125 | * @param {String} [options.animationOptions]
|
22126 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
|
22127 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
|
22128 | * @param {Function} [options.callback]
|
22129 | * [en]This functions is called after the popover has been hidden.[/en]
|
22130 | * [ja]ポップオーバーが隠れた後に呼び出される関数オブジェクトを指定します。[/ja]
|
22131 | * @description
|
22132 | * [en]Close the popover.[/en]
|
22133 | * [ja]ポップオーバーを閉じます。[/ja]
|
22134 | * @return {Promise}
|
22135 | * [en]Resolves to the hidden element[/en]
|
22136 | * [ja][/ja]
|
22137 | */
|
22138 |
|
22139 | /**
|
22140 | * @property visible
|
22141 | * @type {Boolean}
|
22142 | * @description
|
22143 | * [en]Whether the element is visible or not.[/en]
|
22144 | * [ja]要素が見える場合に`true`。[/ja]
|
22145 | */
|
22146 |
|
22147 | /**
|
22148 | * @property cancelable
|
22149 | * @type {Boolean}
|
22150 | * @description
|
22151 | * [en]
|
22152 | * A boolean value that specifies whether the popover is cancelable or not.
|
22153 | *
|
22154 | * When the popover is cancelable it can be closed by tapping the background or by pressing the back button on Android devices.
|
22155 | * [/en]
|
22156 | * [ja][/ja]
|
22157 | */
|
22158 |
|
22159 | /**
|
22160 | * @property onDeviceBackButton
|
22161 | * @type {Object}
|
22162 | * @description
|
22163 | * [en]Back-button handler.[/en]
|
22164 | * [ja]バックボタンハンドラ。[/ja]
|
22165 | */
|
22166 |
|
22167 | /**
|
22168 | * @property maskColor
|
22169 | * @type {String}
|
22170 | * @default rgba(0, 0, 0, 0.2)
|
22171 | * @description
|
22172 | * [en]Color of the background mask. Default is "rgba(0, 0, 0, 0.2)".[/en]
|
22173 | * [ja]背景のマスクの色を指定します。"rgba(0, 0, 0, 0.2)"がデフォルト値です。[/ja]
|
22174 | */
|
22175 |
|
22176 | }, {
|
22177 | key: "connectedCallback",
|
22178 | value: function connectedCallback() {
|
22179 | var _this4 = this;
|
22180 |
|
22181 | _get(_getPrototypeOf(PopoverElement.prototype), "connectedCallback", this).call(this);
|
22182 |
|
22183 | window.addEventListener('resize', this._boundOnChange, false);
|
22184 | this._margin = this._margin || parseInt(window.getComputedStyle(this).getPropertyValue('top'));
|
22185 | this._margin = this._margin || 6; // Fix for iframes
|
22186 |
|
22187 | contentReady(this, function () {
|
22188 | _this4._radius = parseInt(window.getComputedStyle(_this4._content).getPropertyValue('border-top-left-radius'));
|
22189 | });
|
22190 | }
|
22191 | }, {
|
22192 | key: "disconnectedCallback",
|
22193 | value: function disconnectedCallback() {
|
22194 | _get(_getPrototypeOf(PopoverElement.prototype), "disconnectedCallback", this).call(this);
|
22195 |
|
22196 | window.removeEventListener('resize', this._boundOnChange, false);
|
22197 | }
|
22198 | }, {
|
22199 | key: "attributeChangedCallback",
|
22200 | value: function attributeChangedCallback(name, last, current) {
|
22201 | if (name === 'direction') {
|
22202 | return this._boundOnChange();
|
22203 | } else if (name === 'modifier') {
|
22204 | this._currentDirection && util$4.addModifier(this, this._currentDirection);
|
22205 | }
|
22206 |
|
22207 | _get(_getPrototypeOf(PopoverElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
|
22208 | }
|
22209 | /**
|
22210 | * @param {String} name
|
22211 | * @param {PopoverAnimator} Animator
|
22212 | */
|
22213 |
|
22214 | }], [{
|
22215 | key: "observedAttributes",
|
22216 | get: function get() {
|
22217 | return [].concat(_toConsumableArray(_get(_getPrototypeOf(PopoverElement), "observedAttributes", this)), ['direction']);
|
22218 | }
|
22219 | }, {
|
22220 | key: "registerAnimator",
|
22221 | value: function registerAnimator(name, Animator) {
|
22222 | if (!(Animator.prototype instanceof PopoverAnimator)) {
|
22223 | util$4.throwAnimator('Popover');
|
22224 | }
|
22225 |
|
22226 | _animatorDict$2[name] = Animator;
|
22227 | }
|
22228 | }, {
|
22229 | key: "animators",
|
22230 | get: function get() {
|
22231 | return _animatorDict$2;
|
22232 | }
|
22233 | }, {
|
22234 | key: "PopoverAnimator",
|
22235 | get: function get() {
|
22236 | return PopoverAnimator;
|
22237 | }
|
22238 | }]);
|
22239 |
|
22240 | return PopoverElement;
|
22241 | }(BaseDialogElement);
|
22242 | util$4.defineBooleanProperties(PopoverElement, ['cover-target']);
|
22243 | onsElements.Popover = PopoverElement;
|
22244 | customElements.define('ons-popover', PopoverElement);
|
22245 |
|
22246 | var scheme$a = {
|
22247 | '.progress-bar': 'progress-bar--*',
|
22248 | '.progress-bar__primary': 'progress-bar--*__primary',
|
22249 | '.progress-bar__secondary': 'progress-bar--*__secondary'
|
22250 | };
|
22251 | var template$1 = util$4.createElement("\n <div class=\"progress-bar\">\n <div class=\"progress-bar__secondary\"></div>\n <div class=\"progress-bar__primary\"></div>\n </div>\n");
|
22252 | var INDET$1 = 'indeterminate';
|
22253 | /**
|
22254 | * @element ons-progress-bar
|
22255 | * @category visual
|
22256 | * @modifier material
|
22257 | * [en]Display a Material Design progress bar.[/en]
|
22258 | * [ja]マテリアルデザインのスタイルでプログレスバーを表示します。[/ja]
|
22259 | * @description
|
22260 | * [en]
|
22261 | * The component is used to display a linear progress bar. It can either display a progress bar that shows the user how much of a task has been completed. In the case where the percentage is not known it can be used to display an animated progress bar so the user can see that an operation is in progress.
|
22262 | * [/en]
|
22263 | * [ja][/ja]
|
22264 | * @codepen zvQbGj
|
22265 | * @tutorial vanilla/Reference/progress
|
22266 | * @seealso ons-progress-circular
|
22267 | * [en]The `<ons-progress-circular>` component displays a circular progress indicator.[/en]
|
22268 | * [ja][/ja]
|
22269 | * @example
|
22270 | * <ons-progress-bar
|
22271 | * value="55"
|
22272 | * secondary-value="87">
|
22273 | * </ons-progress-bar>
|
22274 | *
|
22275 | * <ons-progress-bar
|
22276 | * indeterminate>
|
22277 | * </ons-progress-bar>
|
22278 | */
|
22279 |
|
22280 | var ProgressBarElement = /*#__PURE__*/function (_BaseElement) {
|
22281 | _inherits(ProgressBarElement, _BaseElement);
|
22282 |
|
22283 | var _super = _createSuper(ProgressBarElement);
|
22284 |
|
22285 | /**
|
22286 | * @attribute modifier
|
22287 | * @type {String}
|
22288 | * @description
|
22289 | * [en]Change the appearance of the progress indicator.[/en]
|
22290 | * [ja]プログレスインジケータの見た目を変更します。[/ja]
|
22291 | */
|
22292 |
|
22293 | /**
|
22294 | * @attribute value
|
22295 | * @type {Number}
|
22296 | * @description
|
22297 | * [en]Current progress. Should be a value between 0 and 100.[/en]
|
22298 | * [ja]現在の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
|
22299 | */
|
22300 |
|
22301 | /**
|
22302 | * @attribute secondary-value
|
22303 | * @type {Number}
|
22304 | * @description
|
22305 | * [en]Current secondary progress. Should be a value between 0 and 100.[/en]
|
22306 | * [ja]現在の2番目の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
|
22307 | */
|
22308 |
|
22309 | /**
|
22310 | * @attribute indeterminate
|
22311 | * @description
|
22312 | * [en]If this attribute is set, an infinite looping animation will be shown.[/en]
|
22313 | * [ja]この属性が設定された場合、ループするアニメーションが表示されます。[/ja]
|
22314 | */
|
22315 | function ProgressBarElement() {
|
22316 | var _this;
|
22317 |
|
22318 | _classCallCheck(this, ProgressBarElement);
|
22319 |
|
22320 | _this = _super.call(this);
|
22321 | contentReady(_assertThisInitialized(_this), function () {
|
22322 | return _this._compile();
|
22323 | });
|
22324 | return _this;
|
22325 | }
|
22326 |
|
22327 | _createClass(ProgressBarElement, [{
|
22328 | key: "_compile",
|
22329 | value: function _compile() {
|
22330 | if (!this._isCompiled()) {
|
22331 | this._template = template$1.cloneNode(true);
|
22332 | } else {
|
22333 | this._template = util$4.findChild(this, '.progress-bar');
|
22334 | }
|
22335 |
|
22336 | this._primary = util$4.findChild(this._template, '.progress-bar__primary');
|
22337 | this._secondary = util$4.findChild(this._template, '.progress-bar__secondary');
|
22338 |
|
22339 | this._updateDeterminate();
|
22340 |
|
22341 | this._updateValue();
|
22342 |
|
22343 | this.appendChild(this._template);
|
22344 | autoStyle.prepare(this);
|
22345 | ModifierUtil.initModifier(this, scheme$a);
|
22346 | }
|
22347 | }, {
|
22348 | key: "_isCompiled",
|
22349 | value: function _isCompiled() {
|
22350 | if (!util$4.findChild(this, '.progress-bar')) {
|
22351 | return false;
|
22352 | }
|
22353 |
|
22354 | var barElement = util$4.findChild(this, '.progress-bar');
|
22355 |
|
22356 | if (!util$4.findChild(barElement, '.progress-bar__secondary')) {
|
22357 | return false;
|
22358 | }
|
22359 |
|
22360 | if (!util$4.findChild(barElement, '.progress-bar__primary')) {
|
22361 | return false;
|
22362 | }
|
22363 |
|
22364 | return true;
|
22365 | }
|
22366 | }, {
|
22367 | key: "attributeChangedCallback",
|
22368 | value: function attributeChangedCallback(name, last, current) {
|
22369 | if (name === 'modifier') {
|
22370 | ModifierUtil.onModifierChanged(last, current, this, scheme$a);
|
22371 | this.hasAttribute(INDET$1) && this._updateDeterminate();
|
22372 | } else if (name === 'value' || name === 'secondary-value') {
|
22373 | this._updateValue();
|
22374 | } else if (name === INDET$1) {
|
22375 | this._updateDeterminate();
|
22376 | }
|
22377 | }
|
22378 | }, {
|
22379 | key: "_updateDeterminate",
|
22380 | value: function _updateDeterminate() {
|
22381 | var _this2 = this;
|
22382 |
|
22383 | contentReady(this, function () {
|
22384 | return util$4.toggleModifier(_this2, INDET$1, {
|
22385 | force: _this2.hasAttribute(INDET$1)
|
22386 | });
|
22387 | });
|
22388 | }
|
22389 | }, {
|
22390 | key: "_updateValue",
|
22391 | value: function _updateValue() {
|
22392 | var _this3 = this;
|
22393 |
|
22394 | contentReady(this, function () {
|
22395 | _this3._primary.style.width = _this3.hasAttribute('value') ? _this3.getAttribute('value') + '%' : '0%';
|
22396 | _this3._secondary.style.width = _this3.hasAttribute('secondary-value') ? _this3.getAttribute('secondary-value') + '%' : '0%';
|
22397 | });
|
22398 | }
|
22399 | /**
|
22400 | * @property value
|
22401 | * @type {Number}
|
22402 | * @description
|
22403 | * [en]Current progress. Should be a value between 0 and 100.[/en]
|
22404 | * [ja]現在の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
|
22405 | */
|
22406 |
|
22407 | }, {
|
22408 | key: "value",
|
22409 | get: function get() {
|
22410 | return parseInt(this.getAttribute('value') || '0');
|
22411 | }
|
22412 | /**
|
22413 | * @property secondaryValue
|
22414 | * @type {Number}
|
22415 | * @description
|
22416 | * [en]Current secondary progress. Should be a value between 0 and 100.[/en]
|
22417 | * [ja]現在の2番目の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
|
22418 | */
|
22419 | ,
|
22420 | set: function set(value) {
|
22421 | if (typeof value !== 'number' || value < 0 || value > 100) {
|
22422 | util$4.throw('Invalid value');
|
22423 | }
|
22424 |
|
22425 | this.setAttribute('value', Math.floor(value));
|
22426 | }
|
22427 | }, {
|
22428 | key: "secondaryValue",
|
22429 | get: function get() {
|
22430 | return parseInt(this.getAttribute('secondary-value') || '0');
|
22431 | }
|
22432 | /**
|
22433 | * @property indeterminate
|
22434 | * @type {Boolean}
|
22435 | * @description
|
22436 | * [en]If this property is `true`, an infinite looping animation will be shown.[/en]
|
22437 | * [ja]この属性が設定された場合、ループするアニメーションが表示されます。[/ja]
|
22438 | */
|
22439 | ,
|
22440 | set: function set(value) {
|
22441 | if (typeof value !== 'number' || value < 0 || value > 100) {
|
22442 | util$4.throw('Invalid value');
|
22443 | }
|
22444 |
|
22445 | this.setAttribute('secondary-value', Math.floor(value));
|
22446 | }
|
22447 | }, {
|
22448 | key: "indeterminate",
|
22449 | get: function get() {
|
22450 | return this.hasAttribute(INDET$1);
|
22451 | },
|
22452 | set: function set(value) {
|
22453 | if (value) {
|
22454 | this.setAttribute(INDET$1, '');
|
22455 | } else {
|
22456 | this.removeAttribute(INDET$1);
|
22457 | }
|
22458 | }
|
22459 | }], [{
|
22460 | key: "observedAttributes",
|
22461 | get: function get() {
|
22462 | return ['modifier', 'value', 'secondary-value', INDET$1];
|
22463 | }
|
22464 | }]);
|
22465 |
|
22466 | return ProgressBarElement;
|
22467 | }(BaseElement);
|
22468 | onsElements.ProgressBar = ProgressBarElement;
|
22469 | customElements.define('ons-progress-bar', ProgressBarElement);
|
22470 |
|
22471 | var scheme$9 = {
|
22472 | '.progress-circular': 'progress-circular--*',
|
22473 | '.progress-circular__background': 'progress-circular--*__background',
|
22474 | '.progress-circular__primary': 'progress-circular--*__primary',
|
22475 | '.progress-circular__secondary': 'progress-circular--*__secondary'
|
22476 | };
|
22477 | var template = util$4.createElement("\n <svg class=\"progress-circular\">\n <circle class=\"progress-circular__background\" />\n <circle class=\"progress-circular__secondary\" cx=\"50%\" cy=\"50%\" r=\"40%\" />\n <circle class=\"progress-circular__primary\" cx=\"50%\" cy=\"50%\" r=\"40%\" />\n </svg>\n");
|
22478 | var INDET = 'indeterminate';
|
22479 | /**
|
22480 | * @element ons-progress-circular
|
22481 | * @category visual
|
22482 | * @description
|
22483 | * [en]
|
22484 | * This component displays a circular progress indicator. It can either be used to show how much of a task has been completed or to show a looping animation to indicate that an operation is currently running.
|
22485 | * [/en]
|
22486 | * [ja][/ja]
|
22487 | * @codepen EVzMjR
|
22488 | * @tutorial vanilla/Reference/progress-circular
|
22489 | * @seealso ons-progress-bar
|
22490 | * [en]The `<ons-progress-bar>` component displays a bar progress indicator.[/en]
|
22491 | * [ja][/ja]
|
22492 | * @example
|
22493 | * <ons-progress-circular
|
22494 | * value="55"
|
22495 | * secondary-value="87">
|
22496 | * </ons-progress-circular>
|
22497 | *
|
22498 | * <ons-progress-circular
|
22499 | * indeterminate>
|
22500 | * </ons-progress-circular>
|
22501 | */
|
22502 |
|
22503 | var ProgressCircularElement = /*#__PURE__*/function (_BaseElement) {
|
22504 | _inherits(ProgressCircularElement, _BaseElement);
|
22505 |
|
22506 | var _super = _createSuper(ProgressCircularElement);
|
22507 |
|
22508 | /**
|
22509 | * @attribute modifier
|
22510 | * @type {String}
|
22511 | * @description
|
22512 | * [en]Change the appearance of the progress indicator.[/en]
|
22513 | * [ja]プログレスインジケータの見た目を変更します。[/ja]
|
22514 | */
|
22515 |
|
22516 | /**
|
22517 | * @attribute value
|
22518 | * @type {Number}
|
22519 | * @description
|
22520 | * [en]Current progress. Should be a value between 0 and 100.[/en]
|
22521 | * [ja]現在の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
|
22522 | */
|
22523 |
|
22524 | /**
|
22525 | * @attribute secondary-value
|
22526 | * @type {Number}
|
22527 | * @description
|
22528 | * [en]Current secondary progress. Should be a value between 0 and 100.[/en]
|
22529 | * [ja]現在の2番目の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
|
22530 | */
|
22531 |
|
22532 | /**
|
22533 | * @attribute indeterminate
|
22534 | * @description
|
22535 | * [en]If this attribute is set, an infinite looping animation will be shown.[/en]
|
22536 | * [ja]この属性が設定された場合、ループするアニメーションが表示されます。[/ja]
|
22537 | */
|
22538 | function ProgressCircularElement() {
|
22539 | var _this;
|
22540 |
|
22541 | _classCallCheck(this, ProgressCircularElement);
|
22542 |
|
22543 | _this = _super.call(this);
|
22544 | contentReady(_assertThisInitialized(_this), function () {
|
22545 | return _this._compile();
|
22546 | });
|
22547 | return _this;
|
22548 | }
|
22549 |
|
22550 | _createClass(ProgressCircularElement, [{
|
22551 | key: "attributeChangedCallback",
|
22552 | value: function attributeChangedCallback(name, last, current) {
|
22553 | if (name === 'modifier') {
|
22554 | ModifierUtil.onModifierChanged(last, current, this, scheme$9);
|
22555 | this.hasAttribute(INDET) && this._updateDeterminate();
|
22556 | } else if (name === 'value' || name === 'secondary-value') {
|
22557 | this._updateValue();
|
22558 | } else if (name === INDET) {
|
22559 | this._updateDeterminate();
|
22560 | }
|
22561 | }
|
22562 | }, {
|
22563 | key: "_updateDeterminate",
|
22564 | value: function _updateDeterminate() {
|
22565 | var _this2 = this;
|
22566 |
|
22567 | contentReady(this, function () {
|
22568 | return util$4.toggleModifier(_this2, INDET, {
|
22569 | force: _this2.hasAttribute(INDET)
|
22570 | });
|
22571 | });
|
22572 | }
|
22573 | }, {
|
22574 | key: "_updateValue",
|
22575 | value: function _updateValue() {
|
22576 | var _this3 = this;
|
22577 |
|
22578 | if (this.hasAttribute('value')) {
|
22579 | contentReady(this, function () {
|
22580 | var per = Math.ceil(_this3.getAttribute('value') * 251.32 * 0.01);
|
22581 | _this3._primary.style['stroke-dasharray'] = per + '%, 251.32%';
|
22582 | });
|
22583 | }
|
22584 |
|
22585 | if (this.hasAttribute('secondary-value')) {
|
22586 | contentReady(this, function () {
|
22587 | var per = Math.ceil(_this3.getAttribute('secondary-value') * 251.32 * 0.01);
|
22588 | _this3._secondary.style.display = null;
|
22589 | _this3._secondary.style['stroke-dasharray'] = per + '%, 251.32%';
|
22590 | });
|
22591 | } else {
|
22592 | contentReady(this, function () {
|
22593 | _this3._secondary.style.display = 'none';
|
22594 | });
|
22595 | }
|
22596 | }
|
22597 | /**
|
22598 | * @property value
|
22599 | * @type {Number}
|
22600 | * @description
|
22601 | * [en]Current progress. Should be a value between 0 and 100.[/en]
|
22602 | * [ja]現在の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
|
22603 | */
|
22604 |
|
22605 | }, {
|
22606 | key: "value",
|
22607 | get: function get() {
|
22608 | return parseInt(this.getAttribute('value') || '0');
|
22609 | }
|
22610 | /**
|
22611 | * @property secondaryValue
|
22612 | * @type {Number}
|
22613 | * @description
|
22614 | * [en]Current secondary progress. Should be a value between 0 and 100.[/en]
|
22615 | * [ja]現在の2番目の進行状況の値を指定します。0から100の間の値を指定して下さい。[/ja]
|
22616 | */
|
22617 | ,
|
22618 | set: function set(value) {
|
22619 | if (typeof value !== 'number' || value < 0 || value > 100) {
|
22620 | util$4.throw('Invalid value');
|
22621 | }
|
22622 |
|
22623 | this.setAttribute('value', Math.floor(value));
|
22624 | }
|
22625 | }, {
|
22626 | key: "secondaryValue",
|
22627 | get: function get() {
|
22628 | return parseInt(this.getAttribute('secondary-value') || '0');
|
22629 | }
|
22630 | /**
|
22631 | * @property indeterminate
|
22632 | * @type {Boolean}
|
22633 | * @description
|
22634 | * [en]If this property is `true`, an infinite looping animation will be shown.[/en]
|
22635 | * [ja]この属性が設定された場合、ループするアニメーションが表示されます。[/ja]
|
22636 | */
|
22637 | ,
|
22638 | set: function set(value) {
|
22639 | if (typeof value !== 'number' || value < 0 || value > 100) {
|
22640 | util$4.throw('Invalid value');
|
22641 | }
|
22642 |
|
22643 | this.setAttribute('secondary-value', Math.floor(value));
|
22644 | }
|
22645 | }, {
|
22646 | key: "indeterminate",
|
22647 | get: function get() {
|
22648 | return this.hasAttribute(INDET);
|
22649 | },
|
22650 | set: function set(value) {
|
22651 | if (value) {
|
22652 | this.setAttribute(INDET, '');
|
22653 | } else {
|
22654 | this.removeAttribute(INDET);
|
22655 | }
|
22656 | }
|
22657 | }, {
|
22658 | key: "_compile",
|
22659 | value: function _compile() {
|
22660 | if (this._isCompiled()) {
|
22661 | this._template = util$4.findChild(this, '.progress-circular');
|
22662 | } else {
|
22663 | this._template = template.cloneNode(true);
|
22664 | }
|
22665 |
|
22666 | this._primary = util$4.findChild(this._template, '.progress-circular__primary');
|
22667 | this._secondary = util$4.findChild(this._template, '.progress-circular__secondary');
|
22668 |
|
22669 | this._updateDeterminate();
|
22670 |
|
22671 | this._updateValue();
|
22672 |
|
22673 | this.appendChild(this._template);
|
22674 | autoStyle.prepare(this);
|
22675 | ModifierUtil.initModifier(this, scheme$9);
|
22676 | }
|
22677 | }, {
|
22678 | key: "_isCompiled",
|
22679 | value: function _isCompiled() {
|
22680 | if (!util$4.findChild(this, '.progress-circular')) {
|
22681 | return false;
|
22682 | }
|
22683 |
|
22684 | var svg = util$4.findChild(this, '.progress-circular');
|
22685 |
|
22686 | if (!util$4.findChild(svg, '.progress-circular__secondary')) {
|
22687 | return false;
|
22688 | }
|
22689 |
|
22690 | if (!util$4.findChild(svg, '.progress-circular__primary')) {
|
22691 | return false;
|
22692 | }
|
22693 |
|
22694 | return true;
|
22695 | }
|
22696 | }], [{
|
22697 | key: "observedAttributes",
|
22698 | get: function get() {
|
22699 | return ['modifier', 'value', 'secondary-value', INDET];
|
22700 | }
|
22701 | }]);
|
22702 |
|
22703 | return ProgressCircularElement;
|
22704 | }(BaseElement);
|
22705 | onsElements.ProgressCircular = ProgressCircularElement;
|
22706 | customElements.define('ons-progress-circular', ProgressCircularElement);
|
22707 |
|
22708 | var STATE_INITIAL = 'initial';
|
22709 | var STATE_PREACTION = 'preaction';
|
22710 | var STATE_ACTION = 'action';
|
22711 |
|
22712 | var throwType = function throwType(el, type) {
|
22713 | return util$4.throw("\"".concat(el, "\" must be ").concat(type));
|
22714 | };
|
22715 | /**
|
22716 | * @element ons-pull-hook
|
22717 | * @category control
|
22718 | * @description
|
22719 | * [en]
|
22720 | * Component that adds **Pull to refresh** functionality to an `<ons-page>` element.
|
22721 | *
|
22722 | * It can be used to perform a task when the user pulls down at the top of the page. A common usage is to refresh the data displayed in a page.
|
22723 | * [/en]
|
22724 | * [ja][/ja]
|
22725 | * @codepen WbJogM
|
22726 | * @tutorial vanilla/Reference/pull-hook
|
22727 | * @example
|
22728 | * <ons-page>
|
22729 | * <ons-pull-hook>
|
22730 | * Release to refresh
|
22731 | * </ons-pull-hook>
|
22732 | * </ons-page>
|
22733 | *
|
22734 | * <script>
|
22735 | * document.querySelector('ons-pull-hook').onAction = function(done) {
|
22736 | * setTimeout(done, 1000);
|
22737 | * };
|
22738 | * </script>
|
22739 | */
|
22740 |
|
22741 |
|
22742 | var PullHookElement = /*#__PURE__*/function (_BaseElement) {
|
22743 | _inherits(PullHookElement, _BaseElement);
|
22744 |
|
22745 | var _super = _createSuper(PullHookElement);
|
22746 |
|
22747 | /**
|
22748 | * @event changestate
|
22749 | * @description
|
22750 | * [en]Fired when the state is changed. The state can be either "initial", "preaction" or "action".[/en]
|
22751 | * [ja]コンポーネントの状態が変わった場合に発火します。状態は、"initial", "preaction", "action"のいずれかです。[/ja]
|
22752 | * @param {Object} event
|
22753 | * [en]Event object.[/en]
|
22754 | * [ja]イベントオブジェクト。[/ja]
|
22755 | * @param {Object} event.pullHook
|
22756 | * [en]Component object.[/en]
|
22757 | * [ja]コンポーネントのオブジェクト。[/ja]
|
22758 | * @param {String} event.state
|
22759 | * [en]Current state.[/en]
|
22760 | * [ja]現在の状態名を参照できます。[/ja]
|
22761 | */
|
22762 |
|
22763 | /**
|
22764 | * @event pull
|
22765 | * @description
|
22766 | * [en]Fired when the pull hook is pulled.[/en]
|
22767 | * [ja][/ja]
|
22768 | * @param {Object} event
|
22769 | * [en]Event object.[/en]
|
22770 | * [ja]イベントオブジェクト。[/ja]
|
22771 | * @param {Object} event.ratio
|
22772 | * [en]The pulled distance ratio (scroll / height).[/en]
|
22773 | * [ja][/ja]
|
22774 | * @param {String} event.animationOptions
|
22775 | * [en]The animation options object.[/en]
|
22776 | * [ja][/ja]
|
22777 | */
|
22778 |
|
22779 | /**
|
22780 | * @attribute disabled
|
22781 | * @description
|
22782 | * [en]If this attribute is set the "pull-to-refresh" functionality is disabled.[/en]
|
22783 | * [ja]この属性がある時、disabled状態になりアクションが実行されなくなります[/ja]
|
22784 | */
|
22785 |
|
22786 | /**
|
22787 | * @attribute height
|
22788 | * @type {String}
|
22789 | * @description
|
22790 | * [en]Specify the height of the component. When pulled down further than this value it will switch to the "preaction" state. The default value is "64px".[/en]
|
22791 | * [ja]コンポーネントの高さを指定します。この高さ以上にpull downすると"preaction"状態に移行します。デフォルトの値は"64px"です。[/ja]
|
22792 | */
|
22793 |
|
22794 | /**
|
22795 | * @attribute threshold-height
|
22796 | * @type {String}
|
22797 | * @description
|
22798 | * [en]Specify the threshold height. The component automatically switches to the "action" state when pulled further than this value. The default value is "96px". A negative value will disable this property. If this value is lower than the height, it will skip "preaction" state.[/en]
|
22799 | * [ja]閾値となる高さを指定します。この値で指定した高さよりもpull downすると、このコンポーネントは自動的に"action"状態に移行します。[/ja]
|
22800 | */
|
22801 |
|
22802 | /**
|
22803 | * @attribute fixed-content
|
22804 | * @description
|
22805 | * [en]If this attribute is set the content of the page will not move when pulling.[/en]
|
22806 | * [ja]この属性がある時、プルフックが引き出されている時にもコンテンツは動きません。[/ja]
|
22807 | */
|
22808 |
|
22809 | /**
|
22810 | * @property fixedContent
|
22811 | * @type {Boolean}
|
22812 | * @description
|
22813 | * [en]If this property is set the content of the page will not move when pulling.[/en]
|
22814 | * [ja]この属性がある時、プルフックが引き出されている時にもコンテンツは動きません。[/ja]
|
22815 | */
|
22816 | function PullHookElement() {
|
22817 | var _this;
|
22818 |
|
22819 | _classCallCheck(this, PullHookElement);
|
22820 |
|
22821 | _this = _super.call(this);
|
22822 | _this._onDrag = _this._onDrag.bind(_assertThisInitialized(_this));
|
22823 | _this._onDragStart = _this._onDragStart.bind(_assertThisInitialized(_this));
|
22824 | _this._onDragEnd = _this._onDragEnd.bind(_assertThisInitialized(_this));
|
22825 | _this._onScroll = _this._onScroll.bind(_assertThisInitialized(_this));
|
22826 |
|
22827 | _this._setState(STATE_INITIAL, true);
|
22828 |
|
22829 | _this._hide(); // Fix for transparent toolbar transitions
|
22830 |
|
22831 |
|
22832 | var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'pull'),
|
22833 | onConnected = _util$defineListenerP.onConnected,
|
22834 | onDisconnected = _util$defineListenerP.onDisconnected;
|
22835 |
|
22836 | _this._connectOnPull = onConnected;
|
22837 | _this._disconnectOnPull = onDisconnected;
|
22838 | return _this;
|
22839 | }
|
22840 |
|
22841 | _createClass(PullHookElement, [{
|
22842 | key: "_setStyle",
|
22843 | value: function _setStyle() {
|
22844 | var height = this.height + 'px';
|
22845 | styler(this, {
|
22846 | height: height,
|
22847 | lineHeight: height
|
22848 | });
|
22849 | this.style.display === '' && this._show();
|
22850 | }
|
22851 | }, {
|
22852 | key: "_onScroll",
|
22853 | value: function _onScroll(event) {
|
22854 | var element = this._pageElement;
|
22855 |
|
22856 | if (element.scrollTop < 0) {
|
22857 | element.scrollTop = 0;
|
22858 | }
|
22859 | }
|
22860 | }, {
|
22861 | key: "_canConsumeGesture",
|
22862 | value: function _canConsumeGesture(gesture) {
|
22863 | return gesture.direction === 'up' || gesture.direction === 'down';
|
22864 | }
|
22865 | }, {
|
22866 | key: "_onDragStart",
|
22867 | value: function _onDragStart(event) {
|
22868 | var _this2 = this;
|
22869 |
|
22870 | if (!event.gesture || this.disabled) {
|
22871 | return;
|
22872 | }
|
22873 |
|
22874 | var tapY = event.gesture.center.clientY + this._pageElement.scrollTop;
|
22875 | var maxY = window.innerHeight; // Only use drags that start near the pullHook to reduce flickerings
|
22876 |
|
22877 | var draggableAreaRatio = 1;
|
22878 | this._ignoreDrag = event.consumed || tapY > maxY * draggableAreaRatio;
|
22879 |
|
22880 | if (!this._ignoreDrag) {
|
22881 | var consume = event.consume;
|
22882 |
|
22883 | event.consume = function () {
|
22884 | consume && consume();
|
22885 | _this2._ignoreDrag = true; // This elements resizes .page__content so it is safer
|
22886 | // to hide it when other components are dragged.
|
22887 |
|
22888 | _this2._hide();
|
22889 | };
|
22890 |
|
22891 | if (this._canConsumeGesture(event.gesture)) {
|
22892 | consume && consume();
|
22893 | event.consumed = true;
|
22894 |
|
22895 | this._show(); // Not enough due to 'dragLockAxis'
|
22896 |
|
22897 | }
|
22898 | }
|
22899 |
|
22900 | this._startScroll = this._pageElement.scrollTop;
|
22901 | }
|
22902 | }, {
|
22903 | key: "_onDrag",
|
22904 | value: function _onDrag(event) {
|
22905 | var _this3 = this;
|
22906 |
|
22907 | if (!event.gesture || this.disabled || this._ignoreDrag || !this._canConsumeGesture(event.gesture)) {
|
22908 | return;
|
22909 | } // Necessary due to 'dragLockAxis' (25px)
|
22910 |
|
22911 |
|
22912 | if (this.style.display === 'none') {
|
22913 | this._show();
|
22914 | }
|
22915 |
|
22916 | event.stopPropagation();
|
22917 | event.gesture.center.clientY + this._pageElement.scrollTop;
|
22918 | var scroll = Math.max(event.gesture.deltaY - this._startScroll, 0);
|
22919 |
|
22920 | if (scroll !== this._currentTranslation) {
|
22921 | var th = this.thresholdHeight;
|
22922 |
|
22923 | if (th > 0 && scroll >= th) {
|
22924 | event.gesture.stopDetect();
|
22925 | setImmediate(function () {
|
22926 | return _this3._finish();
|
22927 | });
|
22928 | } else if (scroll >= this.height) {
|
22929 | this._setState(STATE_PREACTION);
|
22930 | } else {
|
22931 | this._setState(STATE_INITIAL);
|
22932 | }
|
22933 |
|
22934 | this._translateTo(scroll);
|
22935 | }
|
22936 | }
|
22937 | }, {
|
22938 | key: "_onDragEnd",
|
22939 | value: function _onDragEnd(event) {
|
22940 | if (!event.gesture || this.disabled || this._ignoreDrag) {
|
22941 | return;
|
22942 | }
|
22943 |
|
22944 | event.stopPropagation();
|
22945 |
|
22946 | if (this._currentTranslation > 0) {
|
22947 | var scroll = this._currentTranslation;
|
22948 |
|
22949 | if (scroll > this.height) {
|
22950 | this._finish();
|
22951 | } else {
|
22952 | this._translateTo(0, {
|
22953 | animate: true
|
22954 | });
|
22955 | }
|
22956 | }
|
22957 | }
|
22958 | /**
|
22959 | * @property onAction
|
22960 | * @type {Function}
|
22961 | * @description
|
22962 | * [en]This will be called in the `action` state if it exists. The function will be given a `done` callback as its first argument.[/en]
|
22963 | * [ja][/ja]
|
22964 | */
|
22965 |
|
22966 | }, {
|
22967 | key: "onAction",
|
22968 | get: function get() {
|
22969 | return this._onAction;
|
22970 | },
|
22971 | set: function set(value) {
|
22972 | if (value && !(value instanceof Function)) {
|
22973 | throwType('onAction', 'function or null');
|
22974 | }
|
22975 |
|
22976 | this._onAction = value;
|
22977 | }
|
22978 | /**
|
22979 | * @property onPull
|
22980 | * @type {Function}
|
22981 | * @description
|
22982 | * [en]Hook called whenever the user pulls the element. It gets the pulled distance ratio (scroll / height) and an animationOptions object as arguments.[/en]
|
22983 | * [ja][/ja]
|
22984 | */
|
22985 |
|
22986 | }, {
|
22987 | key: "_finish",
|
22988 | value: function _finish() {
|
22989 | var _this4 = this;
|
22990 |
|
22991 | this._setState(STATE_ACTION);
|
22992 |
|
22993 | this._translateTo(this.height, {
|
22994 | animate: true
|
22995 | });
|
22996 |
|
22997 | var action = this.onAction || function (done) {
|
22998 | return done();
|
22999 | };
|
23000 |
|
23001 | action(function () {
|
23002 | _this4._translateTo(0, {
|
23003 | animate: true
|
23004 | });
|
23005 |
|
23006 | _this4._setState(STATE_INITIAL);
|
23007 | });
|
23008 | }
|
23009 | /**
|
23010 | * @property height
|
23011 | * @type {Number}
|
23012 | * @description
|
23013 | * [en]The height of the pull hook in pixels. The default value is `64px`.[/en]
|
23014 | * [ja][/ja]
|
23015 | */
|
23016 |
|
23017 | }, {
|
23018 | key: "height",
|
23019 | get: function get() {
|
23020 | return parseInt(this.getAttribute('height') || '64', 10);
|
23021 | }
|
23022 | /**
|
23023 | * @property thresholdHeight
|
23024 | * @type {Number}
|
23025 | * @description
|
23026 | * [en]The thresholdHeight of the pull hook in pixels. The default value is `96px`.[/en]
|
23027 | * [ja][/ja]
|
23028 | */
|
23029 | ,
|
23030 | set: function set(value) {
|
23031 | if (!util$4.isInteger(value)) {
|
23032 | throwType('height', 'integer');
|
23033 | }
|
23034 |
|
23035 | this.setAttribute('height', "".concat(value, "px"));
|
23036 | }
|
23037 | }, {
|
23038 | key: "thresholdHeight",
|
23039 | get: function get() {
|
23040 | return parseInt(this.getAttribute('threshold-height') || '96', 10);
|
23041 | },
|
23042 | set: function set(value) {
|
23043 | if (!util$4.isInteger(value)) {
|
23044 | throwType('thresholdHeight', 'integer');
|
23045 | }
|
23046 |
|
23047 | this.setAttribute('threshold-height', "".concat(value, "px"));
|
23048 | }
|
23049 | }, {
|
23050 | key: "_setState",
|
23051 | value: function _setState(state, noEvent) {
|
23052 | var lastState = this.state;
|
23053 | this.setAttribute('state', state);
|
23054 |
|
23055 | if (!noEvent && lastState !== this.state) {
|
23056 | util$4.triggerElementEvent(this, 'changestate', {
|
23057 | pullHook: this,
|
23058 | state: state,
|
23059 | lastState: lastState
|
23060 | });
|
23061 | }
|
23062 | }
|
23063 | /**
|
23064 | * @property state
|
23065 | * @readonly
|
23066 | * @type {String}
|
23067 | * @description
|
23068 | * [en]Current state of the element.[/en]
|
23069 | * [ja][/ja]
|
23070 | */
|
23071 |
|
23072 | }, {
|
23073 | key: "state",
|
23074 | get: function get() {
|
23075 | return this.getAttribute('state');
|
23076 | }
|
23077 | /**
|
23078 | * @property pullDistance
|
23079 | * @readonly
|
23080 | * @type {Number}
|
23081 | * @description
|
23082 | * [en]The current number of pixels the pull hook has moved.[/en]
|
23083 | * [ja]現在のプルフックが引き出された距離をピクセル数。[/ja]
|
23084 | */
|
23085 |
|
23086 | }, {
|
23087 | key: "pullDistance",
|
23088 | get: function get() {
|
23089 | return this._currentTranslation;
|
23090 | }
|
23091 | /**
|
23092 | * @property disabled
|
23093 | * @type {Boolean}
|
23094 | * @description
|
23095 | * [en]Whether the element is disabled or not.[/en]
|
23096 | * [ja]無効化されている場合に`true`。[/ja]
|
23097 | */
|
23098 |
|
23099 | }, {
|
23100 | key: "_show",
|
23101 | value: function _show() {
|
23102 | var _this5 = this;
|
23103 |
|
23104 | // Run asyncrhonously to avoid conflicts with Animit's style clean
|
23105 | setImmediate(function () {
|
23106 | _this5.style.display = '';
|
23107 |
|
23108 | if (_this5._pageElement) {
|
23109 | _this5._pageElement.style.marginTop = "-".concat(_this5.height, "px");
|
23110 | }
|
23111 | });
|
23112 | }
|
23113 | }, {
|
23114 | key: "_hide",
|
23115 | value: function _hide() {
|
23116 | this.style.display = 'none';
|
23117 |
|
23118 | if (this._pageElement) {
|
23119 | this._pageElement.style.marginTop = '';
|
23120 | }
|
23121 | }
|
23122 | /**
|
23123 | * @param {Number} scroll
|
23124 | * @param {Object} options
|
23125 | * @param {Function} [options.callback]
|
23126 | */
|
23127 |
|
23128 | }, {
|
23129 | key: "_translateTo",
|
23130 | value: function _translateTo(scroll) {
|
23131 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
23132 |
|
23133 | if (this._currentTranslation == 0 && scroll == 0) {
|
23134 | return;
|
23135 | }
|
23136 |
|
23137 | this._currentTranslation = scroll;
|
23138 | var opt = options.animate ? {
|
23139 | duration: .3,
|
23140 | timing: 'cubic-bezier(.1, .7, .1, 1)'
|
23141 | } : {};
|
23142 | util$4.triggerElementEvent(this, 'pull', {
|
23143 | ratio: (scroll / this.height).toFixed(2),
|
23144 | animationOptions: opt
|
23145 | });
|
23146 | var scrollElement = this.hasAttribute('fixed-content') ? this : this._pageElement;
|
23147 | Animit(scrollElement).queue({
|
23148 | transform: "translate3d(0px, ".concat(scroll, "px, 0px)")
|
23149 | }, opt).play(function () {
|
23150 | scroll === 0 && styler.clear(scrollElement, 'transition transform');
|
23151 | options.callback instanceof Function && options.callback();
|
23152 | });
|
23153 | }
|
23154 | }, {
|
23155 | key: "_disableDragLock",
|
23156 | value: function _disableDragLock() {
|
23157 | // e2e tests need it
|
23158 | this._dragLockDisabled = true;
|
23159 |
|
23160 | this._setupListeners(true);
|
23161 | }
|
23162 | }, {
|
23163 | key: "_setupListeners",
|
23164 | value: function _setupListeners(add) {
|
23165 | var _this6 = this;
|
23166 |
|
23167 | var scrollToggle = function scrollToggle(action) {
|
23168 | return _this6._pageElement["".concat(action, "EventListener")]('scroll', _this6._onScroll, false);
|
23169 | };
|
23170 |
|
23171 | var gdToggle = function gdToggle(action) {
|
23172 | var passive = {
|
23173 | passive: true
|
23174 | };
|
23175 |
|
23176 | _this6._gestureDetector[action]('drag', _this6._onDrag, passive);
|
23177 |
|
23178 | _this6._gestureDetector[action]('dragstart', _this6._onDragStart, passive);
|
23179 |
|
23180 | _this6._gestureDetector[action]('dragend', _this6._onDragEnd, passive);
|
23181 | };
|
23182 |
|
23183 | if (this._gestureDetector) {
|
23184 | gdToggle('off');
|
23185 |
|
23186 | this._gestureDetector.dispose();
|
23187 |
|
23188 | this._gestureDetector = null;
|
23189 | }
|
23190 |
|
23191 | scrollToggle('remove');
|
23192 |
|
23193 | if (add) {
|
23194 | this._gestureDetector = new GestureDetector(this._pageElement, {
|
23195 | dragMinDistance: 1,
|
23196 | dragDistanceCorrection: false,
|
23197 | dragLockToAxis: !this._dragLockDisabled,
|
23198 | passive: true
|
23199 | });
|
23200 | gdToggle('on');
|
23201 | scrollToggle('add');
|
23202 | }
|
23203 | }
|
23204 | }, {
|
23205 | key: "connectedCallback",
|
23206 | value: function connectedCallback() {
|
23207 | this._currentTranslation = 0;
|
23208 | this._pageElement = this.parentNode;
|
23209 |
|
23210 | this._setupListeners(true);
|
23211 |
|
23212 | this._setStyle();
|
23213 |
|
23214 | this._connectOnPull();
|
23215 | }
|
23216 | }, {
|
23217 | key: "disconnectedCallback",
|
23218 | value: function disconnectedCallback() {
|
23219 | this._hide();
|
23220 |
|
23221 | this._setupListeners(false);
|
23222 |
|
23223 | this._disconnectOnPull();
|
23224 | }
|
23225 | }, {
|
23226 | key: "attributeChangedCallback",
|
23227 | value: function attributeChangedCallback(name, last, current) {
|
23228 | if (name === 'height' && this._pageElement) {
|
23229 | this._setStyle();
|
23230 | }
|
23231 | }
|
23232 | }], [{
|
23233 | key: "observedAttributes",
|
23234 | get: function get() {
|
23235 | return ['height'];
|
23236 | }
|
23237 | }, {
|
23238 | key: "events",
|
23239 | get: function get() {
|
23240 | return ['changestate', 'pull'];
|
23241 | }
|
23242 | }]);
|
23243 |
|
23244 | return PullHookElement;
|
23245 | }(BaseElement);
|
23246 | util$4.defineBooleanProperties(PullHookElement, ['disabled', 'fixed-content']);
|
23247 | onsElements.PullHook = PullHookElement;
|
23248 | customElements.define('ons-pull-hook', PullHookElement);
|
23249 |
|
23250 | var scheme$8 = {
|
23251 | '': 'range--*',
|
23252 | '.range__input': 'range--*__input',
|
23253 | '.range__focus-ring': 'range--*__focus-ring'
|
23254 | };
|
23255 | var activeClassToken = 'range__input--active';
|
23256 | /**
|
23257 | * @element ons-range
|
23258 | * @category form
|
23259 | * @modifier material
|
23260 | * [en]Material Design slider[/en]
|
23261 | * [ja][/ja]
|
23262 | * @description
|
23263 | * [en]
|
23264 | * Range input component. Used to display a draggable slider.
|
23265 | *
|
23266 | * Works very similar to the `<input type="range">` element.
|
23267 | * [/en]
|
23268 | * [ja][/ja]
|
23269 | * @codepen xZQomM
|
23270 | * @tutorial vanilla/Reference/range
|
23271 | * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
|
23272 | * @seealso ons-input
|
23273 | * [en]The `<ons-input>` component is used to display text inputs, radio buttons and checkboxes.[/en]
|
23274 | * [ja][/ja]
|
23275 | * @example
|
23276 | * <ons-range value="20"></ons-range>
|
23277 | * <ons-range modifier="material" value="10"></range>
|
23278 | */
|
23279 |
|
23280 | var RangeElement = /*#__PURE__*/function (_BaseInputElement) {
|
23281 | _inherits(RangeElement, _BaseInputElement);
|
23282 |
|
23283 | var _super = _createSuper(RangeElement);
|
23284 |
|
23285 | function RangeElement() {
|
23286 | var _this;
|
23287 |
|
23288 | _classCallCheck(this, RangeElement);
|
23289 |
|
23290 | _this = _super.call(this);
|
23291 | _this._onMouseDown = _this._onMouseDown.bind(_assertThisInitialized(_this));
|
23292 | _this._onMouseUp = _this._onMouseUp.bind(_assertThisInitialized(_this));
|
23293 | _this._onTouchStart = _this._onTouchStart.bind(_assertThisInitialized(_this));
|
23294 | _this._onTouchEnd = _this._onTouchEnd.bind(_assertThisInitialized(_this));
|
23295 | _this._onInput = _this._update.bind(_assertThisInitialized(_this));
|
23296 | _this._onDragstart = _this._onDragstart.bind(_assertThisInitialized(_this));
|
23297 | _this._onDragend = _this._onDragend.bind(_assertThisInitialized(_this));
|
23298 | return _this;
|
23299 | }
|
23300 |
|
23301 | _createClass(RangeElement, [{
|
23302 | key: "_compile",
|
23303 | value: function _compile() {
|
23304 | _get(_getPrototypeOf(RangeElement.prototype), "_compile", this).call(this);
|
23305 |
|
23306 | this._updateDisabled(this.hasAttribute('disabled'));
|
23307 | }
|
23308 | /* Inherited props */
|
23309 |
|
23310 | }, {
|
23311 | key: "_update",
|
23312 | value: function _update() {
|
23313 | var input = this._input;
|
23314 | var focusRing = this._focusRing;
|
23315 | input.style.backgroundSize = "".concat(100 * this._ratio, "% 2px");
|
23316 | focusRing.value = this.value; // NOTE: "_zero" attribute is used for CSS styling.
|
23317 |
|
23318 | if (input.min === '' && input.value === '0' || input.min === input.value) {
|
23319 | input.setAttribute('_zero', '');
|
23320 | } else {
|
23321 | input.removeAttribute('_zero');
|
23322 | }
|
23323 |
|
23324 | ['min', 'max'].forEach(function (attr) {
|
23325 | return focusRing[attr] = input[attr];
|
23326 | });
|
23327 | }
|
23328 | }, {
|
23329 | key: "_scheme",
|
23330 | get: function get() {
|
23331 | return scheme$8;
|
23332 | }
|
23333 | }, {
|
23334 | key: "_template",
|
23335 | get: function get() {
|
23336 | return "\n <input type=\"".concat(this.type, "\" class=\"").concat(this._defaultClassName, "__input\">\n <input type=\"range\" class=\"range__focus-ring\" tabIndex=\"-1\">\n ");
|
23337 | }
|
23338 | }, {
|
23339 | key: "_defaultClassName",
|
23340 | get: function get() {
|
23341 | return 'range';
|
23342 | }
|
23343 | }, {
|
23344 | key: "type",
|
23345 | get: function get() {
|
23346 | return 'range';
|
23347 | }
|
23348 | /* Own props */
|
23349 |
|
23350 | }, {
|
23351 | key: "_onMouseDown",
|
23352 | value: function _onMouseDown(e) {
|
23353 | var _this2 = this;
|
23354 |
|
23355 | this._input.classList.add(activeClassToken);
|
23356 |
|
23357 | setImmediate(function () {
|
23358 | return _this2._input.focus();
|
23359 | });
|
23360 | }
|
23361 | }, {
|
23362 | key: "_onTouchStart",
|
23363 | value: function _onTouchStart(e) {
|
23364 | this._onMouseDown();
|
23365 | }
|
23366 | }, {
|
23367 | key: "_onMouseUp",
|
23368 | value: function _onMouseUp(e) {
|
23369 | this._input.classList.remove(activeClassToken);
|
23370 | }
|
23371 | }, {
|
23372 | key: "_onTouchEnd",
|
23373 | value: function _onTouchEnd(e) {
|
23374 | this._onMouseUp(e);
|
23375 | }
|
23376 | }, {
|
23377 | key: "_onDragstart",
|
23378 | value: function _onDragstart(e) {
|
23379 | e.consumed = true;
|
23380 | e.gesture.stopPropagation();
|
23381 |
|
23382 | this._input.classList.add(activeClassToken);
|
23383 |
|
23384 | this.addEventListener('drag', this._onDrag);
|
23385 | }
|
23386 | }, {
|
23387 | key: "_onDrag",
|
23388 | value: function _onDrag(e) {
|
23389 | e.stopPropagation();
|
23390 | }
|
23391 | }, {
|
23392 | key: "_onDragend",
|
23393 | value: function _onDragend(e) {
|
23394 | this._input.classList.remove(activeClassToken);
|
23395 |
|
23396 | this.removeEventListener('drag', this._onDrag);
|
23397 | }
|
23398 | }, {
|
23399 | key: "_focusRing",
|
23400 | get: function get() {
|
23401 | return this.children[1];
|
23402 | }
|
23403 | }, {
|
23404 | key: "_ratio",
|
23405 | get: function get() {
|
23406 | // Returns the current ratio.
|
23407 | var min = this._input.min === '' ? 0 : parseInt(this._input.min);
|
23408 | var max = this._input.max === '' ? 100 : parseInt(this._input.max);
|
23409 | return (this.value - min) / (max - min);
|
23410 | }
|
23411 | }, {
|
23412 | key: "attributeChangedCallback",
|
23413 | value: function attributeChangedCallback(name, last, current) {
|
23414 | if (name === 'disabled') {
|
23415 | this._updateDisabled(current);
|
23416 | }
|
23417 |
|
23418 | _get(_getPrototypeOf(RangeElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
|
23419 | }
|
23420 | /**
|
23421 | * @param {boolean} disabled
|
23422 | */
|
23423 |
|
23424 | }, {
|
23425 | key: "_updateDisabled",
|
23426 | value: function _updateDisabled(disabled) {
|
23427 | if (disabled) {
|
23428 | this.classList.add('range--disabled');
|
23429 | } else {
|
23430 | this.classList.remove('range--disabled');
|
23431 | }
|
23432 | }
|
23433 | }, {
|
23434 | key: "connectedCallback",
|
23435 | value: function connectedCallback() {
|
23436 | this._setupListeners(true);
|
23437 | }
|
23438 | }, {
|
23439 | key: "disconnectedCallback",
|
23440 | value: function disconnectedCallback() {
|
23441 | this._setupListeners(false);
|
23442 | }
|
23443 | }, {
|
23444 | key: "_setupListeners",
|
23445 | value: function _setupListeners(add) {
|
23446 | var action = (add ? 'add' : 'remove') + 'EventListener';
|
23447 | util$4[action](this, 'touchstart', this._onTouchStart, {
|
23448 | passive: true
|
23449 | });
|
23450 | this[action]('mousedown', this._onMouseDown);
|
23451 | this[action]('mouseup', this._onMouseUp);
|
23452 | this[action]('touchend', this._onTouchEnd);
|
23453 | this[action]('dragstart', this._onDragstart);
|
23454 | this[action]('dragend', this._onDragend);
|
23455 | this[action]('input', this._onInput);
|
23456 | }
|
23457 | /**
|
23458 | * @attribute disabled
|
23459 | * @description
|
23460 | * [en]Whether the element is disabled or not.[/en]
|
23461 | * [ja]無効化されている場合に`true`。[/ja]
|
23462 | */
|
23463 |
|
23464 | /**
|
23465 | * @property disabled
|
23466 | * @type {Boolean}
|
23467 | * @description
|
23468 | * [en]Whether the element is disabled or not.[/en]
|
23469 | * [ja]無効化されている場合に`true`。[/ja]
|
23470 | */
|
23471 |
|
23472 | /**
|
23473 | * @property value
|
23474 | * @type {Number}
|
23475 | * @description
|
23476 | * [en]Current value.[/en]
|
23477 | * [ja][/ja]
|
23478 | */
|
23479 |
|
23480 | /**
|
23481 | * @method focus
|
23482 | * @signature focus()
|
23483 | * @description
|
23484 | * [en]Focuses the range.[/en]
|
23485 | * [ja][/ja]
|
23486 | */
|
23487 |
|
23488 | /**
|
23489 | * @method blur
|
23490 | * @signature blur()
|
23491 | * @description
|
23492 | * [en]Removes focus from the range.[/en]
|
23493 | * [ja][/ja]
|
23494 | */
|
23495 |
|
23496 | }], [{
|
23497 | key: "observedAttributes",
|
23498 | get: function get() {
|
23499 | return ['disabled'].concat(_toConsumableArray(BaseInputElement.observedAttributes));
|
23500 | }
|
23501 | }]);
|
23502 |
|
23503 | return RangeElement;
|
23504 | }(BaseInputElement);
|
23505 | onsElements.Range = RangeElement;
|
23506 | customElements.define('ons-range', RangeElement);
|
23507 |
|
23508 | /**
|
23509 | * @element ons-row
|
23510 | * @category grid
|
23511 | * @description
|
23512 | * [en]Represents a row in the grid system. Use with `<ons-col>` to layout components.[/en]
|
23513 | * [ja]グリッドシステムにて行を定義します。ons-colとともに使用し、コンポーネントの配置に使用します。[/ja]
|
23514 | * @codepen GgujC {wide}
|
23515 | * @guide features.html
|
23516 | * [en]Layouting guide[/en]
|
23517 | * [ja]レイアウト調整[/ja]
|
23518 | * @seealso ons-col
|
23519 | * [en]The `<ons-col>` component is used as children of `<ons-row>`.[/en]
|
23520 | * [ja]ons-colコンポーネント[/ja]
|
23521 | * @note
|
23522 | * [en]For Android 4.3 and earlier, and iOS6 and earlier, when using mixed alignment with ons-row and ons-col, they may not be displayed correctly. You can use only one vertical-align.[/en]
|
23523 | * [ja]Android 4.3以前、もしくはiOS 6以前のOSの場合、ons-rowとons-colを組み合わせてそれぞれのons-col要素のvertical-align属性の値に別々の値を指定すると、描画が崩れる場合があります。vertical-align属性の値には一つの値だけを指定できます。[/ja]
|
23524 | * @example
|
23525 | * <ons-row>
|
23526 | * <ons-col width="50px"><ons-icon icon="fa-twitter"></ons-icon></ons-col>
|
23527 | * <ons-col>Text</ons-col>
|
23528 | * </ons-row>
|
23529 | */
|
23530 |
|
23531 | /**
|
23532 | * @attribute vertical-align
|
23533 | * @type {String}
|
23534 | * @description
|
23535 | * [en]Short hand attribute for aligning vertically. Valid values are top, bottom, and center.[/en]
|
23536 | * [ja]縦に整列するために指定します。top、bottom、centerのいずれかを指定できます。[/ja]
|
23537 | */
|
23538 |
|
23539 | var RowElement = /*#__PURE__*/function (_BaseElement) {
|
23540 | _inherits(RowElement, _BaseElement);
|
23541 |
|
23542 | var _super = _createSuper(RowElement);
|
23543 |
|
23544 | function RowElement() {
|
23545 | _classCallCheck(this, RowElement);
|
23546 |
|
23547 | return _super.apply(this, arguments);
|
23548 | }
|
23549 |
|
23550 | return _createClass(RowElement);
|
23551 | }(BaseElement);
|
23552 | onsElements.Row = RowElement;
|
23553 | customElements.define('ons-row', RowElement);
|
23554 |
|
23555 | var defaultClassName$5 = 'segment';
|
23556 | var scheme$7 = {
|
23557 | '': 'segment--*',
|
23558 | '.segment__item': 'segment--*__item',
|
23559 | '.segment__input': 'segment--*__input',
|
23560 | '.segment__button': 'segment--*__button'
|
23561 | };
|
23562 |
|
23563 | var generateId = function () {
|
23564 | var i = 0;
|
23565 | return function () {
|
23566 | return 'ons-segment-gen-' + i++;
|
23567 | };
|
23568 | }();
|
23569 | /**
|
23570 | * @element ons-segment
|
23571 | * @category control
|
23572 | * @modifier material
|
23573 | * [en]Material Design segment[/en]
|
23574 | * [ja][/ja]
|
23575 | * @description
|
23576 | * [en]
|
23577 | * Segment component. Use this component to have a button bar with automatic styles that switch on click of another button.
|
23578 | *
|
23579 | * Will automatically display as a Material Design segment on Android.
|
23580 | * [/en]
|
23581 | * [ja][/ja]
|
23582 | * @codepen hLayx
|
23583 | * @tutorial vanilla/Reference/segment
|
23584 | * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
|
23585 | * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja]Information about cross platform styling[/ja]
|
23586 | * @example
|
23587 | * <ons-segment>
|
23588 | * <ons-button>Label 1</ons-button>
|
23589 | * <ons-button>Label 2</ons-button>
|
23590 | * <ons-button>Label 3</ons-button>
|
23591 | * </ons-segment>
|
23592 | */
|
23593 |
|
23594 |
|
23595 | var SegmentElement = /*#__PURE__*/function (_BaseElement) {
|
23596 | _inherits(SegmentElement, _BaseElement);
|
23597 |
|
23598 | var _super = _createSuper(SegmentElement);
|
23599 |
|
23600 | /**
|
23601 | * @event postchange
|
23602 | * @description
|
23603 | * [en]Fires after the active button is changed.[/en]
|
23604 | * [ja][/ja]
|
23605 | * @param {Object} event
|
23606 | * [en]Event object.[/en]
|
23607 | * [ja][/ja]
|
23608 | * @param {Number} event.index
|
23609 | * [en]Tapped button index.[/en]
|
23610 | * [ja][/ja]
|
23611 | * @param {Object} event.segmentItem
|
23612 | * [en]Segment item object.[/en]
|
23613 | * [ja][/ja]
|
23614 | */
|
23615 |
|
23616 | /**
|
23617 | * @attribute modifier
|
23618 | * @type {String}
|
23619 | * @description
|
23620 | * [en]The appearance of the segment.[/en]
|
23621 | * [ja][/ja]
|
23622 | */
|
23623 |
|
23624 | /**
|
23625 | * @attribute tabbar-id
|
23626 | * @initonly
|
23627 | * @type {String}
|
23628 | * @description
|
23629 | * [en]ID of the tabbar element to "connect" to the segment. Must be inside the same page.[/en]
|
23630 | * [ja][/ja]
|
23631 | */
|
23632 |
|
23633 | /**
|
23634 | * @attribute active-index
|
23635 | * @default 0
|
23636 | * @type {Number}
|
23637 | * @description
|
23638 | * [en]Index of the active button. If a tabbar is connected, this will be set to the tabbar's active index.[/en]
|
23639 | * [ja][/ja]
|
23640 | */
|
23641 |
|
23642 | /**
|
23643 | * @property activeIndex
|
23644 | * @default 0
|
23645 | * @type {Number}
|
23646 | * @description
|
23647 | * [en]Index of the active button. If a tabbar is connected, this will be set to the tabbar's active index.[/en]
|
23648 | * [ja][/ja]
|
23649 | */
|
23650 |
|
23651 | /**
|
23652 | * @attribute disabled
|
23653 | * @description
|
23654 | * [en]Specify if segment should be disabled.[/en]
|
23655 | * [ja]ボタンを無効化する場合は指定します。[/ja]
|
23656 | */
|
23657 | function SegmentElement() {
|
23658 | var _this;
|
23659 |
|
23660 | _classCallCheck(this, SegmentElement);
|
23661 |
|
23662 | _this = _super.call(this);
|
23663 | _this._segmentId = generateId();
|
23664 | _this._tabbar = null;
|
23665 | _this._onChange = _this._onChange.bind(_assertThisInitialized(_this));
|
23666 | _this._onTabbarPreChange = _this._onTabbarPreChange.bind(_assertThisInitialized(_this));
|
23667 | contentReady(_assertThisInitialized(_this), function () {
|
23668 | _this._compile();
|
23669 |
|
23670 | setImmediate(function () {
|
23671 | return _this._lastActiveIndex = _this._tabbar ? _this._tabbar.getActiveTabIndex() : _this.getActiveButtonIndex();
|
23672 | });
|
23673 | });
|
23674 | return _this;
|
23675 | }
|
23676 |
|
23677 | _createClass(SegmentElement, [{
|
23678 | key: "_compile",
|
23679 | value: function _compile() {
|
23680 | autoStyle.prepare(this);
|
23681 | this.classList.add(defaultClassName$5);
|
23682 |
|
23683 | for (var index = this.children.length - 1; index >= 0; index--) {
|
23684 | var item = this.children[index];
|
23685 | item.classList.add('segment__item');
|
23686 | var input = util$4.findChild(item, '.segment__input') || util$4.create('input.segment__input');
|
23687 | input.type = 'radio';
|
23688 | input.value = index;
|
23689 | input.name = input.name || this._segmentId;
|
23690 | input.checked = !this.hasAttribute('tabbar-id') && index === (this.activeIndex || 0);
|
23691 | var button = util$4.findChild(item, '.segment__button') || util$4.create('.segment__button');
|
23692 |
|
23693 | if (button.parentElement !== item) {
|
23694 | while (item.firstChild) {
|
23695 | button.appendChild(item.firstChild);
|
23696 | }
|
23697 | }
|
23698 |
|
23699 | item.appendChild(input);
|
23700 | item.appendChild(button);
|
23701 | }
|
23702 |
|
23703 | ModifierUtil.initModifier(this, scheme$7);
|
23704 | }
|
23705 | }, {
|
23706 | key: "connectedCallback",
|
23707 | value: function connectedCallback() {
|
23708 | var _this2 = this;
|
23709 |
|
23710 | contentReady(this, function () {
|
23711 | if (_this2.hasAttribute('tabbar-id')) {
|
23712 | var page = util$4.findParent(_this2, 'ons-page');
|
23713 | _this2._tabbar = page && page.querySelector('#' + _this2.getAttribute('tabbar-id'));
|
23714 |
|
23715 | if (!_this2._tabbar || _this2._tabbar.tagName !== 'ONS-TABBAR') {
|
23716 | util$4.throw("No tabbar with id ".concat(_this2.getAttribute('tabbar-id'), " was found."));
|
23717 | }
|
23718 |
|
23719 | _this2._tabbar.setAttribute('hide-tabs', '');
|
23720 |
|
23721 | setImmediate(function () {
|
23722 | var index = _this2._tabbar.getActiveTabIndex();
|
23723 |
|
23724 | _this2._setChecked(index);
|
23725 |
|
23726 | _this2.activeIndex = index;
|
23727 | });
|
23728 |
|
23729 | _this2._tabbar.addEventListener('prechange', _this2._onTabbarPreChange);
|
23730 | }
|
23731 | });
|
23732 | this.addEventListener('change', this._onChange);
|
23733 | }
|
23734 | }, {
|
23735 | key: "disconnectedCallback",
|
23736 | value: function disconnectedCallback() {
|
23737 | var _this3 = this;
|
23738 |
|
23739 | contentReady(this, function () {
|
23740 | if (_this3._tabbar) {
|
23741 | _this3._tabbar.removeEventListener('prechange', _this3._onTabbarPreChange);
|
23742 |
|
23743 | _this3._tabbar = null;
|
23744 | }
|
23745 | });
|
23746 | this.removeEventListener('change', this._onChange);
|
23747 | }
|
23748 | }, {
|
23749 | key: "_setChecked",
|
23750 | value: function _setChecked(index) {
|
23751 | this.children[index].firstElementChild.checked = true;
|
23752 | }
|
23753 | /**
|
23754 | * @method setActiveButton
|
23755 | * @signature setActiveButton(index, [options])
|
23756 | * @param {Number} index
|
23757 | * [en]Button index.[/en]
|
23758 | * [ja][/ja]
|
23759 | * @param {Object} [options]
|
23760 | * [en]Parameter object, works only if there is a connected tabbar. Supports the same options as `ons-tabbar`'s `setActiveTab` method.[/en]
|
23761 | * [ja][/ja]
|
23762 | * @description
|
23763 | * [en]Make button with the specified index active. If there is a connected tabbar it shows the corresponding tab page. In this case animations and their options can be specified by the second parameter.[/en]
|
23764 | * [ja][/ja]
|
23765 | * @return {Promise}
|
23766 | * [en]Resolves to the selected index or to the new page element if there is a connected tabbar.[/en]
|
23767 | * [ja][/ja]
|
23768 | */
|
23769 |
|
23770 | }, {
|
23771 | key: "setActiveButton",
|
23772 | value: function setActiveButton(index, options) {
|
23773 | if (this._tabbar) {
|
23774 | return this._tabbar.setActiveTab(index, options);
|
23775 | }
|
23776 |
|
23777 | this._setChecked(index);
|
23778 |
|
23779 | this._postChange(index);
|
23780 |
|
23781 | return Promise.resolve(index);
|
23782 | }
|
23783 | /**
|
23784 | * @method getActiveButtonIndex
|
23785 | * @signature getActiveButtonIndex()
|
23786 | * @return {Number}
|
23787 | * [en]The index of the currently active button.[/en]
|
23788 | * [ja][/ja]
|
23789 | * @description
|
23790 | * [en]Returns button index of current active button. If active button is not found, returns -1.[/en]
|
23791 | * [ja][/ja]
|
23792 | */
|
23793 |
|
23794 | }, {
|
23795 | key: "getActiveButtonIndex",
|
23796 | value: function getActiveButtonIndex() {
|
23797 | for (var i = this.children.length - 1; i >= 0; i--) {
|
23798 | // Array.findIndex
|
23799 | if (this.children[i].firstElementChild.checked) {
|
23800 | return i;
|
23801 | }
|
23802 | }
|
23803 |
|
23804 | return -1;
|
23805 | }
|
23806 | }, {
|
23807 | key: "_onChange",
|
23808 | value: function _onChange(event) {
|
23809 | event.stopPropagation();
|
23810 | this._tabbar ? this._tabbar.setActiveTab(this.getActiveButtonIndex(), {
|
23811 | reject: false
|
23812 | }) : this._postChange(this.getActiveButtonIndex());
|
23813 | }
|
23814 | }, {
|
23815 | key: "_onTabbarPreChange",
|
23816 | value: function _onTabbarPreChange(event) {
|
23817 | var _this4 = this;
|
23818 |
|
23819 | setImmediate(function () {
|
23820 | if (!event.detail.canceled) {
|
23821 | _this4._setChecked(event.index);
|
23822 |
|
23823 | _this4._postChange(event.index);
|
23824 | }
|
23825 | });
|
23826 | }
|
23827 | }, {
|
23828 | key: "_postChange",
|
23829 | value: function _postChange(index) {
|
23830 | util$4.triggerElementEvent(this, 'postchange', {
|
23831 | index: index,
|
23832 | activeIndex: index,
|
23833 | lastActiveIndex: this._lastActiveIndex,
|
23834 | segmentItem: this.children[index]
|
23835 | });
|
23836 | this._lastActiveIndex = index;
|
23837 | this.activeIndex = index;
|
23838 | }
|
23839 | /**
|
23840 | * @property disabled
|
23841 | * @type {Boolean}
|
23842 | * @description
|
23843 | * [en]Whether the segment is disabled or not.[/en]
|
23844 | * [ja]無効化されている場合に`true`。[/ja]
|
23845 | */
|
23846 |
|
23847 | }, {
|
23848 | key: "activeIndex",
|
23849 | get: function get() {
|
23850 | return parseInt(this.getAttribute('active-index'));
|
23851 | },
|
23852 | set: function set(value) {
|
23853 | if (value !== null && value !== undefined) {
|
23854 | this.setAttribute('active-index', value);
|
23855 | }
|
23856 | }
|
23857 | }, {
|
23858 | key: "attributeChangedCallback",
|
23859 | value: function attributeChangedCallback(name, last, current) {
|
23860 | var _this5 = this;
|
23861 |
|
23862 | switch (name) {
|
23863 | case 'class':
|
23864 | util$4.restoreClass(this, defaultClassName$5, scheme$7);
|
23865 | break;
|
23866 |
|
23867 | case 'modifier':
|
23868 | ModifierUtil.onModifierChanged(last, current, this, scheme$7);
|
23869 | break;
|
23870 |
|
23871 | case 'active-index':
|
23872 | contentReady(this, function () {
|
23873 | if (_this5.getActiveButtonIndex() !== _this5.activeIndex) {
|
23874 | _this5.setActiveButton(_this5.activeIndex);
|
23875 | }
|
23876 | });
|
23877 | break;
|
23878 | }
|
23879 | }
|
23880 | }], [{
|
23881 | key: "observedAttributes",
|
23882 | get: function get() {
|
23883 | return ['class', 'modifier', 'active-index'];
|
23884 | }
|
23885 | }, {
|
23886 | key: "events",
|
23887 | get: function get() {
|
23888 | return ['postchange'];
|
23889 | }
|
23890 | }]);
|
23891 |
|
23892 | return SegmentElement;
|
23893 | }(BaseElement);
|
23894 | util$4.defineBooleanProperties(SegmentElement, ['disabled']);
|
23895 | onsElements.Segment = SegmentElement;
|
23896 | customElements.define('ons-segment', SegmentElement);
|
23897 |
|
23898 | var scheme$6 = {
|
23899 | '': 'select-* select--*',
|
23900 | '.select-input': 'select-input--*'
|
23901 | };
|
23902 | var defaultClassName$4 = 'select';
|
23903 | var INPUT_ATTRIBUTES = ['autofocus', 'disabled', 'form', 'multiple', 'name', 'required', 'size'];
|
23904 | /**
|
23905 | * @element ons-select
|
23906 | * @category form
|
23907 | * @modifier material
|
23908 | * [en]Displays a Material Design select input.[/en]
|
23909 | * [ja][/ja]
|
23910 | * @modifier underbar
|
23911 | * [en]Displays a horizontal line underneath a select input.[/en]
|
23912 | * [ja][/ja]
|
23913 | * @description
|
23914 | * [en]
|
23915 | * Select component. If you want to place a select with an ID of `my-id` on a page, use `<ons-select select-id="my-id">`.
|
23916 | *
|
23917 | * The component will automatically display as a Material Design select on Android.
|
23918 | *
|
23919 | * Most attributes that can be used for a normal `<select>` element can also be used on the `<ons-select>` element.
|
23920 | * [/en]
|
23921 | * [ja]セレクトボックスを表示するコンポーネントです。`select` 要素に使用できる属性の多くが `ons-select` 要素でも利用できます。[/ja]
|
23922 | * @codepen hLayx
|
23923 | * @tutorial vanilla/Reference/select
|
23924 | * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
|
23925 | * @guide theming.html#cross-platform-styling-autostyling [en]Information about cross platform styling[/en][ja]Information about cross platform styling[/ja]
|
23926 | * @example
|
23927 | * <ons-select>
|
23928 | * <option value="1">1</option>
|
23929 | * <option value="2">2nd</option>
|
23930 | * <option value="3">3rd option</option>
|
23931 | * </ons-select>
|
23932 | */
|
23933 |
|
23934 | var SelectElement = /*#__PURE__*/function (_BaseElement) {
|
23935 | _inherits(SelectElement, _BaseElement);
|
23936 |
|
23937 | var _super = _createSuper(SelectElement);
|
23938 |
|
23939 | /**
|
23940 | * @attribute autofocus
|
23941 | * @type {Boolean}
|
23942 | * @default false
|
23943 | * @description
|
23944 | * [en]Element automatically gains focus on page load.[/en]
|
23945 | * [ja]ページロード時にこのセレクトボックスにフォーカスが移るようにします。[/ja]
|
23946 | */
|
23947 |
|
23948 | /**
|
23949 | * @attribute disabled
|
23950 | * @type {Boolean}
|
23951 | * @default false
|
23952 | * @description
|
23953 | * [en]Specify if select input should be disabled.[/en]
|
23954 | * [ja]このセレクトボックスを無効化する場合に指定します。[/ja]
|
23955 | */
|
23956 |
|
23957 | /**
|
23958 | * @attribute form
|
23959 | * @type {String}
|
23960 | * @description
|
23961 | * [en]Associate a select element to an existing form on the page, even if not nested.[/en]
|
23962 | * [ja]このセレクトボックスを、指定した `form` 要素に紐付けます。セレクトボックスを `form` 要素の外側に配置する際に使用します。[/ja]
|
23963 | */
|
23964 |
|
23965 | /**
|
23966 | * @attribute multiple
|
23967 | * @type {Boolean}
|
23968 | * @default false
|
23969 | * @description
|
23970 | * [en]If this attribute is defined, multiple options can be selected at once.[/en]
|
23971 | * [ja]選択肢の複数選択を有効にします。[/ja]
|
23972 | */
|
23973 |
|
23974 | /**
|
23975 | * @attribute name
|
23976 | * @type {String}
|
23977 | * @description
|
23978 | * [en]Name the select element, useful for instance if it is part of a form.[/en]
|
23979 | * [ja]このセレクトボックスの名前を指定します。通常 `form` 要素と共に使用します。[/ja]
|
23980 | */
|
23981 |
|
23982 | /**
|
23983 | * @attribute required
|
23984 | * @type {Boolean}
|
23985 | * @description
|
23986 | * [en]Make the select input required for submitting the form it is part of.[/en]
|
23987 | * [ja]このセレクトボックスを入力必須にする場合に指定します。通常 `form` 要素と共に使用します。[/ja]
|
23988 | */
|
23989 |
|
23990 | /**
|
23991 | * @attribute select-id
|
23992 | * @type {String}
|
23993 | * @description
|
23994 | * [en]ID given to the inner select, useful for dynamic manipulation.[/en]
|
23995 | * [ja]このセレクトボックスが内部に持つ select 要素に与える ID を指定します。セレクトボックスの内容を動的に変更する必要がある場合に使用します。[/ja]
|
23996 | */
|
23997 |
|
23998 | /**
|
23999 | * @attribute size
|
24000 | * @type {Number}
|
24001 | * @default 1
|
24002 | * @description
|
24003 | * [en]How many options are displayed; if there are more than the size then a scroll appears to navigate them.[/en]
|
24004 | * [ja]一度に表示する選択肢の個数を指定します。選択肢がこの属性で指定した個数よりも多い場合、スクロールが有効になります。[/ja]
|
24005 | */
|
24006 | function SelectElement() {
|
24007 | var _this;
|
24008 |
|
24009 | _classCallCheck(this, SelectElement);
|
24010 |
|
24011 | _this = _super.call(this);
|
24012 | contentReady(_assertThisInitialized(_this), function () {
|
24013 | return _this._compile();
|
24014 | });
|
24015 |
|
24016 | _this._deriveGetters();
|
24017 |
|
24018 | return _this;
|
24019 | }
|
24020 |
|
24021 | _createClass(SelectElement, [{
|
24022 | key: "attributeChangedCallback",
|
24023 | value: function attributeChangedCallback(name, last, current) {
|
24024 | var _this2 = this;
|
24025 |
|
24026 | switch (name) {
|
24027 | case 'class':
|
24028 | util$4.restoreClass(this, defaultClassName$4, scheme$6);
|
24029 | break;
|
24030 |
|
24031 | case 'modifier':
|
24032 | ModifierUtil.onModifierChanged(last, current, this, scheme$6);
|
24033 | break;
|
24034 | }
|
24035 |
|
24036 | if (INPUT_ATTRIBUTES.indexOf(name) >= 0) {
|
24037 | contentReady(this, function () {
|
24038 | return _this2._updateBoundAttributes();
|
24039 | });
|
24040 | }
|
24041 | }
|
24042 | }, {
|
24043 | key: "_select",
|
24044 | get: function get() {
|
24045 | return this.querySelector('select');
|
24046 | }
|
24047 | }, {
|
24048 | key: "_updateBoundAttributes",
|
24049 | value: function _updateBoundAttributes() {
|
24050 | var _this3 = this;
|
24051 |
|
24052 | INPUT_ATTRIBUTES.forEach(function (attr) {
|
24053 | if (_this3.hasAttribute(attr)) {
|
24054 | _this3._select.setAttribute(attr, _this3.getAttribute(attr));
|
24055 | } else {
|
24056 | _this3._select.removeAttribute(attr);
|
24057 | }
|
24058 | });
|
24059 | }
|
24060 | /**
|
24061 | * @property length
|
24062 | * @description
|
24063 | * [en]Number of options in the select box.[/en]
|
24064 | * [ja]このセレクトボックスに含まれる選択肢の個数を返します。 `select` 要素[/ja]
|
24065 | */
|
24066 |
|
24067 | /**
|
24068 | * @property options
|
24069 | * @description
|
24070 | * [en]Several options for handling the select DOM object.[/en]
|
24071 | * [ja]このセレクトボックスに含まれる `option` 要素の配列を返します。[/ja]
|
24072 | */
|
24073 |
|
24074 | /**
|
24075 | * @property selectedIndex
|
24076 | * @description
|
24077 | * [en]Index of the currently selected option.[/en]
|
24078 | * [ja]現在選択されている選択肢のインデックスを返します。[/ja]
|
24079 | */
|
24080 |
|
24081 | /**
|
24082 | * @property value
|
24083 | * @description
|
24084 | * [en]Value of the currently selected option.[/en]
|
24085 | * [ja]現在選択されている選択肢の値を返します。[/ja]
|
24086 | */
|
24087 |
|
24088 | }, {
|
24089 | key: "_compile",
|
24090 | value: function _compile() {
|
24091 | autoStyle.prepare(this);
|
24092 | this.classList.add(defaultClassName$4);
|
24093 | var sel = this._select || document.createElement('select');
|
24094 |
|
24095 | if (!sel.id && this.hasAttribute('select-id')) {
|
24096 | sel.id = this.getAttribute('select-id');
|
24097 | }
|
24098 |
|
24099 | sel.classList.add('select-input');
|
24100 |
|
24101 | if (!this._select) {
|
24102 | util$4.arrayFrom(this.childNodes).forEach(function (element) {
|
24103 | return sel.appendChild(element);
|
24104 | });
|
24105 | this.appendChild(sel);
|
24106 | }
|
24107 |
|
24108 | ModifierUtil.initModifier(this, scheme$6);
|
24109 | }
|
24110 | }, {
|
24111 | key: "_deriveGetters",
|
24112 | value: function _deriveGetters() {
|
24113 | var _this4 = this;
|
24114 |
|
24115 | ['disabled', 'length', 'multiple', 'name', 'options', 'selectedIndex', 'size', 'value', 'form', 'type'].forEach(function (key) {
|
24116 | Object.defineProperty(_this4, key, {
|
24117 | configurable: true,
|
24118 | enumerable: true,
|
24119 | get: function get() {
|
24120 | return _this4._select[key];
|
24121 | },
|
24122 | set: ['form', 'type'].indexOf(key) === -1 ? function (value) {
|
24123 | return contentReady(_this4, function () {
|
24124 | return _this4._select[key] = value;
|
24125 | });
|
24126 | } : undefined
|
24127 | });
|
24128 | });
|
24129 | }
|
24130 | }, {
|
24131 | key: "add",
|
24132 | value: function add(option) {
|
24133 | var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
24134 |
|
24135 | this._select.add(option, index);
|
24136 | } // If called with an index argument, removes the option element with the given index.
|
24137 | // If called with no arguments, removes this.
|
24138 | // This behaviour might sound crazy but it is the same as <select>'s `remove` method.
|
24139 | // https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/remove
|
24140 |
|
24141 | }, {
|
24142 | key: "remove",
|
24143 | value: function remove(index) {
|
24144 | if (index === undefined) {
|
24145 | Element.prototype.remove.call(this);
|
24146 | } else {
|
24147 | this._select.remove(index);
|
24148 | }
|
24149 | }
|
24150 | }], [{
|
24151 | key: "observedAttributes",
|
24152 | get: function get() {
|
24153 | return ['modifier', 'class'].concat(INPUT_ATTRIBUTES);
|
24154 | }
|
24155 | }]);
|
24156 |
|
24157 | return SelectElement;
|
24158 | }(BaseElement);
|
24159 | onsElements.Select = SelectElement;
|
24160 | customElements.define('ons-select', SelectElement);
|
24161 |
|
24162 | var defaultClassName$3 = 'fab fab--mini speed-dial__item';
|
24163 | var scheme$5 = {
|
24164 | '': 'fab--* speed-dial__item--*'
|
24165 | };
|
24166 | /**
|
24167 | * @element ons-speed-dial-item
|
24168 | * @category control
|
24169 | * @description
|
24170 | * [en]
|
24171 | * This component displays the child elements of the Material Design Speed dial component.
|
24172 | * [/en]
|
24173 | * [ja]
|
24174 | * Material DesignのSpeed dialの子要素を表現する要素です。
|
24175 | * [/ja]
|
24176 | * @codepen dYQYLg
|
24177 | * @tutorial vanilla/Reference/speed-dial
|
24178 | * @seealso ons-speed-dial
|
24179 | * [en]The `<ons-speed-dial>` component.[/en]
|
24180 | * [ja]ons-speed-dialコンポーネント[/ja]
|
24181 | * @seealso ons-fab
|
24182 | * [en]ons-fab component[/en]
|
24183 | * [ja]ons-fabコンポーネント[/ja]
|
24184 | * @example
|
24185 | * <ons-speed-dial position="left bottom">
|
24186 | * <ons-fab>
|
24187 | * <ons-icon icon="fa-twitter"></ons-icon>
|
24188 | * </ons-fab>
|
24189 | * <ons-speed-dial-item>A</ons-speed-dial-item>
|
24190 | * <ons-speed-dial-item>B</ons-speed-dial-item>
|
24191 | * <ons-speed-dial-item>C</ons-speed-dial-item>
|
24192 | * </ons-speed-dial>
|
24193 | */
|
24194 |
|
24195 | var SpeedDialItemElement = /*#__PURE__*/function (_BaseElement) {
|
24196 | _inherits(SpeedDialItemElement, _BaseElement);
|
24197 |
|
24198 | var _super = _createSuper(SpeedDialItemElement);
|
24199 |
|
24200 | /**
|
24201 | * @attribute modifier
|
24202 | * @type {String}
|
24203 | * @description
|
24204 | * [en]The appearance of the component.[/en]
|
24205 | * [ja]このコンポーネントの表現を指定します。[/ja]
|
24206 | */
|
24207 |
|
24208 | /**
|
24209 | * @attribute ripple
|
24210 | * @description
|
24211 | * [en]If this attribute is defined, the button will have a ripple effect when tapped.[/en]
|
24212 | * [ja][/ja]
|
24213 | */
|
24214 |
|
24215 | /**
|
24216 | * @property ripple
|
24217 | * @type {Boolean}
|
24218 | * @description
|
24219 | * [en]If this property is defined, the button will have a ripple effect when tapped.[/en]
|
24220 | * [ja][/ja]
|
24221 | */
|
24222 | function SpeedDialItemElement() {
|
24223 | var _this;
|
24224 |
|
24225 | _classCallCheck(this, SpeedDialItemElement);
|
24226 |
|
24227 | _this = _super.call(this);
|
24228 |
|
24229 | _this._compile();
|
24230 |
|
24231 | _this._boundOnClick = _this._onClick.bind(_assertThisInitialized(_this));
|
24232 | return _this;
|
24233 | }
|
24234 |
|
24235 | _createClass(SpeedDialItemElement, [{
|
24236 | key: "attributeChangedCallback",
|
24237 | value: function attributeChangedCallback(name, last, current) {
|
24238 | switch (name) {
|
24239 | case 'class':
|
24240 | util$4.restoreClass(this, defaultClassName$3, scheme$5);
|
24241 | break;
|
24242 |
|
24243 | case 'modifier':
|
24244 | ModifierUtil.onModifierChanged(last, current, this, scheme$5);
|
24245 | util$4.addModifier(this, 'mini');
|
24246 | break;
|
24247 |
|
24248 | case 'ripple':
|
24249 | this._updateRipple();
|
24250 |
|
24251 | }
|
24252 | }
|
24253 | }, {
|
24254 | key: "connectedCallback",
|
24255 | value: function connectedCallback() {
|
24256 | this.addEventListener('click', this._boundOnClick, false);
|
24257 | }
|
24258 | }, {
|
24259 | key: "disconnectedCallback",
|
24260 | value: function disconnectedCallback() {
|
24261 | this.removeEventListener('click', this._boundOnClick, false);
|
24262 | }
|
24263 | }, {
|
24264 | key: "_updateRipple",
|
24265 | value: function _updateRipple() {
|
24266 | util$4.updateRipple(this);
|
24267 | }
|
24268 | }, {
|
24269 | key: "_onClick",
|
24270 | value: function _onClick(e) {
|
24271 | e.stopPropagation();
|
24272 | }
|
24273 | }, {
|
24274 | key: "_compile",
|
24275 | value: function _compile() {
|
24276 | var _this2 = this;
|
24277 |
|
24278 | autoStyle.prepare(this);
|
24279 | defaultClassName$3.split(/\s+/).forEach(function (token) {
|
24280 | return _this2.classList.add(token);
|
24281 | });
|
24282 | util$4.addModifier(this, 'mini');
|
24283 |
|
24284 | this._updateRipple();
|
24285 |
|
24286 | ModifierUtil.initModifier(this, scheme$5);
|
24287 | }
|
24288 | }], [{
|
24289 | key: "observedAttributes",
|
24290 | get: function get() {
|
24291 | return ['modifier', 'ripple', 'class'];
|
24292 | }
|
24293 | }]);
|
24294 |
|
24295 | return SpeedDialItemElement;
|
24296 | }(BaseElement);
|
24297 | util$4.defineBooleanProperties(SpeedDialItemElement, ['ripple']);
|
24298 | onsElements.SpeedDialItem = SpeedDialItemElement;
|
24299 | customElements.define('ons-speed-dial-item', SpeedDialItemElement);
|
24300 |
|
24301 | var defaultClassName$2 = 'speed-dial';
|
24302 | var scheme$4 = {
|
24303 | '': 'speed-dial--*'
|
24304 | };
|
24305 | /**
|
24306 | * @element ons-speed-dial
|
24307 | * @category control
|
24308 | * @description
|
24309 | * [en]
|
24310 | * Element that displays a Material Design Speed Dialog component. It is useful when there are more than one primary action that can be performed in a page.
|
24311 | *
|
24312 | * The Speed dial looks like a `<ons-fab>` element but will expand a menu when tapped.
|
24313 | * [/en]
|
24314 | * [ja][/ja]
|
24315 | * @codepen dYQYLg
|
24316 | * @tutorial vanilla/Reference/speed-dial
|
24317 | * @seealso ons-speed-dial-item
|
24318 | * [en]The `<ons-speed-dial-item>` represents a menu item.[/en]
|
24319 | * [ja]ons-speed-dial-itemコンポーネント[/ja]
|
24320 | * @seealso ons-fab
|
24321 | * [en]ons-fab component[/en]
|
24322 | * [ja]ons-fabコンポーネント[/ja]
|
24323 | * @example
|
24324 | * <ons-speed-dial position="left bottom">
|
24325 | * <ons-fab>
|
24326 | * <ons-icon icon="fa-twitter"></ons-icon>
|
24327 | * </ons-fab>
|
24328 | * <ons-speed-dial-item>A</ons-speed-dial-item>
|
24329 | * <ons-speed-dial-item>B</ons-speed-dial-item>
|
24330 | * <ons-speed-dial-item>C</ons-speed-dial-item>
|
24331 | * </ons-speed-dial>
|
24332 | */
|
24333 |
|
24334 | var SpeedDialElement = /*#__PURE__*/function (_BaseElement) {
|
24335 | _inherits(SpeedDialElement, _BaseElement);
|
24336 |
|
24337 | var _super = _createSuper(SpeedDialElement);
|
24338 |
|
24339 | /**
|
24340 | * @event open
|
24341 | * @description
|
24342 | * [en]Fired when the menu items are shown.[/en]
|
24343 | * [ja][/ja]
|
24344 | */
|
24345 |
|
24346 | /**
|
24347 | * @event close
|
24348 | * @description
|
24349 | * [en]Fired when the menu items are hidden.[/en]
|
24350 | * [ja][/ja]
|
24351 | */
|
24352 |
|
24353 | /**
|
24354 | * @attribute modifier
|
24355 | * @type {String}
|
24356 | * @description
|
24357 | * [en]The appearance of the component.[/en]
|
24358 | * [ja]このコンポーネントの表現を指定します。[/ja]
|
24359 | */
|
24360 |
|
24361 | /**
|
24362 | * @attribute ripple
|
24363 | * @description
|
24364 | * [en]If this attribute is defined, the button will have a ripple effect when tapped.[/en]
|
24365 | * [ja][/ja]
|
24366 | */
|
24367 |
|
24368 | /**
|
24369 | * @property ripple
|
24370 | * @type {Boolean}
|
24371 | * @description
|
24372 | * [en]If this property is defined, the button will have a ripple effect when tapped.[/en]
|
24373 | * [ja][/ja]
|
24374 | */
|
24375 |
|
24376 | /**
|
24377 | * @attribute position
|
24378 | * @type {String}
|
24379 | * @description
|
24380 | * [en]
|
24381 | * Specify the vertical and horizontal position of the component.
|
24382 | * I.e. to display it in the top right corner specify "right top".
|
24383 | * Choose from "right", "left", "top" and "bottom".
|
24384 | * [/en]
|
24385 | * [ja]
|
24386 | * この要素を表示する左右と上下の位置を指定します。
|
24387 | * 例えば、右上に表示する場合には"right top"を指定します。
|
24388 | * 左右と上下の位置の指定には、rightとleft、topとbottomがそれぞれ指定できます。
|
24389 | * [/ja]
|
24390 | */
|
24391 |
|
24392 | /**
|
24393 | * @attribute direction
|
24394 | * @type {String}
|
24395 | * @description
|
24396 | * [en]Specify the direction the items are displayed. Possible values are "up", "down", "left" and "right".[/en]
|
24397 | * [ja]
|
24398 | * 要素が表示する方向を指定します。up, down, left, rightが指定できます。
|
24399 | * [/ja]
|
24400 | */
|
24401 |
|
24402 | /**
|
24403 | * @attribute disabled
|
24404 | * @description
|
24405 | * [en]Specify if button should be disabled.[/en]
|
24406 | * [ja]無効化する場合に指定します。[/ja]
|
24407 | */
|
24408 | function SpeedDialElement() {
|
24409 | var _this;
|
24410 |
|
24411 | _classCallCheck(this, SpeedDialElement);
|
24412 |
|
24413 | _this = _super.call(this);
|
24414 | contentReady(_assertThisInitialized(_this), function () {
|
24415 | _this._compile();
|
24416 | });
|
24417 | _this._boundOnClick = _this._onClick.bind(_assertThisInitialized(_this));
|
24418 |
|
24419 | var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'click'),
|
24420 | onConnected = _util$defineListenerP.onConnected,
|
24421 | onDisconnected = _util$defineListenerP.onDisconnected;
|
24422 |
|
24423 | _this._connectOnClick = onConnected;
|
24424 | _this._disconnectOnClick = onDisconnected;
|
24425 | return _this;
|
24426 | }
|
24427 |
|
24428 | _createClass(SpeedDialElement, [{
|
24429 | key: "_compile",
|
24430 | value: function _compile() {
|
24431 | this.classList.add(defaultClassName$2);
|
24432 | autoStyle.prepare(this);
|
24433 |
|
24434 | this._updateRipple();
|
24435 |
|
24436 | ModifierUtil.initModifier(this, scheme$4);
|
24437 |
|
24438 | if (this.hasAttribute('direction')) {
|
24439 | this._updateDirection(this.getAttribute('direction'));
|
24440 | } else {
|
24441 | this._updateDirection('up');
|
24442 | }
|
24443 |
|
24444 | this._updatePosition();
|
24445 | }
|
24446 | }, {
|
24447 | key: "attributeChangedCallback",
|
24448 | value: function attributeChangedCallback(name, last, current) {
|
24449 | var _this2 = this;
|
24450 |
|
24451 | switch (name) {
|
24452 | case 'class':
|
24453 | util$4.restoreClass(this, defaultClassName$2, scheme$4);
|
24454 | break;
|
24455 |
|
24456 | case 'modifier':
|
24457 | ModifierUtil.onModifierChanged(last, current, this, scheme$4);
|
24458 | break;
|
24459 |
|
24460 | case 'ripple':
|
24461 | contentReady(this, function () {
|
24462 | return _this2._updateRipple();
|
24463 | });
|
24464 | break;
|
24465 |
|
24466 | case 'direction':
|
24467 | contentReady(this, function () {
|
24468 | return _this2._updateDirection(current);
|
24469 | });
|
24470 | break;
|
24471 |
|
24472 | case 'position':
|
24473 | contentReady(this, function () {
|
24474 | return _this2._updatePosition();
|
24475 | });
|
24476 | break;
|
24477 |
|
24478 | case 'open':
|
24479 | if (!this._ignoreOpenSideEffect) {
|
24480 | contentReady(this, function () {
|
24481 | return _this2._updateOpen(last);
|
24482 | });
|
24483 | }
|
24484 |
|
24485 | break;
|
24486 | }
|
24487 | }
|
24488 | }, {
|
24489 | key: "connectedCallback",
|
24490 | value: function connectedCallback() {
|
24491 | this.addEventListener('click', this._boundOnClick, false);
|
24492 |
|
24493 | this._connectOnClick();
|
24494 | }
|
24495 | }, {
|
24496 | key: "disconnectedCallback",
|
24497 | value: function disconnectedCallback() {
|
24498 | this.removeEventListener('click', this._boundOnClick, false);
|
24499 |
|
24500 | this._disconnectOnClick();
|
24501 | }
|
24502 | }, {
|
24503 | key: "items",
|
24504 | get: function get() {
|
24505 | return util$4.arrayFrom(this.querySelectorAll('ons-speed-dial-item'));
|
24506 | }
|
24507 | }, {
|
24508 | key: "_fab",
|
24509 | get: function get() {
|
24510 | return util$4.findChild(this, 'ons-fab');
|
24511 | }
|
24512 | }, {
|
24513 | key: "_onClick",
|
24514 | value: function _onClick(event) {
|
24515 | var _this3 = this;
|
24516 |
|
24517 | setTimeout(function () {
|
24518 | if (!event.defaultPrevented && !_this3.disabled && _this3.visible) {
|
24519 | return _this3.toggleItems();
|
24520 | }
|
24521 | });
|
24522 | }
|
24523 | }, {
|
24524 | key: "_show",
|
24525 | value: function _show() {
|
24526 | if (!this.inline) {
|
24527 | return this.show();
|
24528 | }
|
24529 |
|
24530 | return Promise.resolve();
|
24531 | }
|
24532 | }, {
|
24533 | key: "_hide",
|
24534 | value: function _hide() {
|
24535 | var _this4 = this;
|
24536 |
|
24537 | return new Promise(function (resolve) {
|
24538 | if (!_this4.inline) {
|
24539 | setImmediate(function () {
|
24540 | return _this4.hide().then(resolve);
|
24541 | });
|
24542 | } else {
|
24543 | resolve();
|
24544 | }
|
24545 | });
|
24546 | }
|
24547 | }, {
|
24548 | key: "_updateRipple",
|
24549 | value: function _updateRipple() {
|
24550 | if (this._fab) {
|
24551 | this.hasAttribute('ripple') ? this._fab.setAttribute('ripple', '') : this._fab.removeAttribute('ripple');
|
24552 | }
|
24553 | }
|
24554 | }, {
|
24555 | key: "_updateDirection",
|
24556 | value: function _updateDirection(direction) {
|
24557 | var children = this.items;
|
24558 |
|
24559 | for (var i = 0; i < children.length; i++) {
|
24560 | styler(children[i], {
|
24561 | transitionDelay: 25 * i + 'ms',
|
24562 | bottom: 'auto',
|
24563 | right: 'auto',
|
24564 | top: 'auto',
|
24565 | left: 'auto'
|
24566 | });
|
24567 | }
|
24568 |
|
24569 | switch (direction) {
|
24570 | case 'up':
|
24571 | for (var _i = 0; _i < children.length; _i++) {
|
24572 | children[_i].style.bottom = 72 + 56 * _i + 'px';
|
24573 | children[_i].style.right = '8px';
|
24574 | }
|
24575 |
|
24576 | break;
|
24577 |
|
24578 | case 'down':
|
24579 | for (var _i2 = 0; _i2 < children.length; _i2++) {
|
24580 | children[_i2].style.top = 72 + 56 * _i2 + 'px';
|
24581 | children[_i2].style.left = '8px';
|
24582 | }
|
24583 |
|
24584 | break;
|
24585 |
|
24586 | case 'left':
|
24587 | for (var _i3 = 0; _i3 < children.length; _i3++) {
|
24588 | children[_i3].style.top = '8px';
|
24589 | children[_i3].style.right = 72 + 56 * _i3 + 'px';
|
24590 | }
|
24591 |
|
24592 | break;
|
24593 |
|
24594 | case 'right':
|
24595 | for (var _i4 = 0; _i4 < children.length; _i4++) {
|
24596 | children[_i4].style.top = '8px';
|
24597 | children[_i4].style.left = 72 + 56 * _i4 + 'px';
|
24598 | }
|
24599 |
|
24600 | break;
|
24601 |
|
24602 | default:
|
24603 | util$4.throw('Argument must be one of up, down, left or right.');
|
24604 | }
|
24605 | }
|
24606 | }, {
|
24607 | key: "_updatePosition",
|
24608 | value: function _updatePosition() {
|
24609 | var position = this.getAttribute('position');
|
24610 | this.classList.remove('fab--top__left', 'fab--bottom__right', 'fab--bottom__left', 'fab--top__right', 'fab--top__center', 'fab--bottom__center');
|
24611 |
|
24612 | switch (position) {
|
24613 | case 'top right':
|
24614 | case 'right top':
|
24615 | this.classList.add('fab--top__right');
|
24616 | break;
|
24617 |
|
24618 | case 'top left':
|
24619 | case 'left top':
|
24620 | this.classList.add('fab--top__left');
|
24621 | break;
|
24622 |
|
24623 | case 'bottom right':
|
24624 | case 'right bottom':
|
24625 | this.classList.add('fab--bottom__right');
|
24626 | break;
|
24627 |
|
24628 | case 'bottom left':
|
24629 | case 'left bottom':
|
24630 | this.classList.add('fab--bottom__left');
|
24631 | break;
|
24632 |
|
24633 | case 'center top':
|
24634 | case 'top center':
|
24635 | this.classList.add('fab--top__center');
|
24636 | break;
|
24637 |
|
24638 | case 'center bottom':
|
24639 | case 'bottom center':
|
24640 | this.classList.add('fab--bottom__center');
|
24641 | break;
|
24642 | }
|
24643 | }
|
24644 | }, {
|
24645 | key: "_getTranslate",
|
24646 | value: function _getTranslate() {
|
24647 | var isBottom = (this.getAttribute('position') || '').indexOf('bottom') >= 0;
|
24648 | var translate = isBottom ? "translate3d(0px, -".concat(util$4.globals.fabOffset || 0, "px, 0px) ") : '';
|
24649 | return translate;
|
24650 | }
|
24651 | /**
|
24652 | * @method show
|
24653 | * @signature show()
|
24654 | * @description
|
24655 | * [en]Show the speed dial.[/en]
|
24656 | * [ja]Speed dialを表示します。[/ja]
|
24657 | */
|
24658 |
|
24659 | }, {
|
24660 | key: "show",
|
24661 | value: function show() {
|
24662 | this._fab.show();
|
24663 |
|
24664 | styler(this, {
|
24665 | transform: this._getTranslate
|
24666 | });
|
24667 | return Promise.resolve();
|
24668 | }
|
24669 | /**
|
24670 | * @method hide
|
24671 | * @signature hide()
|
24672 | * @description
|
24673 | * [en]Hide the speed dial.[/en]
|
24674 | * [ja]Speed dialを非表示にします。[/ja]
|
24675 | */
|
24676 |
|
24677 | }, {
|
24678 | key: "hide",
|
24679 | value: function hide() {
|
24680 | var _this5 = this;
|
24681 |
|
24682 | return this.hideItems().then(function () {
|
24683 | return _this5._fab.hide();
|
24684 | });
|
24685 | }
|
24686 | /**
|
24687 | * @method showItems
|
24688 | * @signature showItems()
|
24689 | * @description
|
24690 | * [en]Show the speed dial items.[/en]
|
24691 | * [ja]Speed dialの子要素を表示します。[/ja]
|
24692 | */
|
24693 |
|
24694 | }, {
|
24695 | key: "showItems",
|
24696 | value: function showItems() {
|
24697 | var last = this.open;
|
24698 | this._ignoreOpenSideEffect = true;
|
24699 | this.open = true;
|
24700 | this._ignoreOpenSideEffect = false;
|
24701 | return this._updateOpen(last);
|
24702 | }
|
24703 | /**
|
24704 | * @method hideItems
|
24705 | * @signature hideItems()
|
24706 | * @description
|
24707 | * [en]Hide the speed dial items.[/en]
|
24708 | * [ja]Speed dialの子要素を非表示にします。[/ja]
|
24709 | */
|
24710 |
|
24711 | }, {
|
24712 | key: "hideItems",
|
24713 | value: function hideItems() {
|
24714 | var last = this.open;
|
24715 | this._ignoreOpenSideEffect = true;
|
24716 | this.open = false;
|
24717 | this._ignoreOpenSideEffect = false;
|
24718 | return this._updateOpen(last);
|
24719 | }
|
24720 | }, {
|
24721 | key: "_updateOpen",
|
24722 | value: function _updateOpen(last) {
|
24723 | // update direction
|
24724 | if (this.open) {
|
24725 | if (this.hasAttribute('direction')) {
|
24726 | this._updateDirection(this.getAttribute('direction'));
|
24727 | } else {
|
24728 | this._updateDirection('up');
|
24729 | }
|
24730 | }
|
24731 |
|
24732 | var totalDelay = 0;
|
24733 |
|
24734 | if (last !== this.open) {
|
24735 | // do nothing if already open/closed
|
24736 | var children = this.items;
|
24737 |
|
24738 | for (var i = 0; i < children.length; i++) {
|
24739 | var delay = 25 * (this.open ? i : children.length - i);
|
24740 | totalDelay += delay;
|
24741 | styler(children[i], {
|
24742 | transform: "scale(".concat(this.open ? 1 : 0, ")"),
|
24743 | transitionDelay: delay + 'ms'
|
24744 | });
|
24745 | }
|
24746 |
|
24747 | totalDelay += 50;
|
24748 | util$4.triggerElementEvent(this, this.open ? 'open' : 'close');
|
24749 | }
|
24750 |
|
24751 | var deferred = util$4.defer();
|
24752 | setTimeout(deferred.resolve, totalDelay);
|
24753 | return deferred.promise;
|
24754 | }
|
24755 | /**
|
24756 | * @property disabled
|
24757 | * @type {Boolean}
|
24758 | * @description
|
24759 | * [en]Whether the element is disabled or not.[/en]
|
24760 | * [ja]無効化されている場合に`true`。[/ja]
|
24761 | */
|
24762 |
|
24763 | }, {
|
24764 | key: "disabled",
|
24765 | get: function get() {
|
24766 | return this.hasAttribute('disabled');
|
24767 | }
|
24768 | /**
|
24769 | * @property inline
|
24770 | * @readonly
|
24771 | * @type {Boolean}
|
24772 | * @description
|
24773 | * [en]Whether the element is inline or not.[/en]
|
24774 | * [ja]インライン要素の場合に`true`。[/ja]
|
24775 | */
|
24776 | ,
|
24777 | set: function set(value) {
|
24778 | if (value) {
|
24779 | this.hideItems();
|
24780 | }
|
24781 |
|
24782 | util$4.arrayFrom(this.children).forEach(function (e) {
|
24783 | util$4.match(e, '.fab') && util$4.toggleAttribute(e, 'disabled', value);
|
24784 | });
|
24785 | util$4.toggleAttribute(this, 'disabled', value);
|
24786 | }
|
24787 | }, {
|
24788 | key: "inline",
|
24789 | get: function get() {
|
24790 | return this.hasAttribute('inline');
|
24791 | }
|
24792 | /**
|
24793 | * @property visible
|
24794 | * @readonly
|
24795 | * @type {Boolean}
|
24796 | * @description
|
24797 | * [en]Whether the element is visible or not.[/en]
|
24798 | * [ja]要素が見える場合に`true`。[/ja]
|
24799 | */
|
24800 |
|
24801 | }, {
|
24802 | key: "visible",
|
24803 | get: function get() {
|
24804 | return this._fab && this._fab.visible && this.style.display !== 'none';
|
24805 | }
|
24806 | /**
|
24807 | * @method isOpen
|
24808 | * @signature isOpen()
|
24809 | * @description
|
24810 | * [en]Returns whether the menu is open or not.[/en]
|
24811 | * [ja][/ja]
|
24812 | */
|
24813 |
|
24814 | }, {
|
24815 | key: "isOpen",
|
24816 | value: function isOpen() {
|
24817 | return this.open;
|
24818 | }
|
24819 | /**
|
24820 | * @attribute open
|
24821 | * @type {Boolean}
|
24822 | * @description
|
24823 | * [en]Returns whether the menu is open or not.[/en]
|
24824 | * [ja][/ja]
|
24825 | */
|
24826 |
|
24827 | /**
|
24828 | * @property open
|
24829 | * @type {Boolean}
|
24830 | * @description
|
24831 | * [en]Returns whether the menu is open or not.[/en]
|
24832 | * [ja][/ja]
|
24833 | */
|
24834 |
|
24835 | /**
|
24836 | * @method toggle
|
24837 | * @signature toggle()
|
24838 | * @description
|
24839 | * [en]Toggle visibility.[/en]
|
24840 | * [ja]Speed dialの表示非表示を切り替えます。[/ja]
|
24841 | */
|
24842 |
|
24843 | }, {
|
24844 | key: "toggle",
|
24845 | value: function toggle() {
|
24846 | return this.visible ? this.hide() : this.show();
|
24847 | }
|
24848 | /**
|
24849 | * @method toggleItems
|
24850 | * @signature toggleItems()
|
24851 | * @description
|
24852 | * [en]Toggle item visibility.[/en]
|
24853 | * [ja]Speed dialの子要素の表示非表示を切り替えます。[/ja]
|
24854 | */
|
24855 |
|
24856 | }, {
|
24857 | key: "toggleItems",
|
24858 | value: function toggleItems() {
|
24859 | return this.open ? this.hideItems() : this.showItems();
|
24860 | }
|
24861 | }], [{
|
24862 | key: "observedAttributes",
|
24863 | get: function get() {
|
24864 | return ['class', 'modifier', 'ripple', 'direction', 'position', 'open'];
|
24865 | }
|
24866 | }, {
|
24867 | key: "events",
|
24868 | get: function get() {
|
24869 | return ['open', 'close'];
|
24870 | }
|
24871 | }]);
|
24872 |
|
24873 | return SpeedDialElement;
|
24874 | }(BaseElement);
|
24875 | util$4.defineBooleanProperties(SpeedDialElement, ['open', 'ripple']);
|
24876 | onsElements.SpeedDial = SpeedDialElement;
|
24877 | customElements.define('ons-speed-dial', SpeedDialElement);
|
24878 |
|
24879 | var rewritables$2 = {
|
24880 | /**
|
24881 | * @param {Element} element
|
24882 | * @param {Function} callback
|
24883 | */
|
24884 | ready: function ready(element, callback) {
|
24885 | setImmediate(callback);
|
24886 | }
|
24887 | };
|
24888 | /**
|
24889 | * @element ons-splitter-content
|
24890 | * @category menu
|
24891 | * @description
|
24892 | * [en]
|
24893 | * The `<ons-splitter-content>` element is used as a child element of `<ons-splitter>`.
|
24894 | *
|
24895 | * It contains the main content of the page while `<ons-splitter-side>` contains the list.
|
24896 | * [/en]
|
24897 | * [ja]ons-splitter-content要素は、ons-splitter要素の子要素として利用します。[/ja]
|
24898 | * @codepen rOQOML
|
24899 | * @tutorial vanilla/Reference/splitter
|
24900 | * @guide fundamentals.html#managing-pages
|
24901 | * [en]Managing multiple pages.[/en]
|
24902 | * [ja]複数のページを管理する[/ja]
|
24903 | * @seealso ons-splitter
|
24904 | * [en]The `<ons-splitter>` component is the parent element.[/en]
|
24905 | * [ja]ons-splitterコンポーネント[/ja]
|
24906 | * @seealso ons-splitter-side
|
24907 | * [en]The `<ons-splitter-side>` component contains the menu.[/en]
|
24908 | * [ja]ons-splitter-sideコンポーネント[/ja]
|
24909 | * @example
|
24910 | * <ons-splitter>
|
24911 | * <ons-splitter-content>
|
24912 | * ...
|
24913 | * </ons-splitter-content>
|
24914 | *
|
24915 | * <ons-splitter-side side="left" width="80%" collapse>
|
24916 | * ...
|
24917 | * </ons-splitter-side>
|
24918 | * </ons-splitter>
|
24919 | */
|
24920 |
|
24921 | var SplitterContentElement = /*#__PURE__*/function (_BaseElement) {
|
24922 | _inherits(SplitterContentElement, _BaseElement);
|
24923 |
|
24924 | var _super = _createSuper(SplitterContentElement);
|
24925 |
|
24926 | /**
|
24927 | * @attribute page
|
24928 | * @type {String}
|
24929 | * @description
|
24930 | * [en]
|
24931 | * The url of the content page. If this attribute is used the content will be loaded from a `<template>` tag or a remote file.
|
24932 | *
|
24933 | * It is also possible to put `<ons-page>` element as a child of the element.
|
24934 | * [/en]
|
24935 | * [ja]ons-splitter-content要素に表示するページのURLを指定します。[/ja]
|
24936 | */
|
24937 | function SplitterContentElement() {
|
24938 | var _this;
|
24939 |
|
24940 | _classCallCheck(this, SplitterContentElement);
|
24941 |
|
24942 | _this = _super.call(this);
|
24943 | _this._page = null;
|
24944 | _this._pageLoader = defaultPageLoader;
|
24945 | contentReady(_assertThisInitialized(_this), function () {
|
24946 | rewritables$2.ready(_assertThisInitialized(_this), function () {
|
24947 | var page = _this._getPageTarget();
|
24948 |
|
24949 | if (page) {
|
24950 | _this.load(page);
|
24951 | }
|
24952 | });
|
24953 | });
|
24954 | return _this;
|
24955 | }
|
24956 |
|
24957 | _createClass(SplitterContentElement, [{
|
24958 | key: "connectedCallback",
|
24959 | value: function connectedCallback() {
|
24960 | if (!util$4.match(this.parentNode, 'ons-splitter')) {
|
24961 | util$4.throw('"ons-splitter-content" must have "ons-splitter" as parent');
|
24962 | }
|
24963 | }
|
24964 | }, {
|
24965 | key: "_getPageTarget",
|
24966 | value: function _getPageTarget() {
|
24967 | return this._page || this.getAttribute('page');
|
24968 | }
|
24969 | }, {
|
24970 | key: "disconnectedCallback",
|
24971 | value: function disconnectedCallback() {}
|
24972 | }, {
|
24973 | key: "attributeChangedCallback",
|
24974 | value: function attributeChangedCallback(name, last, current) {}
|
24975 | /**
|
24976 | * @property page
|
24977 | * @type {HTMLElement}
|
24978 | * @description
|
24979 | * [en]The page to load in the splitter content.[/en]
|
24980 | * [ja]この要素内に表示するページを指定します。[/ja]
|
24981 | */
|
24982 |
|
24983 | }, {
|
24984 | key: "page",
|
24985 | get: function get() {
|
24986 | return this._page;
|
24987 | }
|
24988 | /**
|
24989 | * @param {*} page
|
24990 | */
|
24991 | ,
|
24992 | set: function set(page) {
|
24993 | this._page = page;
|
24994 | }
|
24995 | }, {
|
24996 | key: "_content",
|
24997 | get: function get() {
|
24998 | return this.children[0];
|
24999 | }
|
25000 | /**
|
25001 | * @property pageLoader
|
25002 | * @type {Function}
|
25003 | * @description
|
25004 | * [en]Page element loaded in the splitter content.[/en]
|
25005 | * [ja]この要素内に表示するページを指定します。[/ja]
|
25006 | */
|
25007 |
|
25008 | }, {
|
25009 | key: "pageLoader",
|
25010 | get: function get() {
|
25011 | return this._pageLoader;
|
25012 | },
|
25013 | set: function set(loader) {
|
25014 | if (!(loader instanceof PageLoader)) {
|
25015 | util$4.throwPageLoader();
|
25016 | }
|
25017 |
|
25018 | this._pageLoader = loader;
|
25019 | }
|
25020 | /**
|
25021 | * @method load
|
25022 | * @signature load(page, [options])
|
25023 | * @param {String} page, [options]
|
25024 | * [en]Page URL. Can be either an HTML document or an `<template>` id.[/en]
|
25025 | * [ja]pageのURLか、`<template>`で宣言したテンプレートのid属性の値を指定します。[/ja]
|
25026 | * @param {Object} [options]
|
25027 | * @param {Function} [options.callback]
|
25028 | * @description
|
25029 | * [en]Show the page specified in `page` in the content.[/en]
|
25030 | * [ja]指定したURLをメインページを読み込みます。[/ja]
|
25031 | * @return {Promise}
|
25032 | * [en]Resolves to the new `<ons-page>` element[/en]
|
25033 | * [ja]`<ons-page>`要素を解決するPromiseオブジェクトを返します。[/ja]
|
25034 | */
|
25035 |
|
25036 | }, {
|
25037 | key: "load",
|
25038 | value: function load(page) {
|
25039 | var _this2 = this;
|
25040 |
|
25041 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
25042 | this._page = page;
|
25043 |
|
25044 | var callback = options.callback || function () {};
|
25045 |
|
25046 | return new Promise(function (resolve) {
|
25047 | var oldContent = _this2._content || null;
|
25048 |
|
25049 | _this2._pageLoader.load({
|
25050 | page: page,
|
25051 | parent: _this2
|
25052 | }, function (pageElement) {
|
25053 | if (oldContent) {
|
25054 | _this2._pageLoader.unload(oldContent);
|
25055 |
|
25056 | oldContent = null;
|
25057 | }
|
25058 |
|
25059 | setImmediate(function () {
|
25060 | return _this2._show();
|
25061 | });
|
25062 | callback(pageElement);
|
25063 | resolve(pageElement);
|
25064 | });
|
25065 | });
|
25066 | }
|
25067 | }, {
|
25068 | key: "_show",
|
25069 | value: function _show() {
|
25070 | if (this._content) {
|
25071 | this._content._show();
|
25072 | }
|
25073 | }
|
25074 | }, {
|
25075 | key: "_hide",
|
25076 | value: function _hide() {
|
25077 | if (this._content) {
|
25078 | this._content._hide();
|
25079 | }
|
25080 | }
|
25081 | }, {
|
25082 | key: "_destroy",
|
25083 | value: function _destroy() {
|
25084 | if (this._content) {
|
25085 | this._pageLoader.unload(this._content);
|
25086 | }
|
25087 |
|
25088 | this.remove();
|
25089 | }
|
25090 | }], [{
|
25091 | key: "observedAttributes",
|
25092 | get: function get() {
|
25093 | return [];
|
25094 | }
|
25095 | }, {
|
25096 | key: "rewritables",
|
25097 | get: function get() {
|
25098 | return rewritables$2;
|
25099 | }
|
25100 | }]);
|
25101 |
|
25102 | return SplitterContentElement;
|
25103 | }(BaseElement);
|
25104 | onsElements.SplitterContent = SplitterContentElement;
|
25105 | customElements.define('ons-splitter-content', SplitterContentElement);
|
25106 |
|
25107 | var SplitterMaskElement = /*#__PURE__*/function (_BaseElement) {
|
25108 | _inherits(SplitterMaskElement, _BaseElement);
|
25109 |
|
25110 | var _super = _createSuper(SplitterMaskElement);
|
25111 |
|
25112 | function SplitterMaskElement() {
|
25113 | var _this;
|
25114 |
|
25115 | _classCallCheck(this, SplitterMaskElement);
|
25116 |
|
25117 | _this = _super.call(this);
|
25118 | _this._boundOnClick = _this._onClick.bind(_assertThisInitialized(_this));
|
25119 | contentReady(_assertThisInitialized(_this), function () {
|
25120 | if (_this.parentNode._sides.every(function (side) {
|
25121 | return side.mode === 'split';
|
25122 | })) {
|
25123 | _this.setAttribute('style', 'display: none !important');
|
25124 | }
|
25125 | });
|
25126 | return _this;
|
25127 | }
|
25128 |
|
25129 | _createClass(SplitterMaskElement, [{
|
25130 | key: "_onClick",
|
25131 | value: function _onClick(event) {
|
25132 | if (this.onClick instanceof Function) {
|
25133 | this.onClick();
|
25134 | } else if (util$4.match(this.parentNode, 'ons-splitter')) {
|
25135 | this.parentNode._sides.forEach(function (side) {
|
25136 | return side.close('left').catch(function () {});
|
25137 | });
|
25138 | }
|
25139 |
|
25140 | event.stopPropagation();
|
25141 | }
|
25142 | }, {
|
25143 | key: "attributeChangedCallback",
|
25144 | value: function attributeChangedCallback(name, last, current) {}
|
25145 | }, {
|
25146 | key: "connectedCallback",
|
25147 | value: function connectedCallback() {
|
25148 | this.addEventListener('click', this._boundOnClick);
|
25149 | }
|
25150 | }, {
|
25151 | key: "disconnectedCallback",
|
25152 | value: function disconnectedCallback() {
|
25153 | this.removeEventListener('click', this._boundOnClick);
|
25154 | }
|
25155 | }], [{
|
25156 | key: "observedAttributes",
|
25157 | get: function get() {
|
25158 | return [];
|
25159 | }
|
25160 | }]);
|
25161 |
|
25162 | return SplitterMaskElement;
|
25163 | }(BaseElement);
|
25164 | onsElements.SplitterMask = SplitterMaskElement;
|
25165 | customElements.define('ons-splitter-mask', SplitterMaskElement);
|
25166 |
|
25167 | var SplitterAnimator$1 = /*#__PURE__*/function (_BaseAnimator) {
|
25168 | _inherits(SplitterAnimator, _BaseAnimator);
|
25169 |
|
25170 | var _super = _createSuper(SplitterAnimator);
|
25171 |
|
25172 | function SplitterAnimator() {
|
25173 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
25174 | _ref$timing = _ref.timing,
|
25175 | timing = _ref$timing === void 0 ? 'cubic-bezier(.1, .7, .1, 1)' : _ref$timing,
|
25176 | _ref$duration = _ref.duration,
|
25177 | duration = _ref$duration === void 0 ? 0.3 : _ref$duration,
|
25178 | _ref$delay = _ref.delay,
|
25179 | delay = _ref$delay === void 0 ? 0 : _ref$delay;
|
25180 |
|
25181 | _classCallCheck(this, SplitterAnimator);
|
25182 |
|
25183 | return _super.call(this, {
|
25184 | timing: timing,
|
25185 | duration: duration,
|
25186 | delay: delay
|
25187 | });
|
25188 | }
|
25189 |
|
25190 | _createClass(SplitterAnimator, [{
|
25191 | key: "updateOptions",
|
25192 | value: function updateOptions() {
|
25193 | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
25194 | util$4.extend(this, {
|
25195 | timing: this.timing,
|
25196 | duration: this.duration,
|
25197 | delay: this.delay
|
25198 | }, options);
|
25199 | }
|
25200 | /**
|
25201 | * @param {Element} sideElement
|
25202 | */
|
25203 |
|
25204 | }, {
|
25205 | key: "activate",
|
25206 | value: function activate(sideElement) {
|
25207 | var _this = this;
|
25208 |
|
25209 | var splitter = sideElement.parentNode;
|
25210 | contentReady(splitter, function () {
|
25211 | _this._side = sideElement;
|
25212 | _this._oppositeSide = splitter.right !== sideElement && splitter.right || splitter.left !== sideElement && splitter.left;
|
25213 | _this._content = splitter.content;
|
25214 | _this._mask = splitter.mask;
|
25215 | });
|
25216 | }
|
25217 | }, {
|
25218 | key: "deactivate",
|
25219 | value: function deactivate() {
|
25220 | this.clearTransition();
|
25221 | this._mask && this.clearMask();
|
25222 | this._content = this._side = this._oppositeSide = this._mask = null;
|
25223 | }
|
25224 | }, {
|
25225 | key: "minus",
|
25226 | get: function get() {
|
25227 | return this._side.side === 'right' ? '-' : '';
|
25228 | }
|
25229 | }, {
|
25230 | key: "clearTransition",
|
25231 | value: function clearTransition() {
|
25232 | var _this2 = this;
|
25233 |
|
25234 | 'side mask content'.split(/\s+/).forEach(function (e) {
|
25235 | return _this2['_' + e] && styler.clear(_this2['_' + e], 'transform transition');
|
25236 | });
|
25237 | }
|
25238 | }, {
|
25239 | key: "clearMask",
|
25240 | value: function clearMask() {
|
25241 | // Check if the other side needs the mask before clearing
|
25242 | if (!this._oppositeSide || this._oppositeSide.mode === 'split' || !this._oppositeSide.isOpen) {
|
25243 | this._mask.style.opacity = '';
|
25244 | this._mask.style.display = 'none';
|
25245 | }
|
25246 | }
|
25247 | /**
|
25248 | * @param {Number} distance
|
25249 | */
|
25250 |
|
25251 | }, {
|
25252 | key: "translate",
|
25253 | value: function translate(distance) {}
|
25254 | /**
|
25255 | * @param {Function} done
|
25256 | */
|
25257 |
|
25258 | }, {
|
25259 | key: "open",
|
25260 | value: function open(done) {
|
25261 | done();
|
25262 | }
|
25263 | /**
|
25264 | * @param {Function} done
|
25265 | */
|
25266 |
|
25267 | }, {
|
25268 | key: "close",
|
25269 | value: function close(done) {
|
25270 | done();
|
25271 | }
|
25272 | }]);
|
25273 |
|
25274 | return SplitterAnimator;
|
25275 | }(BaseAnimator);
|
25276 |
|
25277 | var OverlaySplitterAnimator = /*#__PURE__*/function (_SplitterAnimator) {
|
25278 | _inherits(OverlaySplitterAnimator, _SplitterAnimator);
|
25279 |
|
25280 | var _super = _createSuper(OverlaySplitterAnimator);
|
25281 |
|
25282 | function OverlaySplitterAnimator() {
|
25283 | _classCallCheck(this, OverlaySplitterAnimator);
|
25284 |
|
25285 | return _super.apply(this, arguments);
|
25286 | }
|
25287 |
|
25288 | _createClass(OverlaySplitterAnimator, [{
|
25289 | key: "translate",
|
25290 | value: function translate(distance) {
|
25291 | this._mask.style.display = 'block'; // Avoid content clicks
|
25292 |
|
25293 | Animit(this._side).queue({
|
25294 | transform: "translate3d(".concat(this.minus + distance, "px, 0, 0)")
|
25295 | }).play();
|
25296 | }
|
25297 | /**
|
25298 | * @param {Function} done
|
25299 | */
|
25300 |
|
25301 | }, {
|
25302 | key: "open",
|
25303 | value: function open(done) {
|
25304 | Animit.runAll(Animit(this._side).wait(this.delay).queue({
|
25305 | transform: "translate3d(".concat(this.minus, "100%, 0, 0)")
|
25306 | }, this.def).queue(function (callback) {
|
25307 | callback();
|
25308 | done && done();
|
25309 | }), Animit(this._mask).wait(this.delay).queue({
|
25310 | display: 'block'
|
25311 | }).queue({
|
25312 | opacity: '1'
|
25313 | }, {
|
25314 | duration: this.duration,
|
25315 | timing: 'linear'
|
25316 | }));
|
25317 | }
|
25318 | /**
|
25319 | * @param {Function} done
|
25320 | */
|
25321 |
|
25322 | }, {
|
25323 | key: "close",
|
25324 | value: function close(done) {
|
25325 | Animit.runAll(Animit(this._side).wait(this.delay).queue({
|
25326 | transform: 'translate3d(0, 0, 0)'
|
25327 | }, this.def).queue(function (callback) {
|
25328 | done && done();
|
25329 | callback();
|
25330 | }), Animit(this._mask).wait(this.delay).queue({
|
25331 | opacity: '0'
|
25332 | }, {
|
25333 | duration: this.duration,
|
25334 | timing: 'linear'
|
25335 | }).queue({
|
25336 | display: 'none'
|
25337 | }));
|
25338 | }
|
25339 | }]);
|
25340 |
|
25341 | return OverlaySplitterAnimator;
|
25342 | }(SplitterAnimator$1);
|
25343 |
|
25344 | var PushSplitterAnimator = /*#__PURE__*/function (_SplitterAnimator) {
|
25345 | _inherits(PushSplitterAnimator, _SplitterAnimator);
|
25346 |
|
25347 | var _super = _createSuper(PushSplitterAnimator);
|
25348 |
|
25349 | function PushSplitterAnimator() {
|
25350 | _classCallCheck(this, PushSplitterAnimator);
|
25351 |
|
25352 | return _super.apply(this, arguments);
|
25353 | }
|
25354 |
|
25355 | _createClass(PushSplitterAnimator, [{
|
25356 | key: "_getSlidingElements",
|
25357 | value: function _getSlidingElements() {
|
25358 | var slidingElements = [this._side, this._content];
|
25359 |
|
25360 | if (this._oppositeSide && this._oppositeSide.mode === 'split') {
|
25361 | slidingElements.push(this._oppositeSide);
|
25362 | }
|
25363 |
|
25364 | return slidingElements;
|
25365 | }
|
25366 | }, {
|
25367 | key: "translate",
|
25368 | value: function translate(distance) {
|
25369 | if (!this._slidingElements) {
|
25370 | this._slidingElements = this._getSlidingElements();
|
25371 | }
|
25372 |
|
25373 | this._mask.style.display = 'block'; // Avoid content clicks
|
25374 |
|
25375 | Animit(this._slidingElements).queue({
|
25376 | transform: "translate3d(".concat(this.minus + distance, "px, 0, 0)")
|
25377 | }).play();
|
25378 | }
|
25379 | /**
|
25380 | * @param {Function} done
|
25381 | */
|
25382 |
|
25383 | }, {
|
25384 | key: "open",
|
25385 | value: function open(done) {
|
25386 | var _this = this;
|
25387 |
|
25388 | var max = this._side.offsetWidth;
|
25389 | this._slidingElements = this._getSlidingElements();
|
25390 | Animit.runAll(Animit(this._slidingElements).wait(this.delay).queue({
|
25391 | transform: "translate3d(".concat(this.minus + max, "px, 0, 0)")
|
25392 | }, this.def).queue(function (callback) {
|
25393 | _this._slidingElements = null;
|
25394 | callback();
|
25395 | done && done();
|
25396 | }), Animit(this._mask).wait(this.delay).queue({
|
25397 | display: 'block'
|
25398 | }));
|
25399 | }
|
25400 | /**
|
25401 | * @param {Function} done
|
25402 | */
|
25403 |
|
25404 | }, {
|
25405 | key: "close",
|
25406 | value: function close(done) {
|
25407 | var _this2 = this;
|
25408 |
|
25409 | this._slidingElements = this._getSlidingElements();
|
25410 | Animit.runAll(Animit(this._slidingElements).wait(this.delay).queue({
|
25411 | transform: 'translate3d(0, 0, 0)'
|
25412 | }, this.def).queue(function (callback) {
|
25413 | _this2._slidingElements = null;
|
25414 |
|
25415 | _get(_getPrototypeOf(PushSplitterAnimator.prototype), "clearTransition", _this2).call(_this2);
|
25416 |
|
25417 | done && done();
|
25418 | callback();
|
25419 | }), Animit(this._mask).wait(this.delay).queue({
|
25420 | display: 'none'
|
25421 | }));
|
25422 | }
|
25423 | }]);
|
25424 |
|
25425 | return PushSplitterAnimator;
|
25426 | }(SplitterAnimator$1);
|
25427 |
|
25428 | var RevealSplitterAnimator = /*#__PURE__*/function (_SplitterAnimator) {
|
25429 | _inherits(RevealSplitterAnimator, _SplitterAnimator);
|
25430 |
|
25431 | var _super = _createSuper(RevealSplitterAnimator);
|
25432 |
|
25433 | function RevealSplitterAnimator() {
|
25434 | _classCallCheck(this, RevealSplitterAnimator);
|
25435 |
|
25436 | return _super.apply(this, arguments);
|
25437 | }
|
25438 |
|
25439 | _createClass(RevealSplitterAnimator, [{
|
25440 | key: "_getSlidingElements",
|
25441 | value: function _getSlidingElements() {
|
25442 | var slidingElements = [this._content, this._mask];
|
25443 |
|
25444 | if (this._oppositeSide && this._oppositeSide.mode === 'split') {
|
25445 | slidingElements.push(this._oppositeSide);
|
25446 | }
|
25447 |
|
25448 | return slidingElements;
|
25449 | }
|
25450 | }, {
|
25451 | key: "activate",
|
25452 | value: function activate(sideElement) {
|
25453 | _get(_getPrototypeOf(RevealSplitterAnimator.prototype), "activate", this).call(this, sideElement);
|
25454 |
|
25455 | if (sideElement.mode === 'collapse') {
|
25456 | this._setStyles(sideElement);
|
25457 | }
|
25458 | }
|
25459 | }, {
|
25460 | key: "deactivate",
|
25461 | value: function deactivate() {
|
25462 | this._side && this._unsetStyles(this._side);
|
25463 |
|
25464 | _get(_getPrototypeOf(RevealSplitterAnimator.prototype), "deactivate", this).call(this);
|
25465 | }
|
25466 | }, {
|
25467 | key: "_setStyles",
|
25468 | value: function _setStyles(sideElement) {
|
25469 | styler(sideElement, {
|
25470 | left: sideElement.side === 'right' ? 'auto' : 0,
|
25471 | right: sideElement.side === 'right' ? 0 : 'auto',
|
25472 | zIndex: 0,
|
25473 | backgroundColor: 'black',
|
25474 | transform: this._generateBehindPageStyle(0).container.transform,
|
25475 | display: 'none'
|
25476 | });
|
25477 | var splitter = sideElement.parentElement;
|
25478 | contentReady(splitter, function () {
|
25479 | return splitter.content && styler(splitter.content, {
|
25480 | boxShadow: '0 0 12px 0 rgba(0, 0, 0, 0.2)'
|
25481 | });
|
25482 | });
|
25483 | }
|
25484 | }, {
|
25485 | key: "_unsetStyles",
|
25486 | value: function _unsetStyles(sideElement) {
|
25487 | styler.clear(sideElement, 'left right zIndex backgroundColor display');
|
25488 |
|
25489 | if (sideElement._content) {
|
25490 | sideElement._content.style.opacity = '';
|
25491 | } // Check if the other side needs the common styles
|
25492 |
|
25493 |
|
25494 | if (!this._oppositeSide || this._oppositeSide.mode === 'split') {
|
25495 | sideElement.parentElement.content && styler.clear(sideElement.parentElement.content, 'boxShadow');
|
25496 | }
|
25497 | }
|
25498 | }, {
|
25499 | key: "_generateBehindPageStyle",
|
25500 | value: function _generateBehindPageStyle(distance) {
|
25501 | var max = this.maxWidth;
|
25502 | var behindDistance = (distance - max) / max * 10;
|
25503 | behindDistance = isNaN(behindDistance) ? 0 : Math.max(Math.min(behindDistance, 0), -10);
|
25504 | var behindTransform = "translate3d(".concat((this.minus ? -1 : 1) * behindDistance, "%, 0, 0)");
|
25505 | var opacity = 1 + behindDistance / 100;
|
25506 | return {
|
25507 | content: {
|
25508 | opacity: opacity
|
25509 | },
|
25510 | container: {
|
25511 | transform: behindTransform
|
25512 | }
|
25513 | };
|
25514 | }
|
25515 | }, {
|
25516 | key: "translate",
|
25517 | value: function translate(distance) {
|
25518 | this._side.style.display = '';
|
25519 | this._side.style.zIndex = 1;
|
25520 | this.maxWidth = this.maxWidth || this._getMaxWidth();
|
25521 |
|
25522 | var menuStyle = this._generateBehindPageStyle(Math.min(distance, this.maxWidth));
|
25523 |
|
25524 | if (!this._slidingElements) {
|
25525 | this._slidingElements = this._getSlidingElements();
|
25526 | }
|
25527 |
|
25528 | this._mask.style.display = 'block'; // Avoid content clicks
|
25529 |
|
25530 | Animit.runAll(Animit(this._slidingElements).queue({
|
25531 | transform: "translate3d(".concat(this.minus + distance, "px, 0, 0)")
|
25532 | }), Animit(this._side._content).queue(menuStyle.content), Animit(this._side).queue(menuStyle.container));
|
25533 | }
|
25534 | /**
|
25535 | * @param {Function} done
|
25536 | */
|
25537 |
|
25538 | }, {
|
25539 | key: "open",
|
25540 | value: function open(done) {
|
25541 | var _this = this;
|
25542 |
|
25543 | this._side.style.display = '';
|
25544 | this._side.style.zIndex = 1;
|
25545 | this.maxWidth = this.maxWidth || this._getMaxWidth();
|
25546 |
|
25547 | var menuStyle = this._generateBehindPageStyle(this.maxWidth);
|
25548 |
|
25549 | this._slidingElements = this._getSlidingElements();
|
25550 | setTimeout(function () {
|
25551 | // Fix: Time to update previous translate3d after changing style.display
|
25552 | Animit.runAll(Animit(_this._slidingElements).wait(_this.delay).queue({
|
25553 | transform: "translate3d(".concat(_this.minus + _this.maxWidth, "px, 0, 0)")
|
25554 | }, _this.def), Animit(_this._mask).wait(_this.delay).queue({
|
25555 | display: 'block'
|
25556 | }), Animit(_this._side._content).wait(_this.delay).queue(menuStyle.content, _this.def), Animit(_this._side).wait(_this.delay).queue(menuStyle.container, _this.def).queue(function (callback) {
|
25557 | _this._slidingElements = null;
|
25558 | callback();
|
25559 | done && done();
|
25560 | }));
|
25561 | }, 1000 / 60);
|
25562 | }
|
25563 | /**
|
25564 | * @param {Function} done
|
25565 | */
|
25566 |
|
25567 | }, {
|
25568 | key: "close",
|
25569 | value: function close(done) {
|
25570 | var _this2 = this;
|
25571 |
|
25572 | var menuStyle = this._generateBehindPageStyle(0);
|
25573 |
|
25574 | this._slidingElements = this._getSlidingElements();
|
25575 | Animit.runAll(Animit(this._slidingElements).wait(this.delay).queue({
|
25576 | transform: 'translate3d(0, 0, 0)'
|
25577 | }, this.def), Animit(this._mask).wait(this.delay).queue({
|
25578 | display: 'none'
|
25579 | }), Animit(this._side._content).wait(this.delay).queue(menuStyle.content, this.def), Animit(this._side).wait(this.delay).queue(menuStyle.container, this.def).queue(function (callback) {
|
25580 | _this2._slidingElements = null;
|
25581 | _this2._side.style.zIndex = 0;
|
25582 | _this2._side.style.display = 'none';
|
25583 | _this2._side._content.style.opacity = '';
|
25584 | done && done();
|
25585 | callback();
|
25586 | }));
|
25587 | }
|
25588 | }, {
|
25589 | key: "_getMaxWidth",
|
25590 | value: function _getMaxWidth() {
|
25591 | return this._side.offsetWidth;
|
25592 | }
|
25593 | }]);
|
25594 |
|
25595 | return RevealSplitterAnimator;
|
25596 | }(SplitterAnimator$1);
|
25597 |
|
25598 | var _animatorDict$1 = {
|
25599 | default: OverlaySplitterAnimator,
|
25600 | overlay: OverlaySplitterAnimator,
|
25601 | push: PushSplitterAnimator,
|
25602 | reveal: RevealSplitterAnimator
|
25603 | };
|
25604 | /**
|
25605 | * @element ons-splitter
|
25606 | * @category menu
|
25607 | * @description
|
25608 | * [en]
|
25609 | * A component that enables responsive layout by implementing both a two-column layout and a sliding menu layout.
|
25610 | *
|
25611 | * It can be configured to automatically expand into a column layout on large screens and collapse the menu on smaller screens. When the menu is collapsed the user can open it by swiping.
|
25612 | * [/en]
|
25613 | * [ja][/ja]
|
25614 | * @codepen rOQOML
|
25615 | * @tutorial vanilla/Reference/splitter
|
25616 | * @guide fundamentals.html#managing-pages
|
25617 | * [en]Managing multiple pages.[/en]
|
25618 | * [ja]複数のページを管理する[/ja]
|
25619 | * @seealso ons-splitter-content
|
25620 | * [en]The `<ons-splitter-content>` component contains the main content of the page.[/en]
|
25621 | * [ja]ons-splitter-contentコンポーネント[/ja]
|
25622 | * @seealso ons-splitter-side
|
25623 | * [en]The `<ons-splitter-side>` component contains the menu.[/en]
|
25624 | * [ja]ons-splitter-sideコンポーネント[/ja]
|
25625 | * @example
|
25626 | * <ons-splitter id="splitter">
|
25627 | * <ons-splitter-content>
|
25628 | * ...
|
25629 | * </ons-splitter-content>
|
25630 | *
|
25631 | * <ons-splitter-side side="left" width="80%" collapse swipeable>
|
25632 | * ...
|
25633 | * </ons-splitter-side>
|
25634 | * </ons-splitter>
|
25635 | *
|
25636 | * <script>
|
25637 | * var splitter = document.getElementById('splitter');
|
25638 | * splitter.left.open();
|
25639 | * </script>
|
25640 | */
|
25641 |
|
25642 | var SplitterElement = /*#__PURE__*/function (_BaseElement) {
|
25643 | _inherits(SplitterElement, _BaseElement);
|
25644 |
|
25645 | var _super = _createSuper(SplitterElement);
|
25646 |
|
25647 | function SplitterElement() {
|
25648 | var _this;
|
25649 |
|
25650 | _classCallCheck(this, SplitterElement);
|
25651 |
|
25652 | _this = _super.call(this);
|
25653 | _this._onModeChange = _this._onModeChange.bind(_assertThisInitialized(_this));
|
25654 | contentReady(_assertThisInitialized(_this), function () {
|
25655 | !_this.mask && _this.appendChild(document.createElement('ons-splitter-mask'));
|
25656 |
|
25657 | _this._layout();
|
25658 | });
|
25659 | return _this;
|
25660 | }
|
25661 |
|
25662 | _createClass(SplitterElement, [{
|
25663 | key: "_getSide",
|
25664 | value: function _getSide(side) {
|
25665 | var element = util$4.findChild(this, function (e) {
|
25666 | return util$4.match(e, 'ons-splitter-side') && e.getAttribute('side') === side;
|
25667 | });
|
25668 | return element;
|
25669 | }
|
25670 | /**
|
25671 | * @property left
|
25672 | * @readonly
|
25673 | * @type {HTMLElement}
|
25674 | * @description
|
25675 | * [en]Left `<ons-splitter-side>` element.[/en]
|
25676 | * [ja][/ja]
|
25677 | */
|
25678 |
|
25679 | }, {
|
25680 | key: "left",
|
25681 | get: function get() {
|
25682 | return this._getSide('left');
|
25683 | }
|
25684 | /**
|
25685 | * @property right
|
25686 | * @readonly
|
25687 | * @type {HTMLElement}
|
25688 | * @description
|
25689 | * [en]Right `<ons-splitter-side>` element.[/en]
|
25690 | * [ja][/ja]
|
25691 | */
|
25692 |
|
25693 | }, {
|
25694 | key: "right",
|
25695 | get: function get() {
|
25696 | return this._getSide('right');
|
25697 | }
|
25698 | /**
|
25699 | * @property side
|
25700 | * @readonly
|
25701 | * @type {HTMLElement}
|
25702 | * @description
|
25703 | * [en]First `<ons-splitter-side>` element regardless the actual side.[/en]
|
25704 | * [ja][/ja]
|
25705 | */
|
25706 |
|
25707 | }, {
|
25708 | key: "side",
|
25709 | get: function get() {
|
25710 | return util$4.findChild(this, 'ons-splitter-side');
|
25711 | }
|
25712 | }, {
|
25713 | key: "_sides",
|
25714 | get: function get() {
|
25715 | return [this.left, this.right].filter(function (e) {
|
25716 | return e;
|
25717 | });
|
25718 | }
|
25719 | /**
|
25720 | * @property content
|
25721 | * @readonly
|
25722 | * @type {HTMLElement}
|
25723 | * @description
|
25724 | * [en]The `<ons-splitter-content>` element.[/en]
|
25725 | * [ja][/ja]
|
25726 | */
|
25727 |
|
25728 | }, {
|
25729 | key: "content",
|
25730 | get: function get() {
|
25731 | return util$4.findChild(this, 'ons-splitter-content');
|
25732 | }
|
25733 | }, {
|
25734 | key: "topPage",
|
25735 | get: function get() {
|
25736 | return this.content._content;
|
25737 | }
|
25738 | }, {
|
25739 | key: "mask",
|
25740 | get: function get() {
|
25741 | return util$4.findChild(this, 'ons-splitter-mask');
|
25742 | }
|
25743 | /**
|
25744 | * @property onDeviceBackButton
|
25745 | * @type {Object}
|
25746 | * @description
|
25747 | * [en]Back-button handler.[/en]
|
25748 | * [ja]バックボタンハンドラ。[/ja]
|
25749 | */
|
25750 |
|
25751 | }, {
|
25752 | key: "onDeviceBackButton",
|
25753 | get: function get() {
|
25754 | return this._backButtonHandler;
|
25755 | },
|
25756 | set: function set(callback) {
|
25757 | if (this._backButtonHandler) {
|
25758 | this._backButtonHandler.destroy();
|
25759 | }
|
25760 |
|
25761 | this._backButtonHandler = deviceBackButtonDispatcher.createHandler(this, callback);
|
25762 | }
|
25763 | }, {
|
25764 | key: "_onDeviceBackButton",
|
25765 | value: function _onDeviceBackButton(event) {
|
25766 | this._sides.some(function (s) {
|
25767 | return s.isOpen ? s.close() : false;
|
25768 | }) || event.callParentHandler();
|
25769 | }
|
25770 | }, {
|
25771 | key: "_onModeChange",
|
25772 | value: function _onModeChange(e) {
|
25773 | var _this2 = this;
|
25774 |
|
25775 | if (e.target.parentNode) {
|
25776 | contentReady(this, function () {
|
25777 | _this2._layout();
|
25778 | });
|
25779 | }
|
25780 | }
|
25781 | }, {
|
25782 | key: "_layout",
|
25783 | value: function _layout() {
|
25784 | var _this3 = this;
|
25785 |
|
25786 | this._sides.forEach(function (side) {
|
25787 | if (_this3.content) {
|
25788 | _this3.content.style[side.side] = side.mode === 'split' ? side.style.width : 0;
|
25789 | }
|
25790 | });
|
25791 | }
|
25792 | }, {
|
25793 | key: "connectedCallback",
|
25794 | value: function connectedCallback() {
|
25795 | this.onDeviceBackButton = this._onDeviceBackButton.bind(this);
|
25796 | this.addEventListener('modechange', this._onModeChange, false);
|
25797 | }
|
25798 | }, {
|
25799 | key: "disconnectedCallback",
|
25800 | value: function disconnectedCallback() {
|
25801 | this._backButtonHandler.destroy();
|
25802 |
|
25803 | this._backButtonHandler = null;
|
25804 | this.removeEventListener('modechange', this._onModeChange, false);
|
25805 | }
|
25806 | }, {
|
25807 | key: "attributeChangedCallback",
|
25808 | value: function attributeChangedCallback(name, last, current) {}
|
25809 | }, {
|
25810 | key: "_show",
|
25811 | value: function _show() {
|
25812 | util$4.propagateAction(this, '_show');
|
25813 | }
|
25814 | }, {
|
25815 | key: "_hide",
|
25816 | value: function _hide() {
|
25817 | util$4.propagateAction(this, '_hide');
|
25818 | }
|
25819 | }, {
|
25820 | key: "_destroy",
|
25821 | value: function _destroy() {
|
25822 | util$4.propagateAction(this, '_destroy');
|
25823 | this.remove();
|
25824 | }
|
25825 | }], [{
|
25826 | key: "registerAnimator",
|
25827 | value: function registerAnimator(name, Animator) {
|
25828 | if (!(Animator instanceof SplitterAnimator)) {
|
25829 | util$4.throwAnimator('Splitter');
|
25830 | }
|
25831 |
|
25832 | _animatorDict$1[name] = Animator;
|
25833 | }
|
25834 | }, {
|
25835 | key: "SplitterAnimator",
|
25836 | get: function get() {
|
25837 | return SplitterAnimator;
|
25838 | }
|
25839 | }, {
|
25840 | key: "animators",
|
25841 | get: function get() {
|
25842 | return _animatorDict$1;
|
25843 | }
|
25844 | }]);
|
25845 |
|
25846 | return SplitterElement;
|
25847 | }(BaseElement);
|
25848 | onsElements.Splitter = SplitterElement;
|
25849 | customElements.define('ons-splitter', SplitterElement);
|
25850 |
|
25851 | var SPLIT_MODE = 'split';
|
25852 | var COLLAPSE_MODE = 'collapse';
|
25853 | var CLOSED_STATE = 'closed';
|
25854 | var OPEN_STATE = 'open';
|
25855 | var CHANGING_STATE = 'changing';
|
25856 | var rewritables$1 = {
|
25857 | /**
|
25858 | * @param {Element} splitterSideElement
|
25859 | * @param {Function} callback
|
25860 | */
|
25861 | ready: function ready(splitterSideElement, callback) {
|
25862 | setImmediate(callback);
|
25863 | }
|
25864 | };
|
25865 |
|
25866 | var CollapseDetection = /*#__PURE__*/function () {
|
25867 | function CollapseDetection(element, target) {
|
25868 | _classCallCheck(this, CollapseDetection);
|
25869 |
|
25870 | this._element = element;
|
25871 | this._onChange = this._onChange.bind(this);
|
25872 | target && this.changeTarget(target);
|
25873 | }
|
25874 |
|
25875 | _createClass(CollapseDetection, [{
|
25876 | key: "changeTarget",
|
25877 | value: function changeTarget(target) {
|
25878 | this.disable();
|
25879 | this._target = target;
|
25880 |
|
25881 | if (target) {
|
25882 | this._orientation = ['portrait', 'landscape'].indexOf(target) !== -1;
|
25883 | this.activate();
|
25884 | }
|
25885 | }
|
25886 | }, {
|
25887 | key: "_match",
|
25888 | value: function _match(value) {
|
25889 | if (this._orientation) {
|
25890 | return this._target === (value.isPortrait ? 'portrait' : 'landscape');
|
25891 | }
|
25892 |
|
25893 | return value.matches;
|
25894 | }
|
25895 | }, {
|
25896 | key: "_onChange",
|
25897 | value: function _onChange(value) {
|
25898 | this._element._updateMode(this._match(value) ? COLLAPSE_MODE : SPLIT_MODE);
|
25899 | }
|
25900 | }, {
|
25901 | key: "activate",
|
25902 | value: function activate() {
|
25903 | if (this._orientation) {
|
25904 | orientation.on('change', this._onChange);
|
25905 |
|
25906 | this._onChange({
|
25907 | isPortrait: orientation.isPortrait()
|
25908 | });
|
25909 | } else {
|
25910 | this._queryResult = window.matchMedia(this._target);
|
25911 |
|
25912 | this._queryResult.addListener(this._onChange);
|
25913 |
|
25914 | this._onChange(this._queryResult);
|
25915 | }
|
25916 | }
|
25917 | }, {
|
25918 | key: "disable",
|
25919 | value: function disable() {
|
25920 | if (this._orientation) {
|
25921 | orientation.off('change', this._onChange);
|
25922 | } else if (this._queryResult) {
|
25923 | this._queryResult.removeListener(this._onChange);
|
25924 |
|
25925 | this._queryResult = null;
|
25926 | }
|
25927 | }
|
25928 | }]);
|
25929 |
|
25930 | return CollapseDetection;
|
25931 | }();
|
25932 | /**
|
25933 | * @element ons-splitter-side
|
25934 | * @category menu
|
25935 | * @description
|
25936 | * [en]
|
25937 | * The `<ons-splitter-side>` element is used as a child element of `<ons-splitter>`.
|
25938 | *
|
25939 | * It will be displayed on either the left or right side of the `<ons-splitter-content>` element.
|
25940 | *
|
25941 | * It supports two modes: collapsed and split. When it's in collapsed mode it will be hidden from view and can be displayed when the user swipes the screen or taps a button. In split mode the element is always shown. It can be configured to automatically switch between the two modes depending on the screen size.
|
25942 | * [/en]
|
25943 | * [ja]ons-splitter-side要素は、ons-splitter要素の子要素として利用します。[/ja]
|
25944 | * @codepen rOQOML
|
25945 | * @tutorial vanilla/Reference/splitter
|
25946 | * @guide fundamentals.html#managing-pages
|
25947 | * [en]Managing multiple pages.[/en]
|
25948 | * [ja]複数のページを管理する[/ja]
|
25949 | * @seealso ons-splitter
|
25950 | * [en]The `<ons-splitter>` is the parent component.[/en]
|
25951 | * [ja]ons-splitterコンポーネント[/ja]
|
25952 | * @seealso ons-splitter-content
|
25953 | * [en]The `<ons-splitter-content>` component contains the main content of the page.[/en]
|
25954 | * [ja]ons-splitter-contentコンポーネント[/ja]
|
25955 | * @example
|
25956 | * <ons-splitter>
|
25957 | * <ons-splitter-content>
|
25958 | * ...
|
25959 | * </ons-splitter-content>
|
25960 | *
|
25961 | * <ons-splitter-side side="left" width="80%" collapse>
|
25962 | * ...
|
25963 | * </ons-splitter-side>
|
25964 | * </ons-splitter>
|
25965 | */
|
25966 |
|
25967 |
|
25968 | var SplitterSideElement = /*#__PURE__*/function (_BaseElement) {
|
25969 | _inherits(SplitterSideElement, _BaseElement);
|
25970 |
|
25971 | var _super = _createSuper(SplitterSideElement);
|
25972 |
|
25973 | /**
|
25974 | * @event modechange
|
25975 | * @description
|
25976 | * [en]Fired just after the component's mode changes.[/en]
|
25977 | * [ja]この要素のモードが変化した際に発火します。[/ja]
|
25978 | * @param {Object} event
|
25979 | * [en]Event object.[/en]
|
25980 | * [ja]イベントオブジェクトです。[/ja]
|
25981 | * @param {Object} event.side
|
25982 | * [en]Component object.[/en]
|
25983 | * [ja]コンポーネントのオブジェクト。[/ja]
|
25984 | * @param {String} event.mode
|
25985 | * [en]Returns the current mode. Can be either `"collapse"` or `"split"`.[/en]
|
25986 | * [ja]現在のモードを返します。[/ja]
|
25987 | */
|
25988 |
|
25989 | /**
|
25990 | * @event preopen
|
25991 | * @description
|
25992 | * [en]Fired just before the sliding menu is opened.[/en]
|
25993 | * [ja]スライディングメニューが開く前に発火します。[/ja]
|
25994 | * @param {Object} event
|
25995 | * [en]Event object.[/en]
|
25996 | * [ja]イベントオブジェクトです。[/ja]
|
25997 | * @param {Function} event.cancel
|
25998 | * [en]Call to cancel opening sliding menu.[/en]
|
25999 | * [ja]スライディングメニューが開くのをキャンセルします。[/ja]
|
26000 | * @param {Object} event.side
|
26001 | * [en]Component object.[/en]
|
26002 | * [ja]コンポーネントのオブジェクト。[/ja]
|
26003 | */
|
26004 |
|
26005 | /**
|
26006 | * @event postopen
|
26007 | * @description
|
26008 | * [en]Fired just after the sliding menu is opened.[/en]
|
26009 | * [ja]スライディングメニューが開いた後に発火します。[/ja]
|
26010 | * @param {Object} event
|
26011 | * [en]Event object.[/en]
|
26012 | * [ja]イベントオブジェクトです。[/ja]
|
26013 | * @param {Object} event.side
|
26014 | * [en]Component object.[/en]
|
26015 | * [ja]コンポーネントのオブジェクト。[/ja]
|
26016 | */
|
26017 |
|
26018 | /**
|
26019 | * @event preclose
|
26020 | * @description
|
26021 | * [en]Fired just before the sliding menu is closed.[/en]
|
26022 | * [ja]スライディングメニューが閉じる前に発火します。[/ja]
|
26023 | * @param {Object} event
|
26024 | * [en]Event object.[/en]
|
26025 | * [ja]イベントオブジェクトです。[/ja]
|
26026 | * @param {Object} event.side
|
26027 | * [en]Component object.[/en]
|
26028 | * [ja]コンポーネントのオブジェクト。[/ja]
|
26029 | * @param {Function} event.cancel
|
26030 | * [en]Call to cancel opening sliding-menu.[/en]
|
26031 | * [ja]スライディングメニューが閉じるのをキャンセルします。[/ja]
|
26032 | */
|
26033 |
|
26034 | /**
|
26035 | * @event postclose
|
26036 | * @description
|
26037 | * [en]Fired just after the sliding menu is closed.[/en]
|
26038 | * [ja]スライディングメニューが閉じた後に発火します。[/ja]
|
26039 | * @param {Object} event
|
26040 | * [en]Event object.[/en]
|
26041 | * [ja]イベントオブジェクトです。[/ja]
|
26042 | * @param {Object} event.side
|
26043 | * [en]Component object.[/en]
|
26044 | * [ja]コンポーネントのオブジェクト。[/ja]
|
26045 | */
|
26046 |
|
26047 | /**
|
26048 | * @event swipe
|
26049 | * @description
|
26050 | * [en]Fired whenever the user slides the splitter.[/en]
|
26051 | * [ja][/ja]
|
26052 | * @param {Object} event [en]Event object.[/en]
|
26053 | * @param {Object} event.ratio
|
26054 | * [en]Decimal ratio (0-1).[/en]
|
26055 | * [ja][/ja]
|
26056 | * @param {Object} event.animationOptions
|
26057 | * [en][/en]
|
26058 | * [ja][/ja]
|
26059 | */
|
26060 |
|
26061 | /**
|
26062 | * @attribute animation
|
26063 | * @type {String}
|
26064 | * @default default
|
26065 | * @description
|
26066 | * [en]Specify the animation. Use one of `overlay`, `push`, `reveal` or `default`.[/en]
|
26067 | * [ja]アニメーションを指定します。"overlay", "push", "reveal", "default"のいずれかを指定できます。[/ja]
|
26068 | */
|
26069 |
|
26070 | /**
|
26071 | * @attribute animation-options
|
26072 | * @type {Expression}
|
26073 | * @description
|
26074 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
26075 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. {duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
|
26076 | */
|
26077 |
|
26078 | /**
|
26079 | * @property animationOptions
|
26080 | * @type {Object}
|
26081 | * @description
|
26082 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
26083 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. {duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
|
26084 | */
|
26085 |
|
26086 | /**
|
26087 | * @attribute open-threshold
|
26088 | * @type {Number}
|
26089 | * @default 0.3
|
26090 | * @description
|
26091 | * [en]Specify how much the menu needs to be swiped before opening. A value between `0` and `1`.[/en]
|
26092 | * [ja]どのくらいスワイプすればスライディングメニューを開くかどうかの割合を指定します。0から1の間の数値を指定します。スワイプの距離がここで指定した数値掛けるこの要素の幅よりも大きければ、スワイプが終わった時にこの要素を開きます。デフォルトは0.3です。[/ja]
|
26093 | */
|
26094 |
|
26095 | /**
|
26096 | * @attribute collapse
|
26097 | * @type {String}
|
26098 | * @description
|
26099 | * [en]
|
26100 | * Specify the collapse behavior. Valid values are `"portrait"`, `"landscape"` or a media query.
|
26101 | * The string `"portrait"` means the view will collapse when the device is in portrait orientation.
|
26102 | * The string `"landscape"` means the view will collapse when the device is in landscape orientation.
|
26103 | * If the value is a media query, the view will collapse when the media query resolves to `true`.
|
26104 | * If the attribute is set, including as an empty string, the view will always be in `"collapse"` mode.
|
26105 | * If the attribute is not set, the view will be in `"split"` mode.
|
26106 | * [/en]
|
26107 | * [ja]
|
26108 | * 左側のページを非表示にする条件を指定します。portrait, landscape、width #pxもしくはメディアクエリの指定が可能です。
|
26109 | * portraitもしくはlandscapeを指定すると、デバイスの画面が縦向きもしくは横向きになった時に適用されます。
|
26110 | * メディアクエリを指定すると、指定したクエリに適合している場合に適用されます。
|
26111 | * 値に何も指定しない場合には、常にcollapseモードになります。
|
26112 | * [/ja]
|
26113 | */
|
26114 |
|
26115 | /**
|
26116 | * @attribute swipe-target-width
|
26117 | * @type {String}
|
26118 | * @description
|
26119 | * [en]The width of swipeable area calculated from the edge (in pixels). Use this to enable swipe only when the finger touch on the screen edge.[/en]
|
26120 | * [ja]スワイプの判定領域をピクセル単位で指定します。画面の端から指定した距離に達するとページが表示されます。[/ja]
|
26121 | */
|
26122 |
|
26123 | /**
|
26124 | * @attribute width
|
26125 | * @type {String}
|
26126 | * @description
|
26127 | * [en]Can be specified in either pixels or as a percentage, e.g. `90%` or `200px`.[/en]
|
26128 | * [ja]この要素の横幅を指定します。pxと%での指定が可能です。eg. 90%, 200px[/ja]
|
26129 | */
|
26130 |
|
26131 | /**
|
26132 | * @attribute side
|
26133 | * @type {String}
|
26134 | * @default left
|
26135 | * @description
|
26136 | * [en]Specify which side of the screen the `<ons-splitter-side>` element is located. Possible values are `"left"` and `"right"`.[/en]
|
26137 | * [ja]この要素が左か右かを指定します。指定できる値は"left"か"right"のみです。[/ja]
|
26138 | */
|
26139 |
|
26140 | /**
|
26141 | * @attribute mode
|
26142 | * @type {String}
|
26143 | * @description
|
26144 | * [en]Current mode. Possible values are `"collapse"` or `"split"`. This attribute is read only.[/en]
|
26145 | * [ja]現在のモードが設定されます。"collapse"もしくは"split"が指定されます。この属性は読み込み専用です。[/ja]
|
26146 | */
|
26147 |
|
26148 | /**
|
26149 | * @attribute page
|
26150 | * @initonly
|
26151 | * @type {String}
|
26152 | * @description
|
26153 | * [en]The URL of the menu page.[/en]
|
26154 | * [ja]ons-splitter-side要素に表示するページのURLを指定します。[/ja]
|
26155 | */
|
26156 |
|
26157 | /**
|
26158 | * @attribute swipeable
|
26159 | * @type {Boolean}
|
26160 | * @description
|
26161 | * [en]Whether to enable swipe interaction on collapse mode.[/en]
|
26162 | * [ja]collapseモード時にスワイプ操作を有効にする場合に指定します。[/ja]
|
26163 | */
|
26164 |
|
26165 | /**
|
26166 | * @property swipeable
|
26167 | * @type {Boolean}
|
26168 | * @description
|
26169 | * [en]Whether to enable swipe interaction on collapse mode.[/en]
|
26170 | * [ja]collapseモード時にスワイプ操作を有効にする場合に指定します。[/ja]
|
26171 | */
|
26172 | function SplitterSideElement() {
|
26173 | var _this;
|
26174 |
|
26175 | _classCallCheck(this, SplitterSideElement);
|
26176 |
|
26177 | _this = _super.call(this);
|
26178 | _this._page = null;
|
26179 | _this._state = CLOSED_STATE;
|
26180 | _this._lock = new DoorLock();
|
26181 | _this._pageLoader = defaultPageLoader;
|
26182 | _this._collapseDetection = new CollapseDetection(_assertThisInitialized(_this));
|
26183 | _this._animatorFactory = new AnimatorFactory({
|
26184 | animators: SplitterElement.animators,
|
26185 | baseClass: SplitterAnimator$1,
|
26186 | baseClassName: 'SplitterAnimator',
|
26187 | defaultAnimation: _this.getAttribute('animation')
|
26188 | });
|
26189 | contentReady(_assertThisInitialized(_this), function () {
|
26190 | // These attributes are used early by the parent element
|
26191 | _this.attributeChangedCallback('width');
|
26192 |
|
26193 | if (!_this.hasAttribute('side')) {
|
26194 | _this.setAttribute('side', 'left');
|
26195 | }
|
26196 |
|
26197 | rewritables$1.ready(_assertThisInitialized(_this), function () {
|
26198 | var page = _this._page || _this.getAttribute('page');
|
26199 |
|
26200 | page && _this.load(page);
|
26201 | });
|
26202 | });
|
26203 | return _this;
|
26204 | }
|
26205 |
|
26206 | _createClass(SplitterSideElement, [{
|
26207 | key: "connectedCallback",
|
26208 | value: function connectedCallback() {
|
26209 | var _this2 = this;
|
26210 |
|
26211 | if (!util$4.match(this.parentNode, 'ons-splitter')) {
|
26212 | util$4.throw('Parent must be an ons-splitter element');
|
26213 | }
|
26214 |
|
26215 | if (!this._swipe) {
|
26216 | this._swipe = new SwipeReveal({
|
26217 | element: this,
|
26218 | elementHandler: this.parentElement,
|
26219 | swipeMax: function swipeMax() {
|
26220 | var ratio = 1;
|
26221 | _this2._onSwipe && _this2._onSwipe(ratio, _this2._animationOpt);
|
26222 | util$4.triggerElementEvent(_this2, 'swipe', {
|
26223 | ratio: ratio,
|
26224 | animationOptions: _this2._animationOpt
|
26225 | });
|
26226 |
|
26227 | _this2.open();
|
26228 | },
|
26229 | swipeMid: function swipeMid(distance, width) {
|
26230 | var ratio = distance / width;
|
26231 | _this2._onSwipe && _this2._onSwipe(ratio);
|
26232 | util$4.triggerElementEvent(_this2, 'swipe', {
|
26233 | ratio: ratio
|
26234 | });
|
26235 |
|
26236 | _this2._animator.translate(distance);
|
26237 | },
|
26238 | swipeMin: function swipeMin() {
|
26239 | var ratio = 0;
|
26240 | _this2._onSwipe && _this2._onSwipe(ratio, _this2._animationOpt);
|
26241 | util$4.triggerElementEvent(_this2, 'swipe', {
|
26242 | ratio: ratio,
|
26243 | animationOptions: _this2._animationOpt
|
26244 | });
|
26245 |
|
26246 | _this2.close();
|
26247 | },
|
26248 | getThreshold: function getThreshold() {
|
26249 | return Math.max(0, Math.min(1, parseFloat(_this2.getAttribute('open-threshold')) || 0.3));
|
26250 | },
|
26251 | getSide: function getSide() {
|
26252 | return _this2.side;
|
26253 | },
|
26254 | isInitialState: function isInitialState() {
|
26255 | var closed = _this2._state === CLOSED_STATE;
|
26256 | _this2._state = CHANGING_STATE;
|
26257 | return closed;
|
26258 | },
|
26259 | ignoreSwipe: function ignoreSwipe(event, distance) {
|
26260 | var isOpen = _this2.isOpen;
|
26261 |
|
26262 | var validDrag = function validDrag(d) {
|
26263 | return _this2.side === 'left' ? d === 'left' && isOpen || d === 'right' && !isOpen : d === 'left' && !isOpen || d === 'right' && isOpen;
|
26264 | };
|
26265 |
|
26266 | var area = Math.max(0, parseInt(_this2.getAttribute('swipe-target-width'), 10) || 0);
|
26267 | return _this2._mode === SPLIT_MODE || _this2._lock.isLocked() || _this2._isOtherSideOpen() || !validDrag(event.gesture.direction) || !isOpen && area !== 0 && distance > area;
|
26268 | }
|
26269 | });
|
26270 | this.attributeChangedCallback('swipeable');
|
26271 | }
|
26272 |
|
26273 | contentReady(this, function () {
|
26274 | _this2.constructor.observedAttributes.forEach(function (attr) {
|
26275 | return _this2.attributeChangedCallback(attr, null, _this2.getAttribute(attr));
|
26276 | });
|
26277 | });
|
26278 | }
|
26279 | }, {
|
26280 | key: "side",
|
26281 | get: function get() {
|
26282 | return this.getAttribute('side') === 'right' ? 'right' : 'left';
|
26283 | },
|
26284 | set: function set(value) {
|
26285 | if (value) {
|
26286 | this.setAttribute('side', value);
|
26287 | } else {
|
26288 | tihs.removeAttribute('side');
|
26289 | }
|
26290 | }
|
26291 | }, {
|
26292 | key: "disconnectedCallback",
|
26293 | value: function disconnectedCallback() {
|
26294 | this._swipe && this._swipe.dispose();
|
26295 | this._animator = this._animationOpt = this._swipe = null;
|
26296 | }
|
26297 | }, {
|
26298 | key: "attributeChangedCallback",
|
26299 | value: function attributeChangedCallback(name, last, current) {
|
26300 | switch (name) {
|
26301 | case 'swipeable':
|
26302 | this._swipe && this._swipe.update();
|
26303 | break;
|
26304 |
|
26305 | case 'width':
|
26306 | current = this.getAttribute('width'); // Sometimes undefined. CE bug?
|
26307 |
|
26308 | this.style.width = /^\d+(px|%)$/.test(current) ? current : '80%';
|
26309 | break;
|
26310 |
|
26311 | case 'animation':
|
26312 | case 'animation-options':
|
26313 | this._updateAnimation();
|
26314 |
|
26315 | break;
|
26316 |
|
26317 | default:
|
26318 | this[util$4.camelize("_update-".concat(name))](current);
|
26319 | }
|
26320 | }
|
26321 | }, {
|
26322 | key: "_emitEvent",
|
26323 | value: function _emitEvent(name) {
|
26324 | if (name.slice(0, 3) !== 'pre') {
|
26325 | return util$4.triggerElementEvent(this, name, {
|
26326 | side: this
|
26327 | });
|
26328 | }
|
26329 |
|
26330 | var isCanceled = false;
|
26331 | util$4.triggerElementEvent(this, name, {
|
26332 | side: this,
|
26333 | cancel: function cancel() {
|
26334 | return isCanceled = true;
|
26335 | }
|
26336 | });
|
26337 | return isCanceled;
|
26338 | }
|
26339 | }, {
|
26340 | key: "_isOtherSideOpen",
|
26341 | value: function _isOtherSideOpen() {
|
26342 | var _this3 = this;
|
26343 |
|
26344 | return !!util$4.findChild(this.parentElement, function (el) {
|
26345 | return el instanceof _this3.constructor && el !== _this3 && el._mode === COLLAPSE_MODE && el.isOpen;
|
26346 | });
|
26347 | }
|
26348 | }, {
|
26349 | key: "_updateCollapse",
|
26350 | value: function _updateCollapse() {
|
26351 | var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getAttribute('collapse');
|
26352 |
|
26353 | if (value === null || value === 'split') {
|
26354 | this._collapseDetection.disable();
|
26355 |
|
26356 | return this._updateMode(SPLIT_MODE);
|
26357 | }
|
26358 |
|
26359 | if (value === '' || value === 'collapse') {
|
26360 | this._collapseDetection.disable();
|
26361 |
|
26362 | return this._updateMode(COLLAPSE_MODE);
|
26363 | }
|
26364 |
|
26365 | this._collapseDetection.changeTarget(value);
|
26366 | }
|
26367 | }, {
|
26368 | key: "_updateMode",
|
26369 | value: function _updateMode(mode) {
|
26370 | if (mode !== this._mode) {
|
26371 | this._mode = mode;
|
26372 | this.setAttribute('mode', mode); // readonly attribute for the users
|
26373 |
|
26374 | if (mode === SPLIT_MODE) {
|
26375 | this._animator && this._animator.deactivate();
|
26376 | this._state = CLOSED_STATE;
|
26377 | } else {
|
26378 | this._animator && this._animator.activate(this);
|
26379 | this._state === OPEN_STATE && this._animator.open();
|
26380 | }
|
26381 |
|
26382 | util$4.triggerElementEvent(this, 'modechange', {
|
26383 | side: this,
|
26384 | mode: mode
|
26385 | });
|
26386 | }
|
26387 | }
|
26388 | }, {
|
26389 | key: "_updateAnimation",
|
26390 | value: function _updateAnimation() {
|
26391 | var animation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getAttribute('animation');
|
26392 |
|
26393 | if (this.parentNode) {
|
26394 | this._animator && this._animator.deactivate();
|
26395 | this._animator = this._animatorFactory.newAnimator({
|
26396 | animation: animation
|
26397 | });
|
26398 |
|
26399 | this._animator.activate(this);
|
26400 |
|
26401 | this._animationOpt = {
|
26402 | timing: this._animator.duration,
|
26403 | duration: this._animator.duration
|
26404 | };
|
26405 |
|
26406 | this._animator.updateOptions(this.animationOptions);
|
26407 | }
|
26408 | }
|
26409 | /**
|
26410 | * @property page
|
26411 | * @type {*}
|
26412 | * @description
|
26413 | * [en]Page location to load in the splitter side.[/en]
|
26414 | * [ja]この要素内に表示するページを指定します。[/ja]
|
26415 | */
|
26416 |
|
26417 | }, {
|
26418 | key: "page",
|
26419 | get: function get() {
|
26420 | return this._page;
|
26421 | }
|
26422 | /**
|
26423 | * @param {*} page
|
26424 | */
|
26425 | ,
|
26426 | set: function set(page) {
|
26427 | this._page = page;
|
26428 | }
|
26429 | }, {
|
26430 | key: "_content",
|
26431 | get: function get() {
|
26432 | return this.children[0];
|
26433 | }
|
26434 | /**
|
26435 | * @property pageLoader
|
26436 | * @description
|
26437 | * [en][/en]
|
26438 | * [ja][/ja]
|
26439 | */
|
26440 |
|
26441 | }, {
|
26442 | key: "pageLoader",
|
26443 | get: function get() {
|
26444 | return this._pageLoader;
|
26445 | },
|
26446 | set: function set(loader) {
|
26447 | if (!(loader instanceof PageLoader)) {
|
26448 | util$4.throwPageLoader();
|
26449 | }
|
26450 |
|
26451 | this._pageLoader = loader;
|
26452 | }
|
26453 | /**
|
26454 | * @property mode
|
26455 | * @readonly
|
26456 | * @type {String}
|
26457 | * @description
|
26458 | * [en]Current mode. Possible values are "split", "collapse", "closed", "open" or "changing".[/en]
|
26459 | * [ja][/ja]
|
26460 | */
|
26461 |
|
26462 | }, {
|
26463 | key: "mode",
|
26464 | get: function get() {
|
26465 | return this._mode;
|
26466 | }
|
26467 | /**
|
26468 | * @property onSwipe
|
26469 | * @type {Function}
|
26470 | * @description
|
26471 | * [en]Hook called whenever the user slides the splitter. It gets a decimal ratio (0-1) and an animationOptions object as arguments.[/en]
|
26472 | * [ja][/ja]
|
26473 | */
|
26474 |
|
26475 | }, {
|
26476 | key: "onSwipe",
|
26477 | get: function get() {
|
26478 | return this._onSwipe;
|
26479 | },
|
26480 | set: function set(value) {
|
26481 | if (value && !(value instanceof Function)) {
|
26482 | util$4.throw('"onSwipe" must be a function');
|
26483 | }
|
26484 |
|
26485 | this._onSwipe = value;
|
26486 | }
|
26487 | }, {
|
26488 | key: "animationOptions",
|
26489 | get: function get() {
|
26490 | return this.hasAttribute('animation-options') ? AnimatorFactory.parseAnimationOptionsString(this.getAttribute('animation-options')) : {};
|
26491 | },
|
26492 | set: function set(value) {
|
26493 | if (value === undefined || value === null) {
|
26494 | this.removeAttribute('animation-options');
|
26495 | } else {
|
26496 | this.setAttribute('animation-options', JSON.stringify(value));
|
26497 | }
|
26498 | }
|
26499 | /**
|
26500 | * @property isOpen
|
26501 | * @type {Boolean}
|
26502 | * @description
|
26503 | * [en]Specifies whether the menu is opened.[/en]
|
26504 | * [ja][/ja]
|
26505 | */
|
26506 |
|
26507 | }, {
|
26508 | key: "isOpen",
|
26509 | get: function get() {
|
26510 | return this._mode === COLLAPSE_MODE && this._state !== CLOSED_STATE;
|
26511 | },
|
26512 | set: function set(value) {
|
26513 | this.toggle({}, value);
|
26514 | }
|
26515 | /**
|
26516 | * @method open
|
26517 | * @signature open([options])
|
26518 | * @param {Object} [options]
|
26519 | * [en]Parameter object.[/en]
|
26520 | * [ja]オプションを指定するオブジェクト。[/ja]
|
26521 | * @param {Function} [options.callback]
|
26522 | * [en]This function will be called after the menu has been opened.[/en]
|
26523 | * [ja]メニューが開いた後に呼び出される関数オブジェクトを指定します。[/ja]
|
26524 | * @description
|
26525 | * [en]Open menu in collapse mode.[/en]
|
26526 | * [ja]collapseモードになっているons-splitter-side要素を開きます。[/ja]
|
26527 | * @return {Promise}
|
26528 | * [en]Resolves to the splitter side element or false if not in collapse mode[/en]
|
26529 | * [ja][/ja]
|
26530 | */
|
26531 |
|
26532 | }, {
|
26533 | key: "open",
|
26534 | value: function open(options) {
|
26535 | return this.toggle(options, true);
|
26536 | }
|
26537 | /**
|
26538 | * @method close
|
26539 | * @signature close([options])
|
26540 | * @param {Object} [options]
|
26541 | * [en]Parameter object.[/en]
|
26542 | * [ja]オプションを指定するオブジェクト。[/ja]
|
26543 | * @param {Function} [options.callback]
|
26544 | * [en]This function will be called after the menu has been closed.[/en]
|
26545 | * [ja]メニューが閉じた後に呼び出される関数オブジェクトを指定します。[/ja]
|
26546 | * @description
|
26547 | * [en]Close menu in collapse mode.[/en]
|
26548 | * [ja]collapseモードになっているons-splitter-side要素を閉じます。[/ja]
|
26549 | * @return {Promise}
|
26550 | * [en]Resolves to the splitter side element or false if not in collapse mode[/en]
|
26551 | * [ja][/ja]
|
26552 | */
|
26553 |
|
26554 | }, {
|
26555 | key: "close",
|
26556 | value: function close(options) {
|
26557 | return this.toggle(options, false);
|
26558 | }
|
26559 | /**
|
26560 | * @method toggle
|
26561 | * @signature toggle([options])
|
26562 | * @param {Object} [options]
|
26563 | * @description
|
26564 | * [en]Opens if it's closed. Closes if it's open.[/en]
|
26565 | * [ja]開けている場合は要素を閉じますそして開けている場合は要素を開きます。[/ja]
|
26566 | * @return {Promise}
|
26567 | * [en]Resolves to the splitter side element or false if not in collapse mode[/en]
|
26568 | * [ja][/ja]
|
26569 | */
|
26570 |
|
26571 | }, {
|
26572 | key: "toggle",
|
26573 | value: function toggle() {
|
26574 | var _this4 = this;
|
26575 |
|
26576 | var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
26577 | var force = arguments.length > 1 ? arguments[1] : undefined;
|
26578 | var shouldOpen = typeof force === 'boolean' ? force : !this.isOpen;
|
26579 | var action = shouldOpen ? 'open' : 'close';
|
26580 | var FINAL_STATE = shouldOpen ? OPEN_STATE : CLOSED_STATE;
|
26581 |
|
26582 | if (this._mode === SPLIT_MODE) {
|
26583 | return Promise.resolve(false);
|
26584 | }
|
26585 |
|
26586 | if (this._state === FINAL_STATE) {
|
26587 | return Promise.resolve(this);
|
26588 | }
|
26589 |
|
26590 | if (this._lock.isLocked()) {
|
26591 | return Promise.reject('Another splitter-side action is already running.');
|
26592 | }
|
26593 |
|
26594 | if (shouldOpen && this._isOtherSideOpen()) {
|
26595 | return Promise.reject('Another menu is already open.');
|
26596 | }
|
26597 |
|
26598 | if (this._emitEvent("pre".concat(action))) {
|
26599 | return Promise.reject("Canceled in pre".concat(action, " event."));
|
26600 | }
|
26601 |
|
26602 | var unlock = this._lock.lock();
|
26603 |
|
26604 | this._state = CHANGING_STATE;
|
26605 |
|
26606 | if (options.animation) {
|
26607 | this._updateAnimation(options.animation);
|
26608 | }
|
26609 |
|
26610 | return new Promise(function (resolve) {
|
26611 | _this4._animator[action](function () {
|
26612 | util$4.iosPageScrollFix(shouldOpen);
|
26613 | _this4._state = FINAL_STATE;
|
26614 | unlock();
|
26615 |
|
26616 | _this4._emitEvent("post".concat(action));
|
26617 |
|
26618 | options.callback instanceof Function && options.callback(_this4);
|
26619 | resolve(_this4);
|
26620 | });
|
26621 | });
|
26622 | }
|
26623 | /**
|
26624 | * @method load
|
26625 | * @signature load(page, [options])
|
26626 | * @param {String} page
|
26627 | * [en]Page URL. Can be either an HTML document or a `<template>`.[/en]
|
26628 | * [ja]pageのURLか、`<template>`で宣言したテンプレートのid属性の値を指定します。[/ja]
|
26629 | * @param {Object} [options]
|
26630 | * @param {Function} [options.callback]
|
26631 | * @description
|
26632 | * [en]Show the page specified in pageUrl in the right section[/en]
|
26633 | * [ja]指定したURLをメインページを読み込みます。[/ja]
|
26634 | * @return {Promise}
|
26635 | * [en]Resolves to the new page element[/en]
|
26636 | * [ja][/ja]
|
26637 | */
|
26638 |
|
26639 | }, {
|
26640 | key: "load",
|
26641 | value: function load(page) {
|
26642 | var _this5 = this;
|
26643 |
|
26644 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
26645 | this._page = page;
|
26646 |
|
26647 | var callback = options.callback || function () {};
|
26648 |
|
26649 | return new Promise(function (resolve) {
|
26650 | var oldContent = _this5._content || null;
|
26651 |
|
26652 | _this5._pageLoader.load({
|
26653 | page: page,
|
26654 | parent: _this5
|
26655 | }, function (pageElement) {
|
26656 | if (oldContent) {
|
26657 | _this5._pageLoader.unload(oldContent);
|
26658 |
|
26659 | oldContent = null;
|
26660 | }
|
26661 |
|
26662 | setImmediate(function () {
|
26663 | return _this5._show();
|
26664 | });
|
26665 | callback(pageElement);
|
26666 | resolve(pageElement);
|
26667 | });
|
26668 | });
|
26669 | }
|
26670 | }, {
|
26671 | key: "_show",
|
26672 | value: function _show() {
|
26673 | if (this._content) {
|
26674 | this._content._show();
|
26675 | }
|
26676 | }
|
26677 | }, {
|
26678 | key: "_hide",
|
26679 | value: function _hide() {
|
26680 | if (this._content) {
|
26681 | this._content._hide();
|
26682 | }
|
26683 | }
|
26684 | }, {
|
26685 | key: "_destroy",
|
26686 | value: function _destroy() {
|
26687 | if (this._content) {
|
26688 | this._pageLoader.unload(this._content);
|
26689 | }
|
26690 |
|
26691 | this.remove();
|
26692 | }
|
26693 | }], [{
|
26694 | key: "observedAttributes",
|
26695 | get: function get() {
|
26696 | return ['animation', 'width', 'collapse', 'swipeable', 'animation-options'];
|
26697 | }
|
26698 | }, {
|
26699 | key: "events",
|
26700 | get: function get() {
|
26701 | return ['preopen', 'postopen', 'preclose', 'postclose', 'modechange', 'swipe'];
|
26702 | }
|
26703 | }, {
|
26704 | key: "rewritables",
|
26705 | get: function get() {
|
26706 | return rewritables$1;
|
26707 | }
|
26708 | }]);
|
26709 |
|
26710 | return SplitterSideElement;
|
26711 | }(BaseElement);
|
26712 | util$4.defineBooleanProperties(SplitterSideElement, ['swipeable']);
|
26713 | onsElements.SplitterSide = SplitterSideElement;
|
26714 | customElements.define('ons-splitter-side', SplitterSideElement);
|
26715 |
|
26716 | var scheme$3 = {
|
26717 | '': 'switch--*',
|
26718 | '.switch__input': 'switch--*__input',
|
26719 | '.switch__handle': 'switch--*__handle',
|
26720 | '.switch__toggle': 'switch--*__toggle'
|
26721 | };
|
26722 | var locations = {
|
26723 | ios: [1, 21],
|
26724 | material: [0, 16]
|
26725 | };
|
26726 | /**
|
26727 | * @element ons-switch
|
26728 | * @category form
|
26729 | * @description
|
26730 | * [en]
|
26731 | * Switch component. The switch can be toggled both by dragging and tapping.
|
26732 | *
|
26733 | * Will automatically displays a Material Design switch on Android devices.
|
26734 | * [/en]
|
26735 | * [ja]スイッチを表示するコンポーネントです。[/ja]
|
26736 | * @modifier material
|
26737 | * [en]Material Design switch[/en]
|
26738 | * [ja][/ja]
|
26739 | * @codepen LpXZQQ
|
26740 | * @tutorial vanilla/Reference/switch
|
26741 | * @guide theming.html#modifiers [en]More details about the `modifier` attribute[/en][ja]modifier属性の使い方[/ja]
|
26742 | * @example
|
26743 | * <ons-switch checked></ons-switch>
|
26744 | * <ons-switch disabled></ons-switch>
|
26745 | * <ons-switch modifier="material"></ons-switch>
|
26746 | */
|
26747 |
|
26748 | var SwitchElement = /*#__PURE__*/function (_BaseCheckboxElement) {
|
26749 | _inherits(SwitchElement, _BaseCheckboxElement);
|
26750 |
|
26751 | var _super = _createSuper(SwitchElement);
|
26752 |
|
26753 | function SwitchElement() {
|
26754 | var _this;
|
26755 |
|
26756 | _classCallCheck(this, SwitchElement);
|
26757 |
|
26758 | _this = _super.call(this);
|
26759 | contentReady(_assertThisInitialized(_this), function () {
|
26760 | _this.attributeChangedCallback('modifier', null, _this.getAttribute('modifier'));
|
26761 | });
|
26762 | _this._onChange = _this._onChange.bind(_assertThisInitialized(_this));
|
26763 | _this._onRelease = _this._onRelease.bind(_assertThisInitialized(_this));
|
26764 | _this._lastTimeStamp = 0;
|
26765 | return _this;
|
26766 | }
|
26767 |
|
26768 | _createClass(SwitchElement, [{
|
26769 | key: "_scheme",
|
26770 | get: function get() {
|
26771 | return scheme$3;
|
26772 | }
|
26773 | }, {
|
26774 | key: "_defaultClassName",
|
26775 | get: function get() {
|
26776 | return 'switch';
|
26777 | }
|
26778 | }, {
|
26779 | key: "_template",
|
26780 | get: function get() {
|
26781 | return "\n <input type=\"".concat(this.type, "\" class=\"").concat(this._defaultClassName, "__input\">\n <div class=\"").concat(this._defaultClassName, "__toggle\">\n <div class=\"").concat(this._defaultClassName, "__handle\">\n <div class=\"").concat(this._defaultClassName, "__touch\"></div>\n </div>\n </div>\n ");
|
26782 | }
|
26783 | }, {
|
26784 | key: "type",
|
26785 | get: function get() {
|
26786 | return 'checkbox';
|
26787 | }
|
26788 | /* Own props */
|
26789 |
|
26790 | }, {
|
26791 | key: "_getPosition",
|
26792 | value: function _getPosition(e) {
|
26793 | var l = this._locations;
|
26794 | return Math.min(l[1], Math.max(l[0], this._startX + e.gesture.deltaX));
|
26795 | }
|
26796 | }, {
|
26797 | key: "_emitChangeEvent",
|
26798 | value: function _emitChangeEvent() {
|
26799 | util$4.triggerElementEvent(this, 'change', {
|
26800 | value: this.checked,
|
26801 | switch: this,
|
26802 | isInteractive: true
|
26803 | });
|
26804 | }
|
26805 | }, {
|
26806 | key: "_onChange",
|
26807 | value: function _onChange(event) {
|
26808 | if (event && event.stopPropagation) {
|
26809 | event.stopPropagation();
|
26810 | }
|
26811 |
|
26812 | this._emitChangeEvent();
|
26813 | }
|
26814 | }, {
|
26815 | key: "_onClick",
|
26816 | value: function _onClick(ev) {
|
26817 | if (ev.target.classList.contains("".concat(this.defaultElementClass, "__touch")) || ev.timeStamp - this._lastTimeStamp < 50 // Prevent second click triggered by <label>
|
26818 | ) {
|
26819 | ev.preventDefault();
|
26820 | }
|
26821 |
|
26822 | this._lastTimeStamp = ev.timeStamp;
|
26823 | }
|
26824 | }, {
|
26825 | key: "_onHold",
|
26826 | value: function _onHold(e) {
|
26827 | if (!this.disabled) {
|
26828 | ModifierUtil.addModifier(this, 'active');
|
26829 | document.addEventListener('release', this._onRelease);
|
26830 | }
|
26831 | }
|
26832 | }, {
|
26833 | key: "_onDragStart",
|
26834 | value: function _onDragStart(e) {
|
26835 | if (this.disabled || ['left', 'right'].indexOf(e.gesture.direction) === -1) {
|
26836 | ModifierUtil.removeModifier(this, 'active');
|
26837 | return;
|
26838 | }
|
26839 |
|
26840 | e.consumed = true;
|
26841 | ModifierUtil.addModifier(this, 'active');
|
26842 | this._startX = this._locations[this.checked ? 1 : 0]; // - e.gesture.deltaX;
|
26843 |
|
26844 | this.addEventListener('drag', this._onDrag);
|
26845 | document.addEventListener('release', this._onRelease);
|
26846 | }
|
26847 | }, {
|
26848 | key: "_onDrag",
|
26849 | value: function _onDrag(e) {
|
26850 | e.stopPropagation();
|
26851 | this._handle.style.left = this._getPosition(e) + 'px';
|
26852 | }
|
26853 | }, {
|
26854 | key: "_onRelease",
|
26855 | value: function _onRelease(e) {
|
26856 | var l = this._locations;
|
26857 |
|
26858 | var position = this._getPosition(e);
|
26859 |
|
26860 | var previousValue = this.checked;
|
26861 | this.checked = position >= (l[0] + l[1]) / 2;
|
26862 |
|
26863 | if (this.checked !== previousValue) {
|
26864 | this._emitChangeEvent();
|
26865 | }
|
26866 |
|
26867 | this.removeEventListener('drag', this._onDrag);
|
26868 | document.removeEventListener('release', this._onRelease);
|
26869 | this._handle.style.left = '';
|
26870 | ModifierUtil.removeModifier(this, 'active');
|
26871 | }
|
26872 | }, {
|
26873 | key: "click",
|
26874 | value: function click() {
|
26875 | var ev = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
26876 |
|
26877 | if (!this.disabled) {
|
26878 | this.checked = !this.checked;
|
26879 |
|
26880 | this._emitChangeEvent();
|
26881 |
|
26882 | this._lastTimeStamp = ev.timeStamp || 0;
|
26883 | }
|
26884 | }
|
26885 | }, {
|
26886 | key: "_handle",
|
26887 | get: function get() {
|
26888 | return this.querySelector(".".concat(this._defaultClassName, "__handle"));
|
26889 | }
|
26890 | }, {
|
26891 | key: "checkbox",
|
26892 | get: function get() {
|
26893 | return this._input;
|
26894 | }
|
26895 | }, {
|
26896 | key: "connectedCallback",
|
26897 | value: function connectedCallback() {
|
26898 | var _this2 = this;
|
26899 |
|
26900 | contentReady(this, function () {
|
26901 | _this2._input.addEventListener('change', _this2._onChange);
|
26902 | });
|
26903 | this.addEventListener('dragstart', this._onDragStart);
|
26904 | this.addEventListener('hold', this._onHold);
|
26905 | this.addEventListener('tap', this.click);
|
26906 | this.addEventListener('click', this._onClick);
|
26907 | this._gestureDetector = new GestureDetector(this, {
|
26908 | dragMinDistance: 1,
|
26909 | holdTimeout: 251,
|
26910 | passive: true
|
26911 | });
|
26912 | }
|
26913 | }, {
|
26914 | key: "disconnectedCallback",
|
26915 | value: function disconnectedCallback() {
|
26916 | var _this3 = this;
|
26917 |
|
26918 | contentReady(this, function () {
|
26919 | _this3._input.removeEventListener('change', _this3._onChange);
|
26920 | });
|
26921 | this.removeEventListener('dragstart', this._onDragStart);
|
26922 | this.removeEventListener('hold', this._onHold);
|
26923 | this.removeEventListener('tap', this.click);
|
26924 | this.removeEventListener('click', this._onClick);
|
26925 |
|
26926 | if (this._gestureDetector) {
|
26927 | this._gestureDetector.dispose();
|
26928 | }
|
26929 | }
|
26930 | }, {
|
26931 | key: "attributeChangedCallback",
|
26932 | value: function attributeChangedCallback(name, last, current) {
|
26933 | if (name === 'modifier') {
|
26934 | var md = (current || '').indexOf('material') !== -1;
|
26935 | this._locations = locations[md ? 'material' : 'ios'];
|
26936 | }
|
26937 |
|
26938 | _get(_getPrototypeOf(SwitchElement.prototype), "attributeChangedCallback", this).call(this, name, last, current);
|
26939 | }
|
26940 | /**
|
26941 | * @event change
|
26942 | * @description
|
26943 | * [en]Fired when the switch is toggled.[/en]
|
26944 | * [ja]ON/OFFが変わった時に発火します。[/ja]
|
26945 | * @param {Object} event
|
26946 | * [en]Event object.[/en]
|
26947 | * [ja]イベントオブジェクト。[/ja]
|
26948 | * @param {Object} event.switch
|
26949 | * [en]Switch object.[/en]
|
26950 | * [ja]イベントが発火したSwitchオブジェクトを返します。[/ja]
|
26951 | * @param {Boolean} event.value
|
26952 | * [en]Current value.[/en]
|
26953 | * [ja]現在の値を返します。[/ja]
|
26954 | * @param {Boolean} event.isInteractive
|
26955 | * [en]True if the change was triggered by the user clicking on the switch.[/en]
|
26956 | * [ja]タップやクリックなどのユーザの操作によって変わった場合にはtrueを返します。[/ja]
|
26957 | */
|
26958 |
|
26959 | /**
|
26960 | * @attribute modifier
|
26961 | * @type {String}
|
26962 | * @description
|
26963 | * [en]The appearance of the switch.[/en]
|
26964 | * [ja]スイッチの表現を指定します。[/ja]
|
26965 | */
|
26966 |
|
26967 | /**
|
26968 | * @attribute disabled
|
26969 | * @description
|
26970 | * [en]Whether the switch is be disabled.[/en]
|
26971 | * [ja]スイッチを無効の状態にする場合に指定します。[/ja]
|
26972 | */
|
26973 |
|
26974 | /**
|
26975 | * @attribute checked
|
26976 | * @description
|
26977 | * [en]Whether the switch is checked.[/en]
|
26978 | * [ja]スイッチがONの状態にするときに指定します。[/ja]
|
26979 | */
|
26980 |
|
26981 | /**
|
26982 | * @attribute input-id
|
26983 | * @type {String}
|
26984 | * @description
|
26985 | * [en]Specify the `id` attribute of the inner `<input>` element. This is useful when using `<label for="...">` elements.[/en]
|
26986 | * [ja][/ja]
|
26987 | */
|
26988 |
|
26989 | /**
|
26990 | * @property checked
|
26991 | * @type {Boolean}
|
26992 | * @description
|
26993 | * [en]This value is `true` if the switch is checked.[/en]
|
26994 | * [ja]スイッチがONの場合に`true`。[/ja]
|
26995 | */
|
26996 |
|
26997 | /**
|
26998 | * @property value
|
26999 | * @type {String}
|
27000 | * @description
|
27001 | * [en]The current value of the input.[/en]
|
27002 | * [ja][/ja]
|
27003 | */
|
27004 |
|
27005 | /**
|
27006 | * @property disabled
|
27007 | * @type {Boolean}
|
27008 | * @description
|
27009 | * [en]Whether the element is disabled or not.[/en]
|
27010 | * [ja]無効化されている場合に`true`。[/ja]
|
27011 | */
|
27012 |
|
27013 | /**
|
27014 | * @property checkbox
|
27015 | * @readonly
|
27016 | * @type {HTMLElement}
|
27017 | * @description
|
27018 | * [en]The underlying checkbox element.[/en]
|
27019 | * [ja]コンポーネント内部のcheckbox要素になります。[/ja]
|
27020 | */
|
27021 |
|
27022 | /**
|
27023 | * @method focus
|
27024 | * @signature focus()
|
27025 | * @description
|
27026 | * [en]Focuses the switch.[/en]
|
27027 | * [ja][/ja]
|
27028 | */
|
27029 |
|
27030 | /**
|
27031 | * @method blur
|
27032 | * @signature blur()
|
27033 | * @description
|
27034 | * [en]Removes focus from the switch.[/en]
|
27035 | * [ja][/ja]
|
27036 | */
|
27037 |
|
27038 | }], [{
|
27039 | key: "observedAttributes",
|
27040 | get: function get() {
|
27041 | return [].concat(_toConsumableArray(_get(_getPrototypeOf(SwitchElement), "observedAttributes", this)), ['modifier']);
|
27042 | }
|
27043 | }]);
|
27044 |
|
27045 | return SwitchElement;
|
27046 | }(BaseCheckboxElement);
|
27047 | onsElements.Switch = SwitchElement;
|
27048 | customElements.define('ons-switch', SwitchElement);
|
27049 |
|
27050 | var scheme$2 = {
|
27051 | '.tabbar__content': 'tabbar--*__content',
|
27052 | '.tabbar__border': 'tabbar--*__border',
|
27053 | '.tabbar': 'tabbar--*'
|
27054 | };
|
27055 | var rewritables = {
|
27056 | /**
|
27057 | * @param {Element} tabbarElement
|
27058 | * @param {Function} callback
|
27059 | */
|
27060 | ready: function ready(tabbarElement, callback) {
|
27061 | callback();
|
27062 | }
|
27063 | };
|
27064 | internal$1.nullElement;
|
27065 |
|
27066 | var lerp = function lerp(x0, x1, t) {
|
27067 | return (1 - t) * x0 + t * x1;
|
27068 | };
|
27069 | /**
|
27070 | * @element ons-tabbar
|
27071 | * @category tabbar
|
27072 | * @description
|
27073 | * [en]A component to display a tab bar on the bottom of a page. Used with `<ons-tab>` to manage pages using tabs.[/en]
|
27074 | * [ja]タブバーをページ下部に表示するためのコンポーネントです。ons-tabと組み合わせて使うことで、ページを管理できます。[/ja]
|
27075 | * @codepen pGuDL
|
27076 | * @tutorial vanilla/Reference/tabbar
|
27077 | * @modifier material
|
27078 | * [en]A tabbar in Material Design.[/en]
|
27079 | * [ja][/ja]
|
27080 | * @modifier autogrow
|
27081 | * [en]Tabs automatically grow depending on their content instead of having a fixed width.[/en]
|
27082 | * [ja][/ja]
|
27083 | * @modifier top-border
|
27084 | * [en]Shows a static border-bottom in tabs for iOS top tabbars.[/en]
|
27085 | * [ja][/ja]
|
27086 | * @guide fundamentals.html#managing-pages
|
27087 | * [en]Managing multiple pages.[/en]
|
27088 | * [ja]複数のページを管理する[/ja]
|
27089 | * @seealso ons-tab
|
27090 | * [en]The `<ons-tab>` component.[/en]
|
27091 | * [ja]ons-tabコンポーネント[/ja]
|
27092 | * @seealso ons-page
|
27093 | * [en]The `<ons-page>` component.[/en]
|
27094 | * [ja]ons-pageコンポーネント[/ja]
|
27095 | * @example
|
27096 | * <ons-tabbar>
|
27097 | * <ons-tab
|
27098 | * page="home.html"
|
27099 | * label="Home"
|
27100 | * active>
|
27101 | * </ons-tab>
|
27102 | * <ons-tab
|
27103 | * page="settings.html"
|
27104 | * label="Settings"
|
27105 | * active>
|
27106 | * </ons-tab>
|
27107 | * </ons-tabbar>
|
27108 | *
|
27109 | * <template id="home.html">
|
27110 | * ...
|
27111 | * </template>
|
27112 | *
|
27113 | * <template id="settings.html">
|
27114 | * ...
|
27115 | * </template>
|
27116 | */
|
27117 |
|
27118 |
|
27119 | var TabbarElement = /*#__PURE__*/function (_BaseElement) {
|
27120 | _inherits(TabbarElement, _BaseElement);
|
27121 |
|
27122 | var _super = _createSuper(TabbarElement);
|
27123 |
|
27124 | /**
|
27125 | * @event prechange
|
27126 | * @description
|
27127 | * [en]Fires just before the tab is changed.[/en]
|
27128 | * [ja]アクティブなタブが変わる前に発火します。[/ja]
|
27129 | * @param {Object} event
|
27130 | * [en]Event object.[/en]
|
27131 | * [ja]イベントオブジェクト。[/ja]
|
27132 | * @param {Number} event.index
|
27133 | * [en]Current index.[/en]
|
27134 | * [ja]現在アクティブになっているons-tabのインデックスを返します。[/ja]
|
27135 | * @param {Object} event.tabItem
|
27136 | * [en]Tab item object.[/en]
|
27137 | * [ja]tabItemオブジェクト。[/ja]
|
27138 | * @param {Function} event.cancel
|
27139 | * [en]Call this function to cancel the change event.[/en]
|
27140 | * [ja]この関数を呼び出すと、アクティブなタブの変更がキャンセルされます。[/ja]
|
27141 | */
|
27142 |
|
27143 | /**
|
27144 | * @event postchange
|
27145 | * @description
|
27146 | * [en]Fires just after the tab is changed.[/en]
|
27147 | * [ja]アクティブなタブが変わった後に発火します。[/ja]
|
27148 | * @param {Object} event
|
27149 | * [en]Event object.[/en]
|
27150 | * [ja]イベントオブジェクト。[/ja]
|
27151 | * @param {Number} event.index
|
27152 | * [en]Current index.[/en]
|
27153 | * [ja]現在アクティブになっているons-tabのインデックスを返します。[/ja]
|
27154 | * @param {Object} event.tabItem
|
27155 | * [en]Tab item object.[/en]
|
27156 | * [ja]tabItemオブジェクト。[/ja]
|
27157 | */
|
27158 |
|
27159 | /**
|
27160 | * @event reactive
|
27161 | * @description
|
27162 | * [en]Fires if the already open tab is tapped again.[/en]
|
27163 | * [ja]すでにアクティブになっているタブがもう一度タップやクリックされた場合に発火します。[/ja]
|
27164 | * @param {Object} event
|
27165 | * [en]Event object.[/en]
|
27166 | * [ja]イベントオブジェクト。[/ja]
|
27167 | * @param {Number} event.index
|
27168 | * [en]Current index.[/en]
|
27169 | * [ja]現在アクティブになっているons-tabのインデックスを返します。[/ja]
|
27170 | * @param {Object} event.tabItem
|
27171 | * [en]Tab item object.[/en]
|
27172 | * [ja]tabItemオブジェクト。[/ja]
|
27173 | */
|
27174 |
|
27175 | /**
|
27176 | * @event swipe
|
27177 | * @description
|
27178 | * [en]Fires when the tabbar swipes.[/en]
|
27179 | * [ja][/ja]
|
27180 | * @param {Object} event
|
27181 | * [en]Event object.[/en]
|
27182 | * [ja]イベントオブジェクト。[/ja]
|
27183 | * @param {Number} event.index
|
27184 | * [en]Current index.[/en]
|
27185 | * [ja]現在アクティブになっているons-tabのインデックスを返します。[/ja]
|
27186 | * @param {Object} event.options
|
27187 | * [en]Animation options object.[/en]
|
27188 | * [ja][/ja]
|
27189 | */
|
27190 |
|
27191 | /**
|
27192 | * @attribute animation
|
27193 | * @type {String}
|
27194 | * @default none
|
27195 | * @description
|
27196 | * [en]If this attribute is set to `"none"` the transitions will not be animated.[/en]
|
27197 | * [ja][/ja]
|
27198 | */
|
27199 |
|
27200 | /**
|
27201 | * @attribute animation-options
|
27202 | * @type {Expression}
|
27203 | * @description
|
27204 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
27205 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. {duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
|
27206 | */
|
27207 |
|
27208 | /**
|
27209 | * @property animationOptions
|
27210 | * @type {Object}
|
27211 | * @description
|
27212 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
27213 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. {duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
|
27214 | */
|
27215 |
|
27216 | /**
|
27217 | * @attribute position
|
27218 | * @initonly
|
27219 | * @type {String}
|
27220 | * @default bottom
|
27221 | * @description
|
27222 | * [en]Tabbar's position. Available values are `"bottom"` and `"top"`. Use `"auto"` to choose position depending on platform (bottom for iOS flat design, top for Material Design).[/en]
|
27223 | * [ja]タブバーの位置を指定します。"bottom"もしくは"top"を選択できます。デフォルトは"bottom"です。[/ja]
|
27224 | */
|
27225 |
|
27226 | /**
|
27227 | * @attribute swipeable
|
27228 | * @description
|
27229 | * [en]If this attribute is set the tab bar can be scrolled by drag or swipe.[/en]
|
27230 | * [ja]この属性がある時、タブバーをスワイプやドラッグで移動できるようになります。[/ja]
|
27231 | */
|
27232 |
|
27233 | /**
|
27234 | * @attribute ignore-edge-width
|
27235 | * @type {Number}
|
27236 | * @default 20
|
27237 | * @description
|
27238 | * [en]Distance in pixels from both edges. Swiping on these areas will prioritize parent components such as `ons-splitter` or `ons-navigator`.[/en]
|
27239 | * [ja][/ja]
|
27240 | */
|
27241 |
|
27242 | /**
|
27243 | * @attribute active-index
|
27244 | * @type {Number}
|
27245 | * @default 0
|
27246 | * @description
|
27247 | * [en]The index of the tab that is currently active.[/en]
|
27248 | * [ja][/ja]
|
27249 | */
|
27250 |
|
27251 | /**
|
27252 | * @property activeIndex
|
27253 | * @type {Number}
|
27254 | * @default 0
|
27255 | * @description
|
27256 | * [en]The index of the tab that is currently active.[/en]
|
27257 | * [ja][/ja]
|
27258 | */
|
27259 |
|
27260 | /**
|
27261 | * @attribute hide-tabs
|
27262 | * @description
|
27263 | * [en]Whether to hide the tabs.[/en]
|
27264 | * [ja]タブを非表示にする場合に指定します。[/ja]
|
27265 | */
|
27266 |
|
27267 | /**
|
27268 | * @property hideTabs
|
27269 | * @description
|
27270 | * [en]Whether to hide the tabs.[/en]
|
27271 | * [ja]タブを非表示にする場合に指定します。[/ja]
|
27272 | */
|
27273 |
|
27274 | /**
|
27275 | * @attribute tab-border
|
27276 | * @description
|
27277 | * [en]If this attribute is set the tabs show a dynamic bottom border. Only works for iOS flat design since the border is always visible in Material Design.[/en]
|
27278 | * [ja][/ja]
|
27279 | */
|
27280 |
|
27281 | /**
|
27282 | * @property tabBorder
|
27283 | * @type {Boolean}
|
27284 | * @description
|
27285 | * [en]If this property is set the tabs show a dynamic bottom border. Only works for iOS flat design since the border is always visible in Material Design.[/en]
|
27286 | * [ja][/ja]
|
27287 | */
|
27288 |
|
27289 | /**
|
27290 | * @attribute modifier
|
27291 | * @type {String}
|
27292 | * @description
|
27293 | * [en]The appearance of the tabbar.[/en]
|
27294 | * [ja]タブバーの表現を指定します。[/ja]
|
27295 | */
|
27296 | function TabbarElement() {
|
27297 | var _this;
|
27298 |
|
27299 | _classCallCheck(this, TabbarElement);
|
27300 |
|
27301 | _this = _super.call(this);
|
27302 | _this._loadInactive = util$4.defer(); // Improves #2324
|
27303 |
|
27304 | contentReady(_assertThisInitialized(_this), function () {
|
27305 | return _this._compile();
|
27306 | });
|
27307 |
|
27308 | var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'swipe'),
|
27309 | onConnected = _util$defineListenerP.onConnected,
|
27310 | onDisconnected = _util$defineListenerP.onDisconnected;
|
27311 |
|
27312 | _this._connectOnSwipe = onConnected;
|
27313 | _this._disconnectOnSwipe = onDisconnected;
|
27314 | return _this;
|
27315 | }
|
27316 |
|
27317 | _createClass(TabbarElement, [{
|
27318 | key: "connectedCallback",
|
27319 | value: function connectedCallback() {
|
27320 | var _this2 = this;
|
27321 |
|
27322 | if (!this._swiper) {
|
27323 | this._swiper = new Swiper({
|
27324 | getElement: function getElement() {
|
27325 | return _this2._contentElement;
|
27326 | },
|
27327 | getInitialIndex: function getInitialIndex() {
|
27328 | return _this2.activeIndex || _this2.getAttribute('activeIndex');
|
27329 | },
|
27330 | getAutoScrollRatio: this._getAutoScrollRatio.bind(this),
|
27331 | getBubbleWidth: function getBubbleWidth() {
|
27332 | return parseInt(_this2.getAttribute('ignore-edge-width') || 25, 10);
|
27333 | },
|
27334 | isAutoScrollable: function isAutoScrollable() {
|
27335 | return true;
|
27336 | },
|
27337 | preChangeHook: this._onPreChange.bind(this),
|
27338 | postChangeHook: this._onPostChange.bind(this),
|
27339 | refreshHook: this._onRefresh.bind(this),
|
27340 | scrollHook: this._onScroll.bind(this)
|
27341 | });
|
27342 | contentReady(this, function () {
|
27343 | _this2._tabbarBorder = util$4.findChild(_this2._tabbarElement, '.tabbar__border');
|
27344 |
|
27345 | _this2._swiper.init({
|
27346 | swipeable: _this2.hasAttribute('swipeable')
|
27347 | });
|
27348 | });
|
27349 | }
|
27350 |
|
27351 | contentReady(this, function () {
|
27352 | _this2._updatePosition();
|
27353 |
|
27354 | _this2._updateVisibility();
|
27355 |
|
27356 | if (!util$4.findParent(_this2, 'ons-page', function (p) {
|
27357 | return p === document.body;
|
27358 | })) {
|
27359 | _this2._show(); // This tabbar is the top component
|
27360 |
|
27361 | }
|
27362 | });
|
27363 |
|
27364 | this._connectOnSwipe();
|
27365 | }
|
27366 | }, {
|
27367 | key: "disconnectedCallback",
|
27368 | value: function disconnectedCallback() {
|
27369 | if (this._swiper && this._swiper.initialized) {
|
27370 | this._swiper.dispose();
|
27371 |
|
27372 | this._swiper = null;
|
27373 | this._tabbarBorder = null;
|
27374 | this._tabsRect = null;
|
27375 | }
|
27376 |
|
27377 | this._disconnectOnSwipe();
|
27378 | }
|
27379 | }, {
|
27380 | key: "_normalizeEvent",
|
27381 | value: function _normalizeEvent(event) {
|
27382 | return _objectSpread2(_objectSpread2({}, event), {}, {
|
27383 | index: event.activeIndex,
|
27384 | tabItem: this.tabs[event.activeIndex]
|
27385 | });
|
27386 | }
|
27387 | }, {
|
27388 | key: "_onPostChange",
|
27389 | value: function _onPostChange(event) {
|
27390 | event = this._normalizeEvent(event);
|
27391 | util$4.triggerElementEvent(this, 'postchange', event);
|
27392 | var page = event.tabItem.pageElement;
|
27393 | page && page._show();
|
27394 | }
|
27395 | }, {
|
27396 | key: "_onPreChange",
|
27397 | value: function _onPreChange(event) {
|
27398 | event = this._normalizeEvent(event);
|
27399 |
|
27400 | event.cancel = function () {
|
27401 | return event.canceled = true;
|
27402 | };
|
27403 |
|
27404 | util$4.triggerElementEvent(this, 'prechange', event);
|
27405 |
|
27406 | if (!event.canceled) {
|
27407 | var _event = event,
|
27408 | activeIndex = _event.activeIndex,
|
27409 | lastActiveIndex = _event.lastActiveIndex;
|
27410 | var tabs = this.tabs;
|
27411 | tabs[activeIndex].setActive(true);
|
27412 |
|
27413 | if (lastActiveIndex >= 0) {
|
27414 | var prevTab = tabs[lastActiveIndex];
|
27415 | prevTab.setActive(false);
|
27416 | prevTab.pageElement && prevTab.pageElement._hide();
|
27417 | }
|
27418 | }
|
27419 |
|
27420 | return event.canceled;
|
27421 | }
|
27422 | }, {
|
27423 | key: "_onScroll",
|
27424 | value: function _onScroll(index) {
|
27425 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
27426 |
|
27427 | if (this._tabbarBorder) {
|
27428 | this._tabbarBorder.style.transition = "all ".concat(options.duration || 0, "s ").concat(options.timing || '');
|
27429 |
|
27430 | if (this._autogrow && this._tabsRect.length > 0) {
|
27431 | var a = Math.floor(index),
|
27432 | b = Math.ceil(index),
|
27433 | r = index % 1;
|
27434 | this._tabbarBorder.style.width = lerp(this._tabsRect[a].width, this._tabsRect[b].width, r) + 'px';
|
27435 | this._tabbarBorder.style.transform = "translate3d(".concat(lerp(this._tabsRect[a].left, this._tabsRect[b].left, r), "px, 0, 0)");
|
27436 | } else {
|
27437 | this._tabbarBorder.style.transform = "translate3d(".concat(index * 100, "%, 0, 0)");
|
27438 | }
|
27439 | }
|
27440 |
|
27441 | util$4.triggerElementEvent(this, 'swipe', {
|
27442 | index: index,
|
27443 | options: options
|
27444 | });
|
27445 | }
|
27446 | }, {
|
27447 | key: "_onRefresh",
|
27448 | value: function _onRefresh() {
|
27449 | this._autogrow = util$4.hasModifier(this, 'autogrow');
|
27450 | this._tabsRect = this.tabs.map(function (tab) {
|
27451 | return tab.getBoundingClientRect();
|
27452 | });
|
27453 |
|
27454 | if (this._tabbarBorder) {
|
27455 | this._tabbarBorder.style.display = this.hasAttribute('tab-border') || util$4.hasModifier(this, 'material') ? 'block' : 'none';
|
27456 | var index = this.getActiveTabIndex();
|
27457 |
|
27458 | if (this._tabsRect.length > 0 && index >= 0) {
|
27459 | this._tabbarBorder.style.width = this._tabsRect[index].width + 'px';
|
27460 | }
|
27461 | }
|
27462 | }
|
27463 | }, {
|
27464 | key: "_getAutoScrollRatio",
|
27465 | value: function _getAutoScrollRatio(matches, velocity, size) {
|
27466 | var ratio = .6; // Base ratio
|
27467 |
|
27468 | var modifier = size / 300 * (matches ? -1 : 1); // Based on screen size
|
27469 |
|
27470 | return Math.min(1, Math.max(0, ratio + velocity * modifier));
|
27471 | }
|
27472 | }, {
|
27473 | key: "_tabbarElement",
|
27474 | get: function get() {
|
27475 | return util$4.findChild(this, '.tabbar');
|
27476 | }
|
27477 | }, {
|
27478 | key: "_contentElement",
|
27479 | get: function get() {
|
27480 | return util$4.findChild(this, '.tabbar__content');
|
27481 | }
|
27482 | }, {
|
27483 | key: "_targetElement",
|
27484 | get: function get() {
|
27485 | var content = this._contentElement;
|
27486 | return content && content.children[0] || null;
|
27487 | }
|
27488 | }, {
|
27489 | key: "_compile",
|
27490 | value: function _compile() {
|
27491 | autoStyle.prepare(this);
|
27492 | var content = this._contentElement || util$4.create('.tabbar__content');
|
27493 | content.classList.add('ons-tabbar__content');
|
27494 | var tabbar = this._tabbarElement || util$4.create('.tabbar');
|
27495 | tabbar.classList.add('ons-tabbar__footer');
|
27496 |
|
27497 | if (!tabbar.parentNode) {
|
27498 | while (this.firstChild) {
|
27499 | tabbar.appendChild(this.firstChild);
|
27500 | }
|
27501 | }
|
27502 |
|
27503 | if (tabbar.children.length > this.activeIndex && !util$4.findChild(tabbar, '[active]')) {
|
27504 | tabbar.children[this.activeIndex].setAttribute('active', '');
|
27505 | }
|
27506 |
|
27507 | this._tabbarBorder = util$4.findChild(tabbar, '.tabbar__border') || util$4.create('.tabbar__border');
|
27508 | tabbar.appendChild(this._tabbarBorder);
|
27509 | tabbar.classList.add('ons-swiper-tabbar'); // Hides material border
|
27510 |
|
27511 | !content.children[0] && content.appendChild(document.createElement('div'));
|
27512 | !content.children[1] && content.appendChild(document.createElement('div'));
|
27513 | content.appendChild = content.appendChild.bind(content.children[0]);
|
27514 | content.insertBefore = content.insertBefore.bind(content.children[0]);
|
27515 | this.appendChild(content);
|
27516 | this.appendChild(tabbar); // Triggers ons-tab connectedCallback
|
27517 |
|
27518 | ModifierUtil.initModifier(this, scheme$2);
|
27519 | }
|
27520 | }, {
|
27521 | key: "_updatePosition",
|
27522 | value: function _updatePosition() {
|
27523 | var _this3 = this;
|
27524 |
|
27525 | var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getAttribute('position');
|
27526 | var top = this._top = position === 'top' || position === 'auto' && util$4.hasModifier(this, 'material');
|
27527 | var action = top ? util$4.addModifier : util$4.removeModifier;
|
27528 | action(this, 'top');
|
27529 | var page = util$4.findParent(this, 'ons-page');
|
27530 |
|
27531 | if (page) {
|
27532 | contentReady(page, function () {
|
27533 | var p = 0;
|
27534 |
|
27535 | if (page.children[0] && util$4.match(page.children[0], 'ons-toolbar')) {
|
27536 | action(page.children[0], 'noshadow');
|
27537 | p = 1; // Visual fix for some devices
|
27538 | }
|
27539 |
|
27540 | var content = page._getContentElement();
|
27541 |
|
27542 | var cs = window.getComputedStyle(page._getContentElement(), null);
|
27543 | _this3.style.top = top ? parseInt(cs.getPropertyValue('padding-top'), 10) - p + 'px' : ''; // Refresh content top - Fix for iOS 8
|
27544 |
|
27545 | content.style.top = cs.top;
|
27546 | content.style.top = '';
|
27547 | });
|
27548 | }
|
27549 |
|
27550 | internal$1.autoStatusBarFill(function () {
|
27551 | var filled = util$4.findParent(_this3, function (e) {
|
27552 | return e.hasAttribute('status-bar-fill');
|
27553 | });
|
27554 | util$4.toggleAttribute(_this3, 'status-bar-fill', top && !filled);
|
27555 | });
|
27556 | }
|
27557 | }, {
|
27558 | key: "topPage",
|
27559 | get: function get() {
|
27560 | var tabs = this.tabs,
|
27561 | index = this.getActiveTabIndex();
|
27562 | return tabs[index] ? tabs[index].pageElement || this.pages[0] || null : null;
|
27563 | }
|
27564 | }, {
|
27565 | key: "pages",
|
27566 | get: function get() {
|
27567 | return util$4.arrayFrom(this._targetElement.children);
|
27568 | }
|
27569 | }, {
|
27570 | key: "tabs",
|
27571 | get: function get() {
|
27572 | return Array.prototype.filter.call(this._tabbarElement.children, function (e) {
|
27573 | return e.tagName === 'ONS-TAB';
|
27574 | });
|
27575 | }
|
27576 | /**
|
27577 | * @method setActiveTab
|
27578 | * @signature setActiveTab(index, [options])
|
27579 | * @param {Number} index
|
27580 | * [en]Tab index.[/en]
|
27581 | * [ja]タブのインデックスを指定します。[/ja]
|
27582 | * @param {Object} [options]
|
27583 | * [en]Parameter object.[/en]
|
27584 | * [ja]オプションを指定するオブジェクト。[/ja]
|
27585 | * @param {Function} [options.callback]
|
27586 | * [en]Function that runs when the new page has loaded.[/en]
|
27587 | * [ja][/ja]
|
27588 | * @param {String} [options.animation]
|
27589 | * [en]If this option is "none", the transition won't slide.[/en]
|
27590 | * [ja][/ja]
|
27591 | * @param {String} [options.animationOptions]
|
27592 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
|
27593 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
|
27594 | * @description
|
27595 | * [en]Show specified tab page. Animations and their options can be specified by the second parameter.[/en]
|
27596 | * [ja]指定したインデックスのタブを表示します。アニメーションなどのオプションを指定できます。[/ja]
|
27597 | * @return {Promise}
|
27598 | * [en]A promise that resolves to the new page element.[/en]
|
27599 | * [ja][/ja]
|
27600 | */
|
27601 |
|
27602 | }, {
|
27603 | key: "setActiveTab",
|
27604 | value: function setActiveTab(nextIndex) {
|
27605 | var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
27606 | var previousIndex = this.activeIndex;
|
27607 | this._activeIndexSkipEffect = true;
|
27608 | this.activeIndex = nextIndex;
|
27609 | return this._updateActiveIndex(nextIndex, previousIndex, options);
|
27610 | }
|
27611 | }, {
|
27612 | key: "_updateActiveIndex",
|
27613 | value: function _updateActiveIndex(nextIndex, prevIndex) {
|
27614 | var _this4 = this;
|
27615 |
|
27616 | var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
27617 | var prevTab = this.tabs[prevIndex],
|
27618 | nextTab = this.tabs[nextIndex];
|
27619 |
|
27620 | if (!nextTab) {
|
27621 | return Promise.reject('Specified index does not match any tab.');
|
27622 | }
|
27623 |
|
27624 | if (nextIndex === prevIndex) {
|
27625 | util$4.triggerElementEvent(this, 'reactive', {
|
27626 | index: nextIndex,
|
27627 | activeIndex: nextIndex,
|
27628 | tabItem: nextTab
|
27629 | });
|
27630 | return Promise.resolve(nextTab.pageElement);
|
27631 | } // FIXME: nextTab.loaded is broken in Zone.js promises (Angular2)
|
27632 |
|
27633 |
|
27634 | var nextPage = nextTab.pageElement;
|
27635 | return (nextPage ? Promise.resolve(nextPage) : nextTab.loaded).then(function (nextPage) {
|
27636 | return _this4._swiper.setActiveIndex(nextIndex, _objectSpread2(_objectSpread2({
|
27637 | reject: true
|
27638 | }, options), {}, {
|
27639 | animation: prevTab && nextPage ? options.animation || _this4.getAttribute('animation') : 'none',
|
27640 | animationOptions: util$4.extend({
|
27641 | duration: .3,
|
27642 | timing: 'cubic-bezier(.4, .7, .5, 1)'
|
27643 | }, _this4.animationOptions, options.animationOptions || {})
|
27644 | })).then(function () {
|
27645 | options.callback instanceof Function && options.callback(nextPage);
|
27646 | return nextPage;
|
27647 | });
|
27648 | });
|
27649 | }
|
27650 | /**
|
27651 | * @method setTabbarVisibility
|
27652 | * @signature setTabbarVisibility(visible)
|
27653 | * @param {Boolean} visible
|
27654 | * @description
|
27655 | * [en]Used to hide or show the tab bar.[/en]
|
27656 | * [ja][/ja]
|
27657 | */
|
27658 |
|
27659 | }, {
|
27660 | key: "setTabbarVisibility",
|
27661 | value: function setTabbarVisibility(visible) {
|
27662 | this.hideTabs = !visible;
|
27663 | }
|
27664 | }, {
|
27665 | key: "show",
|
27666 | value: function show() {
|
27667 | this.hideTabs = false;
|
27668 | }
|
27669 | }, {
|
27670 | key: "hide",
|
27671 | value: function hide() {
|
27672 | this.hideTabs = true;
|
27673 | }
|
27674 | }, {
|
27675 | key: "_updateVisibility",
|
27676 | value: function _updateVisibility() {
|
27677 | var _this5 = this;
|
27678 |
|
27679 | contentReady(this, function () {
|
27680 | var visible = !_this5.hideTabs;
|
27681 | _this5._contentElement.style[_this5._top ? 'top' : 'bottom'] = visible ? '' : '0px';
|
27682 | _this5._tabbarElement.style.display = visible ? '' : 'none';
|
27683 | visible && _this5._onRefresh();
|
27684 | });
|
27685 | }
|
27686 | /**
|
27687 | * @property visible
|
27688 | * @readonly
|
27689 | * @type {Boolean}
|
27690 | * @description
|
27691 | * [en]Whether the tabbar is visible or not.[/en]
|
27692 | * [ja]タブバーが見える場合に`true`。[/ja]
|
27693 | */
|
27694 |
|
27695 | }, {
|
27696 | key: "visible",
|
27697 | get: function get() {
|
27698 | return this._tabbarElement.style.display !== 'none';
|
27699 | }
|
27700 | /**
|
27701 | * @property swipeable
|
27702 | * @type {Boolean}
|
27703 | * @description
|
27704 | * [en]Enable swipe interaction.[/en]
|
27705 | * [ja]swipeableであればtrueを返します。[/ja]
|
27706 | */
|
27707 |
|
27708 | /**
|
27709 | * @property onSwipe
|
27710 | * @type {Function}
|
27711 | * @description
|
27712 | * [en]Hook called whenever the user slides the tabbar. It gets a decimal index and an animationOptions object as arguments.[/en]
|
27713 | * [ja][/ja]
|
27714 | */
|
27715 |
|
27716 | /**
|
27717 | * @method getActiveTabIndex
|
27718 | * @signature getActiveTabIndex()
|
27719 | * @return {Number}
|
27720 | * [en]The index of the currently active tab.[/en]
|
27721 | * [ja]現在アクティブになっているタブのインデックスを返します。[/ja]
|
27722 | * @description
|
27723 | * [en]Returns tab index on current active tab. If active tab is not found, returns -1.[/en]
|
27724 | * [ja]現在アクティブになっているタブのインデックスを返します。現在アクティブなタブがない場合には-1を返します。[/ja]
|
27725 | */
|
27726 |
|
27727 | }, {
|
27728 | key: "getActiveTabIndex",
|
27729 | value: function getActiveTabIndex() {
|
27730 | var tabs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.tabs;
|
27731 |
|
27732 | for (var i = 0; i < tabs.length; i++) {
|
27733 | if (tabs[i] && tabs[i].tagName === 'ONS-TAB' && tabs[i].isActive()) {
|
27734 | return i;
|
27735 | }
|
27736 | }
|
27737 |
|
27738 | return -1;
|
27739 | }
|
27740 | }, {
|
27741 | key: "activeIndex",
|
27742 | get: function get() {
|
27743 | return Number(this.getAttribute('active-index'));
|
27744 | },
|
27745 | set: function set(value) {
|
27746 | if (value !== null && value !== undefined) {
|
27747 | this.setAttribute('active-index', value);
|
27748 | }
|
27749 | }
|
27750 | }, {
|
27751 | key: "_show",
|
27752 | value: function _show() {
|
27753 | var _this6 = this;
|
27754 |
|
27755 | this._swiper.show();
|
27756 |
|
27757 | setImmediate(function () {
|
27758 | var tabs = _this6.tabs;
|
27759 |
|
27760 | var activeIndex = _this6.getActiveTabIndex(tabs);
|
27761 |
|
27762 | _this6._loadInactive.resolve();
|
27763 |
|
27764 | if (tabs.length > 0 && activeIndex >= 0) {
|
27765 | tabs[activeIndex].loaded.then(function (el) {
|
27766 | return el && setImmediate(function () {
|
27767 | return el._show();
|
27768 | });
|
27769 | });
|
27770 | }
|
27771 | });
|
27772 | }
|
27773 | }, {
|
27774 | key: "_hide",
|
27775 | value: function _hide() {
|
27776 | this._swiper.hide();
|
27777 |
|
27778 | var topPage = this.topPage;
|
27779 | topPage && topPage._hide();
|
27780 | }
|
27781 | }, {
|
27782 | key: "_destroy",
|
27783 | value: function _destroy() {
|
27784 | this.tabs.forEach(function (tab) {
|
27785 | return tab.remove();
|
27786 | });
|
27787 | this.remove();
|
27788 | }
|
27789 | }, {
|
27790 | key: "attributeChangedCallback",
|
27791 | value: function attributeChangedCallback(name, last, current) {
|
27792 | var _this7 = this;
|
27793 |
|
27794 | if (name === 'modifier') {
|
27795 | ModifierUtil.onModifierChanged(last, current, this, scheme$2);
|
27796 |
|
27797 | var isTop = function isTop(m) {
|
27798 | return /(^|\s+)top($|\s+)/i.test(m);
|
27799 | };
|
27800 |
|
27801 | isTop(last) !== isTop(current) && this._updatePosition();
|
27802 | } else if (name === 'position') {
|
27803 | util$4.isAttached(this) && this._updatePosition();
|
27804 | } else if (name === 'swipeable') {
|
27805 | this._swiper && this._swiper.updateSwipeable(this.hasAttribute('swipeable'));
|
27806 | } else if (name === 'hide-tabs') {
|
27807 | this.isConnected && this._updateVisibility();
|
27808 | } else if (name === 'active-index') {
|
27809 | if (this._activeIndexSkipEffect) {
|
27810 | this._activeIndexSkipEffect = false;
|
27811 | } else if (this.isConnected) {
|
27812 | contentReady(this, function () {
|
27813 | return _this7._updateActiveIndex(current, last);
|
27814 | });
|
27815 | }
|
27816 | }
|
27817 | }
|
27818 | }, {
|
27819 | key: "animationOptions",
|
27820 | get: function get() {
|
27821 | return this.hasAttribute('animation-options') ? util$4.animationOptionsParse(this.getAttribute('animation-options')) : {};
|
27822 | },
|
27823 | set: function set(value) {
|
27824 | if (value === undefined || value === null) {
|
27825 | this.removeAttribute('animation-options');
|
27826 | } else {
|
27827 | this.setAttribute('animation-options', JSON.stringify(value));
|
27828 | }
|
27829 | }
|
27830 | }], [{
|
27831 | key: "observedAttributes",
|
27832 | get: function get() {
|
27833 | return ['modifier', 'position', 'swipeable', 'tab-border', 'hide-tabs', 'active-index'];
|
27834 | }
|
27835 | }, {
|
27836 | key: "rewritables",
|
27837 | get: function get() {
|
27838 | return rewritables;
|
27839 | }
|
27840 | }, {
|
27841 | key: "events",
|
27842 | get: function get() {
|
27843 | return ['prechange', 'postchange', 'reactive', 'swipe'];
|
27844 | }
|
27845 | }]);
|
27846 |
|
27847 | return TabbarElement;
|
27848 | }(BaseElement);
|
27849 | util$4.defineBooleanProperties(TabbarElement, ['hide-tabs', 'swipeable', 'tab-border']);
|
27850 | onsElements.Tabbar = TabbarElement;
|
27851 | customElements.define('ons-tabbar', TabbarElement);
|
27852 |
|
27853 | var defaultClassName$1 = 'tabbar__item';
|
27854 | var scheme$1 = {
|
27855 | '': 'tabbar--*__item',
|
27856 | '.tabbar__button': 'tabbar--*__button'
|
27857 | };
|
27858 | /**
|
27859 | * @element ons-tab
|
27860 | * @category tabbar
|
27861 | * @description
|
27862 | * [en]Represents a tab inside tab bar. Each `<ons-tab>` represents a page.[/en]
|
27863 | * [ja]
|
27864 | * タブバーに配置される各アイテムのコンポーネントです。それぞれのons-tabはページを表します。
|
27865 | * ons-tab要素の中には、タブに表示されるコンテンツを直接記述することが出来ます。
|
27866 | * [/ja]
|
27867 | * @codepen pGuDL
|
27868 | * @tutorial vanilla/Reference/tabbar
|
27869 | * @guide fundamentals.html#managing-pages
|
27870 | * [en]Managing multiple pages.[/en]
|
27871 | * [ja]複数のページを管理する[/ja]]
|
27872 | * @guide appsize.html#removing-icon-packs [en]Removing icon packs.[/en][ja][/ja]
|
27873 | * @guide faq.html#how-can-i-use-custom-icon-packs [en]Adding custom icon packs.[/en][ja][/ja]
|
27874 | * @seealso ons-tabbar
|
27875 | * [en]ons-tabbar component[/en]
|
27876 | * [ja]ons-tabbarコンポーネント[/ja]
|
27877 | * @seealso ons-page
|
27878 | * [en]ons-page component[/en]
|
27879 | * [ja]ons-pageコンポーネント[/ja]
|
27880 | * @seealso ons-icon
|
27881 | * [en]ons-icon component[/en]
|
27882 | * [ja]ons-iconコンポーネント[/ja]
|
27883 | * @example
|
27884 | * <ons-tabbar>
|
27885 | * <ons-tab
|
27886 | * page="home.html"
|
27887 | * label="Home"
|
27888 | * active>
|
27889 | * </ons-tab>
|
27890 | * <ons-tab
|
27891 | * page="settings.html"
|
27892 | * label="Settings"
|
27893 | * active>
|
27894 | * </ons-tab>
|
27895 | * </ons-tabbar>
|
27896 | *
|
27897 | * <template id="home.html">
|
27898 | * ...
|
27899 | * </template>
|
27900 | *
|
27901 | * <template id="settings.html">
|
27902 | * ...
|
27903 | * </template>
|
27904 |
|
27905 | */
|
27906 |
|
27907 | var TabElement = /*#__PURE__*/function (_BaseElement) {
|
27908 | _inherits(TabElement, _BaseElement);
|
27909 |
|
27910 | var _super = _createSuper(TabElement);
|
27911 |
|
27912 | /**
|
27913 | * @attribute page
|
27914 | * @initonly
|
27915 | * @type {String}
|
27916 | * @description
|
27917 | * [en]The page that is displayed when the tab is tapped.[/en]
|
27918 | * [ja]ons-tabが参照するページへのURLを指定します。[/ja]
|
27919 | */
|
27920 |
|
27921 | /**
|
27922 | * @attribute icon
|
27923 | * @type {String}
|
27924 | * @description
|
27925 | * [en]
|
27926 | * The icon name for the tab. Can specify the same icon name as `<ons-icon>`. Check [See also](#seealso) section for more information.
|
27927 | * [/en]
|
27928 | * [ja]
|
27929 | * アイコン名を指定します。ons-iconと同じアイコン名を指定できます。
|
27930 | * 個別にアイコンをカスタマイズする場合は、background-imageなどのCSSスタイルを用いて指定できます。
|
27931 | * [/ja]
|
27932 | */
|
27933 |
|
27934 | /**
|
27935 | * @attribute active-icon
|
27936 | * @type {String}
|
27937 | * @description
|
27938 | * [en]The name of the icon when the tab is active.[/en]
|
27939 | * [ja]アクティブの際のアイコン名を指定します。[/ja]
|
27940 | */
|
27941 |
|
27942 | /**
|
27943 | * @attribute label
|
27944 | * @type {String}
|
27945 | * @description
|
27946 | * [en]The label of the tab item.[/en]
|
27947 | * [ja]アイコン下に表示されるラベルを指定します。[/ja]
|
27948 | */
|
27949 |
|
27950 | /**
|
27951 | * @attribute badge
|
27952 | * @type {String}
|
27953 | * @description
|
27954 | * [en]Display a notification badge on top of the tab.[/en]
|
27955 | * [ja]バッジに表示する内容を指定します。[/ja]
|
27956 | */
|
27957 |
|
27958 | /**
|
27959 | * @attribute active
|
27960 | * @description
|
27961 | * [en]This attribute should be set to the tab that is active by default.[/en]
|
27962 | * [ja][/ja]
|
27963 | */
|
27964 | function TabElement() {
|
27965 | var _this;
|
27966 |
|
27967 | _classCallCheck(this, TabElement);
|
27968 |
|
27969 | _this = _super.call(this);
|
27970 |
|
27971 | if (['label', 'icon', 'badge'].some(_this.hasAttribute.bind(_assertThisInitialized(_this)))) {
|
27972 | _this._compile();
|
27973 | } else {
|
27974 | contentReady(_assertThisInitialized(_this), function () {
|
27975 | return _this._compile();
|
27976 | });
|
27977 | }
|
27978 |
|
27979 | _this._pageLoader = defaultPageLoader;
|
27980 | _this._onClick = _this._onClick.bind(_assertThisInitialized(_this));
|
27981 |
|
27982 | var _util$defineListenerP = util$4.defineListenerProperty(_assertThisInitialized(_this), 'click'),
|
27983 | onConnected = _util$defineListenerP.onConnected,
|
27984 | onDisconnected = _util$defineListenerP.onDisconnected;
|
27985 |
|
27986 | _this._connectOnClick = onConnected;
|
27987 | _this._disconnectOnClick = onDisconnected;
|
27988 | return _this;
|
27989 | }
|
27990 |
|
27991 | _createClass(TabElement, [{
|
27992 | key: "pageLoader",
|
27993 | get: function get() {
|
27994 | return this._pageLoader;
|
27995 | },
|
27996 | set: function set(loader) {
|
27997 | if (!(loader instanceof PageLoader)) {
|
27998 | util$4.throwPageLoader();
|
27999 | }
|
28000 |
|
28001 | this._pageLoader = loader;
|
28002 | }
|
28003 | }, {
|
28004 | key: "_compile",
|
28005 | value: function _compile() {
|
28006 | autoStyle.prepare(this);
|
28007 | this.classList.add(defaultClassName$1);
|
28008 |
|
28009 | if (this._button) {
|
28010 | return;
|
28011 | }
|
28012 |
|
28013 | var button = util$4.create('button.tabbar__button');
|
28014 |
|
28015 | while (this.childNodes[0]) {
|
28016 | button.appendChild(this.childNodes[0]);
|
28017 | }
|
28018 |
|
28019 | var input = util$4.create('input', {
|
28020 | display: 'none'
|
28021 | });
|
28022 | input.type = 'radio';
|
28023 | this.appendChild(input);
|
28024 | this.appendChild(button);
|
28025 |
|
28026 | this._updateButtonContent();
|
28027 |
|
28028 | ModifierUtil.initModifier(this, scheme$1);
|
28029 |
|
28030 | this._updateRipple();
|
28031 | }
|
28032 | }, {
|
28033 | key: "_updateRipple",
|
28034 | value: function _updateRipple() {
|
28035 | this._button && util$4.updateRipple(this._button, this.hasAttribute('ripple'));
|
28036 | }
|
28037 | }, {
|
28038 | key: "_updateButtonContent",
|
28039 | value: function _updateButtonContent() {
|
28040 | var _this2 = this;
|
28041 |
|
28042 | var button = this._button;
|
28043 | var iconWrapper = this._icon;
|
28044 |
|
28045 | if (this.hasAttribute('icon')) {
|
28046 | iconWrapper = iconWrapper || util$4.createElement('<div class="tabbar__icon"><ons-icon></ons-icon></div>');
|
28047 | var icon = iconWrapper.children[0];
|
28048 |
|
28049 | var fix = function (last) {
|
28050 | return function () {
|
28051 | return icon.attributeChangedCallback('icon', last, _this2.getAttribute('icon'));
|
28052 | };
|
28053 | }(icon.getAttribute('icon'));
|
28054 |
|
28055 | if (this.hasAttribute('icon') && this.hasAttribute('active-icon')) {
|
28056 | icon.setAttribute('icon', this.getAttribute(this.isActive() ? 'active-icon' : 'icon'));
|
28057 | } else if (this.hasAttribute('icon')) {
|
28058 | icon.setAttribute('icon', this.getAttribute('icon'));
|
28059 | }
|
28060 |
|
28061 | iconWrapper.parentElement !== button && button.insertBefore(iconWrapper, button.firstChild); // dirty fix for https://github.com/OnsenUI/OnsenUI/issues/1654
|
28062 |
|
28063 | icon.attributeChangedCallback instanceof Function ? fix() : setImmediate(function () {
|
28064 | return icon.attributeChangedCallback instanceof Function && fix();
|
28065 | });
|
28066 | } else {
|
28067 | iconWrapper && iconWrapper.remove();
|
28068 | }
|
28069 |
|
28070 | ['label', 'badge'].forEach(function (attr, index) {
|
28071 | var prop = _this2.querySelector(".tabbar__".concat(attr));
|
28072 |
|
28073 | if (_this2.hasAttribute(attr)) {
|
28074 | prop = prop || util$4.create(".tabbar__".concat(attr) + (attr === 'badge' ? ' notification' : ''));
|
28075 | prop.textContent = _this2.getAttribute(attr);
|
28076 | prop.parentElement !== button && button.appendChild(prop);
|
28077 | } else {
|
28078 | prop && prop.remove();
|
28079 | }
|
28080 | });
|
28081 | }
|
28082 | }, {
|
28083 | key: "_input",
|
28084 | get: function get() {
|
28085 | return util$4.findChild(this, 'input');
|
28086 | }
|
28087 | }, {
|
28088 | key: "_button",
|
28089 | get: function get() {
|
28090 | return util$4.findChild(this, '.tabbar__button');
|
28091 | }
|
28092 | }, {
|
28093 | key: "_icon",
|
28094 | get: function get() {
|
28095 | return this.querySelector('.tabbar__icon');
|
28096 | }
|
28097 | }, {
|
28098 | key: "_tabbar",
|
28099 | get: function get() {
|
28100 | return util$4.findParent(this, 'ons-tabbar');
|
28101 | }
|
28102 | }, {
|
28103 | key: "index",
|
28104 | get: function get() {
|
28105 | return Array.prototype.indexOf.call(this.parentElement.children, this);
|
28106 | }
|
28107 | }, {
|
28108 | key: "_onClick",
|
28109 | value: function _onClick(event) {
|
28110 | var _this3 = this;
|
28111 |
|
28112 | setTimeout(function () {
|
28113 | if (!event.defaultPrevented) {
|
28114 | _this3._tabbar.setActiveTab(_this3.index, {
|
28115 | reject: false
|
28116 | });
|
28117 | }
|
28118 | });
|
28119 | }
|
28120 | }, {
|
28121 | key: "setActive",
|
28122 | value: function setActive() {
|
28123 | var _this4 = this;
|
28124 |
|
28125 | var active = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
|
28126 | contentReady(this, function () {
|
28127 | _this4._input.checked = active;
|
28128 |
|
28129 | _this4.classList.toggle('active', active);
|
28130 |
|
28131 | util$4.toggleAttribute(_this4, 'active', active);
|
28132 |
|
28133 | if (_this4.hasAttribute('icon') && _this4.hasAttribute('active-icon')) {
|
28134 | _this4._icon.children[0].setAttribute('icon', _this4.getAttribute(active ? 'active-icon' : 'icon'));
|
28135 | }
|
28136 | });
|
28137 | }
|
28138 | }, {
|
28139 | key: "_loadPageElement",
|
28140 | value: function _loadPageElement(parent, page) {
|
28141 | var _this5 = this;
|
28142 |
|
28143 | this._hasLoaded = true;
|
28144 | return new Promise(function (resolve) {
|
28145 | _this5._pageLoader.load({
|
28146 | parent: parent,
|
28147 | page: page
|
28148 | }, function (pageElement) {
|
28149 | parent.replaceChild(pageElement, parent.children[_this5.index]); // Ensure position
|
28150 |
|
28151 | _this5._loadedPage = pageElement;
|
28152 | resolve(pageElement);
|
28153 | });
|
28154 | });
|
28155 | }
|
28156 | }, {
|
28157 | key: "pageElement",
|
28158 | get: function get() {
|
28159 | // It has been loaded by ons-tab
|
28160 | if (this._loadedPage) {
|
28161 | return this._loadedPage;
|
28162 | } // Manually attached to DOM, 1 per tab
|
28163 |
|
28164 |
|
28165 | var tabbar = this._tabbar;
|
28166 |
|
28167 | if (tabbar.pages.length === tabbar.tabs.length) {
|
28168 | return tabbar.pages[this.index];
|
28169 | } // Loaded in another way
|
28170 |
|
28171 |
|
28172 | return null;
|
28173 | }
|
28174 | /**
|
28175 | * @return {Boolean}
|
28176 | */
|
28177 |
|
28178 | }, {
|
28179 | key: "isActive",
|
28180 | value: function isActive() {
|
28181 | return this.classList.contains('active');
|
28182 | }
|
28183 | }, {
|
28184 | key: "disconnectedCallback",
|
28185 | value: function disconnectedCallback() {
|
28186 | this.removeEventListener('click', this._onClick, false);
|
28187 |
|
28188 | if (this._loadedPage) {
|
28189 | this._hasLoaded = false;
|
28190 | this.loaded = null;
|
28191 | }
|
28192 |
|
28193 | this._disconnectOnClick();
|
28194 | }
|
28195 | }, {
|
28196 | key: "connectedCallback",
|
28197 | value: function connectedCallback() {
|
28198 | var _this6 = this;
|
28199 |
|
28200 | this.addEventListener('click', this._onClick, false);
|
28201 |
|
28202 | if (!util$4.isAttached(this) || this.loaded) {
|
28203 | return; // ons-tabbar compilation may trigger this
|
28204 | }
|
28205 |
|
28206 | var deferred = util$4.defer();
|
28207 | this.loaded = deferred.promise;
|
28208 | contentReady(this, function () {
|
28209 | var index = _this6.index;
|
28210 | var tabbar = _this6._tabbar;
|
28211 |
|
28212 | if (!tabbar) {
|
28213 | util$4.throw('Tab elements must be children of Tabbar');
|
28214 | }
|
28215 |
|
28216 | if (tabbar.hasAttribute('modifier')) {
|
28217 | util$4.addModifier(_this6, tabbar.getAttribute('modifier'));
|
28218 | }
|
28219 |
|
28220 | if (!_this6._hasLoaded) {
|
28221 | if (_this6.hasAttribute('active')) {
|
28222 | _this6.setActive(true);
|
28223 |
|
28224 | tabbar.activeIndex = index;
|
28225 | }
|
28226 |
|
28227 | if (index === tabbar.tabs.length - 1) {
|
28228 | tabbar._onRefresh();
|
28229 |
|
28230 | setImmediate(function () {
|
28231 | return tabbar._onRefresh();
|
28232 | });
|
28233 | }
|
28234 |
|
28235 | TabbarElement.rewritables.ready(tabbar, function () {
|
28236 | var pageTarget = _this6.page || _this6.getAttribute('page');
|
28237 |
|
28238 | if (!_this6.pageElement && pageTarget) {
|
28239 | var parentTarget = tabbar._targetElement;
|
28240 | var dummyPage = util$4.create('div', {
|
28241 | height: '100%',
|
28242 | width: '100%',
|
28243 | visibility: 'hidden'
|
28244 | });
|
28245 | parentTarget.insertBefore(dummyPage, parentTarget.children[index]); // Ensure position
|
28246 |
|
28247 | var load = function load() {
|
28248 | return _this6._loadPageElement(parentTarget, pageTarget).then(deferred.resolve);
|
28249 | };
|
28250 |
|
28251 | return _this6.isActive() ? load() : tabbar._loadInactive.promise.then(load);
|
28252 | }
|
28253 |
|
28254 | return deferred.resolve(_this6.pageElement);
|
28255 | });
|
28256 | }
|
28257 | });
|
28258 |
|
28259 | this._connectOnClick();
|
28260 | }
|
28261 | }, {
|
28262 | key: "attributeChangedCallback",
|
28263 | value: function attributeChangedCallback(name, last, current) {
|
28264 | var _this7 = this;
|
28265 |
|
28266 | switch (name) {
|
28267 | case 'class':
|
28268 | util$4.restoreClass(this, defaultClassName$1, scheme$1);
|
28269 | break;
|
28270 |
|
28271 | case 'modifier':
|
28272 | contentReady(this, function () {
|
28273 | return ModifierUtil.onModifierChanged(last, current, _this7, scheme$1);
|
28274 | });
|
28275 | break;
|
28276 |
|
28277 | case 'ripple':
|
28278 | contentReady(this, function () {
|
28279 | return _this7._updateRipple();
|
28280 | });
|
28281 | break;
|
28282 |
|
28283 | case 'icon':
|
28284 | case 'label':
|
28285 | case 'badge':
|
28286 | contentReady(this, function () {
|
28287 | return _this7._updateButtonContent();
|
28288 | });
|
28289 | break;
|
28290 |
|
28291 | case 'page':
|
28292 | this.page = current || '';
|
28293 | break;
|
28294 | }
|
28295 | }
|
28296 | }], [{
|
28297 | key: "observedAttributes",
|
28298 | get: function get() {
|
28299 | return ['modifier', 'ripple', 'icon', 'label', 'page', 'badge', 'class'];
|
28300 | }
|
28301 | }]);
|
28302 |
|
28303 | return TabElement;
|
28304 | }(BaseElement);
|
28305 | onsElements.Tab = TabElement;
|
28306 | customElements.define('ons-tab', TabElement);
|
28307 |
|
28308 | var ToastAnimator = /*#__PURE__*/function (_BaseAnimator) {
|
28309 | _inherits(ToastAnimator, _BaseAnimator);
|
28310 |
|
28311 | var _super = _createSuper(ToastAnimator);
|
28312 |
|
28313 | /**
|
28314 | * @param {Object} options
|
28315 | * @param {String} options.timing
|
28316 | * @param {Number} options.duration
|
28317 | * @param {Number} options.delay
|
28318 | */
|
28319 | function ToastAnimator() {
|
28320 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
28321 | _ref$timing = _ref.timing,
|
28322 | timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
|
28323 | _ref$delay = _ref.delay,
|
28324 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
28325 | _ref$duration = _ref.duration,
|
28326 | duration = _ref$duration === void 0 ? 0.2 : _ref$duration;
|
28327 |
|
28328 | _classCallCheck(this, ToastAnimator);
|
28329 |
|
28330 | return _super.call(this, {
|
28331 | timing: timing,
|
28332 | delay: delay,
|
28333 | duration: duration
|
28334 | });
|
28335 | }
|
28336 | /**
|
28337 | * @param {HTMLElement} modal
|
28338 | * @param {Function} callback
|
28339 | */
|
28340 |
|
28341 |
|
28342 | _createClass(ToastAnimator, [{
|
28343 | key: "show",
|
28344 | value: function show(modal, callback) {
|
28345 | callback();
|
28346 | }
|
28347 | /**
|
28348 | * @param {HTMLElement} modal
|
28349 | * @param {Function} callback
|
28350 | */
|
28351 |
|
28352 | }, {
|
28353 | key: "hide",
|
28354 | value: function hide(modal, callback) {
|
28355 | callback();
|
28356 | }
|
28357 | }]);
|
28358 |
|
28359 | return ToastAnimator;
|
28360 | }(BaseAnimator);
|
28361 |
|
28362 | /**
|
28363 | * iOS style animator for dialog.
|
28364 | */
|
28365 |
|
28366 | var FadeToastAnimator = /*#__PURE__*/function (_ToastAnimator) {
|
28367 | _inherits(FadeToastAnimator, _ToastAnimator);
|
28368 |
|
28369 | var _super = _createSuper(FadeToastAnimator);
|
28370 |
|
28371 | function FadeToastAnimator() {
|
28372 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
28373 | _ref$timing = _ref.timing,
|
28374 | timing = _ref$timing === void 0 ? 'linear' : _ref$timing,
|
28375 | _ref$delay = _ref.delay,
|
28376 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
28377 | _ref$duration = _ref.duration,
|
28378 | duration = _ref$duration === void 0 ? 0.3 : _ref$duration;
|
28379 |
|
28380 | _classCallCheck(this, FadeToastAnimator);
|
28381 |
|
28382 | return _super.call(this, {
|
28383 | timing: timing,
|
28384 | delay: delay,
|
28385 | duration: duration
|
28386 | });
|
28387 | }
|
28388 | /**
|
28389 | * @param {HTMLElement} toast
|
28390 | * @param {Function} callback
|
28391 | */
|
28392 |
|
28393 |
|
28394 | _createClass(FadeToastAnimator, [{
|
28395 | key: "show",
|
28396 | value: function show(toast, callback) {
|
28397 | callback = callback ? callback : function () {};
|
28398 | Animit(toast, this.def).default({
|
28399 | opacity: 0
|
28400 | }, {
|
28401 | opacity: 1
|
28402 | }).queue(function (done) {
|
28403 | callback();
|
28404 | done();
|
28405 | }).play();
|
28406 | }
|
28407 | /**
|
28408 | * @param {HTMLElement} toast
|
28409 | * @param {Function} callback
|
28410 | */
|
28411 |
|
28412 | }, {
|
28413 | key: "hide",
|
28414 | value: function hide(toast, callback) {
|
28415 | callback = callback ? callback : function () {};
|
28416 | Animit(toast, this.def).default({
|
28417 | opacity: 1
|
28418 | }, {
|
28419 | opacity: 0
|
28420 | }).queue(function (done) {
|
28421 | callback();
|
28422 | done();
|
28423 | }).play();
|
28424 | }
|
28425 | }]);
|
28426 |
|
28427 | return FadeToastAnimator;
|
28428 | }(ToastAnimator);
|
28429 |
|
28430 | /**
|
28431 | * Ascend Toast Animator.
|
28432 | */
|
28433 |
|
28434 | var AscendToastAnimator = /*#__PURE__*/function (_ToastAnimator) {
|
28435 | _inherits(AscendToastAnimator, _ToastAnimator);
|
28436 |
|
28437 | var _super = _createSuper(AscendToastAnimator);
|
28438 |
|
28439 | function AscendToastAnimator() {
|
28440 | var _this;
|
28441 |
|
28442 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
28443 | _ref$timing = _ref.timing,
|
28444 | timing = _ref$timing === void 0 ? 'ease' : _ref$timing,
|
28445 | _ref$delay = _ref.delay,
|
28446 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
28447 | _ref$duration = _ref.duration,
|
28448 | duration = _ref$duration === void 0 ? 0.25 : _ref$duration;
|
28449 |
|
28450 | _classCallCheck(this, AscendToastAnimator);
|
28451 |
|
28452 | _this = _super.call(this, {
|
28453 | timing: timing,
|
28454 | delay: delay,
|
28455 | duration: duration
|
28456 | });
|
28457 | _this.messageDelay = _this.duration * 0.4 + _this.delay; // Delay message opacity change
|
28458 |
|
28459 | if (platform.isAndroid()) {
|
28460 | _this.ascension = 48; // Toasts are always 1 line
|
28461 | } else {
|
28462 | if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
|
28463 | _this.ascension = 98; // 64 + 34
|
28464 | } else if (iPhoneXPatch.isIPhoneXLandscapePatchActive()) {
|
28465 | _this.ascension = 85; // 64 + 21
|
28466 | } else {
|
28467 | _this.ascension = 64;
|
28468 | }
|
28469 | }
|
28470 |
|
28471 | return _this;
|
28472 | }
|
28473 | /**
|
28474 | * @param {HTMLElement} toast
|
28475 | * @param {Function} callback
|
28476 | */
|
28477 |
|
28478 |
|
28479 | _createClass(AscendToastAnimator, [{
|
28480 | key: "show",
|
28481 | value: function show(toast, callback) {
|
28482 | toast = toast._toast;
|
28483 | util$4.globals.fabOffset = this.ascension;
|
28484 | Animit.runAll(Animit(toast, this.def).default({
|
28485 | transform: "translate3d(0, ".concat(this.ascension, "px, 0)")
|
28486 | }, {
|
28487 | transform: 'translate3d(0, 0, 0)'
|
28488 | }).queue(function (done) {
|
28489 | callback && callback();
|
28490 | done();
|
28491 | }), Animit(this._getFabs()).wait(this.delay).queue({
|
28492 | transform: "translate3d(0, -".concat(this.ascension, "px, 0) scale(1)")
|
28493 | }, this.def), Animit(util$4.arrayFrom(toast.children), this.def).default({
|
28494 | opacity: 0
|
28495 | }, {
|
28496 | opacity: 1
|
28497 | }));
|
28498 | }
|
28499 | /**
|
28500 | * @param {HTMLElement} toast
|
28501 | * @param {Function} callback
|
28502 | */
|
28503 |
|
28504 | }, {
|
28505 | key: "hide",
|
28506 | value: function hide(toast, callback) {
|
28507 | toast = toast._toast;
|
28508 | util$4.globals.fabOffset = 0;
|
28509 | Animit.runAll(Animit(toast, this.def).default({
|
28510 | transform: 'translate3d(0, 0, 0)'
|
28511 | }, {
|
28512 | transform: "translate3d(0, ".concat(this.ascension, "px, 0)")
|
28513 | }).queue(function (done) {
|
28514 | callback && callback();
|
28515 | done();
|
28516 | }), Animit(this._getFabs(), this.def).wait(this.delay).queue({
|
28517 | transform: "translate3d(0, 0, 0) scale(1)"
|
28518 | }, this.def), Animit(util$4.arrayFrom(toast.children), this.def).default({
|
28519 | opacity: 1
|
28520 | }, {
|
28521 | opacity: 0
|
28522 | }));
|
28523 | }
|
28524 | }, {
|
28525 | key: "_getFabs",
|
28526 | value: function _getFabs() {
|
28527 | return util$4.arrayFrom(document.querySelectorAll('ons-fab[position~=bottom], ons-speed-dial[position~=bottom]')).filter(function (fab) {
|
28528 | return fab.visible;
|
28529 | });
|
28530 | }
|
28531 | }]);
|
28532 |
|
28533 | return AscendToastAnimator;
|
28534 | }(ToastAnimator);
|
28535 |
|
28536 | /**
|
28537 | * Lift-fade Toast Animator
|
28538 | */
|
28539 |
|
28540 | var LiftToastAnimator = /*#__PURE__*/function (_ToastAnimator) {
|
28541 | _inherits(LiftToastAnimator, _ToastAnimator);
|
28542 |
|
28543 | var _super = _createSuper(LiftToastAnimator);
|
28544 |
|
28545 | function LiftToastAnimator() {
|
28546 | var _this;
|
28547 |
|
28548 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
28549 | _ref$timing = _ref.timing,
|
28550 | timing = _ref$timing === void 0 ? 'ease' : _ref$timing,
|
28551 | _ref$delay = _ref.delay,
|
28552 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
28553 | _ref$duration = _ref.duration,
|
28554 | duration = _ref$duration === void 0 ? 0.35 : _ref$duration;
|
28555 |
|
28556 | _classCallCheck(this, LiftToastAnimator);
|
28557 |
|
28558 | _this = _super.call(this, {
|
28559 | timing: timing,
|
28560 | delay: delay,
|
28561 | duration: duration
|
28562 | });
|
28563 | _this.bodyHeight = document.body.clientHeight; // avoid Forced Synchronous Layout
|
28564 |
|
28565 | if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
|
28566 | _this.liftAmount = 'calc(100% + 34px)';
|
28567 | } else if (iPhoneXPatch.isIPhoneXLandscapePatchActive()) {
|
28568 | _this.liftAmount = 'calc(100% + 21px)';
|
28569 | } else {
|
28570 | _this.liftAmount = '100%';
|
28571 | }
|
28572 |
|
28573 | return _this;
|
28574 | }
|
28575 | /**
|
28576 | * @param {HTMLElement} toast
|
28577 | * @param {Function} callback
|
28578 | */
|
28579 |
|
28580 |
|
28581 | _createClass(LiftToastAnimator, [{
|
28582 | key: "show",
|
28583 | value: function show(toast, callback) {
|
28584 | toast = toast._toast;
|
28585 | Animit.runAll(Animit(toast, this.def).default({
|
28586 | transform: "translate3d(0, ".concat(this.liftAmount, ", 0)"),
|
28587 | opacity: 0
|
28588 | }, {
|
28589 | transform: 'translate3d(0, 0, 0)',
|
28590 | opacity: 1
|
28591 | }).queue(function (done) {
|
28592 | callback && callback();
|
28593 | done();
|
28594 | }));
|
28595 | }
|
28596 | /**
|
28597 | * @param {HTMLElement} toast
|
28598 | * @param {Function} callback
|
28599 | */
|
28600 |
|
28601 | }, {
|
28602 | key: "hide",
|
28603 | value: function hide(toast, callback) {
|
28604 | toast = toast._toast;
|
28605 | Animit.runAll(Animit(toast, this.def).default({
|
28606 | transform: 'translate3d(0, 0, 0)',
|
28607 | opacity: 1
|
28608 | }, {
|
28609 | transform: "translate3d(0, ".concat(this.liftAmount, ", 0)"),
|
28610 | opacity: 0
|
28611 | }).queue(function (done) {
|
28612 | callback && callback();
|
28613 | done();
|
28614 | }));
|
28615 | }
|
28616 | }, {
|
28617 | key: "_updatePosition",
|
28618 | value: function _updatePosition(toast) {
|
28619 | if (parseInt(toast.style.top, 10) === 0) {
|
28620 | toast.style.top = toast.style.bottom = '';
|
28621 | }
|
28622 | }
|
28623 | }]);
|
28624 |
|
28625 | return LiftToastAnimator;
|
28626 | }(ToastAnimator);
|
28627 |
|
28628 | /**
|
28629 | * Fall-fade Toast Animator
|
28630 | */
|
28631 |
|
28632 | var FallToastAnimator = /*#__PURE__*/function (_ToastAnimator) {
|
28633 | _inherits(FallToastAnimator, _ToastAnimator);
|
28634 |
|
28635 | var _super = _createSuper(FallToastAnimator);
|
28636 |
|
28637 | function FallToastAnimator() {
|
28638 | var _this;
|
28639 |
|
28640 | var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
28641 | _ref$timing = _ref.timing,
|
28642 | timing = _ref$timing === void 0 ? 'ease' : _ref$timing,
|
28643 | _ref$delay = _ref.delay,
|
28644 | delay = _ref$delay === void 0 ? 0 : _ref$delay,
|
28645 | _ref$duration = _ref.duration,
|
28646 | duration = _ref$duration === void 0 ? 0.35 : _ref$duration;
|
28647 |
|
28648 | _classCallCheck(this, FallToastAnimator);
|
28649 |
|
28650 | _this = _super.call(this, {
|
28651 | timing: timing,
|
28652 | delay: delay,
|
28653 | duration: duration
|
28654 | });
|
28655 |
|
28656 | if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
|
28657 | _this.fallAmount = 'calc(-100% - 44px)';
|
28658 | } else {
|
28659 | _this.fallAmount = '-100%';
|
28660 | }
|
28661 |
|
28662 | return _this;
|
28663 | }
|
28664 | /**
|
28665 | * @param {HTMLElement} toast
|
28666 | * @param {Function} callback
|
28667 | */
|
28668 |
|
28669 |
|
28670 | _createClass(FallToastAnimator, [{
|
28671 | key: "show",
|
28672 | value: function show(toast, callback) {
|
28673 | toast = toast._toast;
|
28674 |
|
28675 | this._updatePosition(toast);
|
28676 |
|
28677 | Animit.runAll(Animit(toast, this.def).default({
|
28678 | transform: "translate3d(0, ".concat(this.fallAmount, ", 0)"),
|
28679 | opacity: 0
|
28680 | }, {
|
28681 | transform: 'translate3d(0, 0, 0)',
|
28682 | opacity: 1
|
28683 | }).queue(function (done) {
|
28684 | callback && callback();
|
28685 | done();
|
28686 | }));
|
28687 | }
|
28688 | /**
|
28689 | * @param {HTMLElement} toast
|
28690 | * @param {Function} callback
|
28691 | */
|
28692 |
|
28693 | }, {
|
28694 | key: "hide",
|
28695 | value: function hide(toast, callback) {
|
28696 | var _this2 = this;
|
28697 |
|
28698 | toast = toast._toast;
|
28699 |
|
28700 | this._updatePosition(toast);
|
28701 |
|
28702 | Animit.runAll(Animit(toast, this.def).default({
|
28703 | transform: 'translate3d(0, 0, 0)',
|
28704 | opacity: 1
|
28705 | }, {
|
28706 | transform: "translate3d(0, ".concat(this.fallAmount, ", 0)"),
|
28707 | opacity: 0
|
28708 | }).queue(function (done) {
|
28709 | _this2._updatePosition(toast, true);
|
28710 |
|
28711 | callback && callback();
|
28712 | done();
|
28713 | }));
|
28714 | }
|
28715 | }, {
|
28716 | key: "_updatePosition",
|
28717 | value: function _updatePosition(toast, cleanUp) {
|
28718 | var correctTop;
|
28719 |
|
28720 | if (iPhoneXPatch.isIPhoneXPortraitPatchActive()) {
|
28721 | correctTop = '44px';
|
28722 | } else {
|
28723 | correctTop = '0';
|
28724 | }
|
28725 |
|
28726 | if (toast.style.top !== correctTop) {
|
28727 | toast.style.top = correctTop;
|
28728 | toast.style.bottom = 'initial';
|
28729 | }
|
28730 | }
|
28731 | }]);
|
28732 |
|
28733 | return FallToastAnimator;
|
28734 | }(ToastAnimator);
|
28735 |
|
28736 | var scheme = {
|
28737 | '.toast': 'toast--*',
|
28738 | '.toast__message': 'toast--*__message',
|
28739 | '.toast__button': 'toast--*__button'
|
28740 | };
|
28741 | var defaultClassName = 'toast';
|
28742 | var _animatorDict = {
|
28743 | 'default': platform.isAndroid() ? AscendToastAnimator : LiftToastAnimator,
|
28744 | 'fade': FadeToastAnimator,
|
28745 | 'ascend': AscendToastAnimator,
|
28746 | 'lift': LiftToastAnimator,
|
28747 | 'fall': FallToastAnimator,
|
28748 | 'none': ToastAnimator
|
28749 | };
|
28750 | /**
|
28751 | * @element ons-toast
|
28752 | * @category dialog
|
28753 | * @description
|
28754 | * [en]
|
28755 | * The Toast or Snackbar component is useful for displaying dismissable information or simple actions at (normally) the bottom of the page.
|
28756 | *
|
28757 | * This component does not block user input, allowing the app to continue its flow. For simple toasts, consider `ons.notification.toast` instead.
|
28758 | * [/en]
|
28759 | * [ja][/ja]
|
28760 | * @tutorial vanilla/Reference/toast
|
28761 | * @seealso ons-alert-dialog
|
28762 | * [en]The `<ons-alert-dialog>` component is preferred for displaying undismissable information.[/en]
|
28763 | * [ja][/ja]
|
28764 | */
|
28765 |
|
28766 | var ToastElement = /*#__PURE__*/function (_BaseDialogElement) {
|
28767 | _inherits(ToastElement, _BaseDialogElement);
|
28768 |
|
28769 | var _super = _createSuper(ToastElement);
|
28770 |
|
28771 | /**
|
28772 | * @event preshow
|
28773 | * @description
|
28774 | * [en]Fired just before the toast is displayed.[/en]
|
28775 | * [ja]ダイアログが表示される直前に発火します。[/ja]
|
28776 | * @param {Object} event [en]Event object.[/en]
|
28777 | * @param {Object} event.toast
|
28778 | * [en]Toast object.[/en]
|
28779 | * [ja]ダイアログのオブジェクト。[/ja]
|
28780 | * @param {Function} event.cancel
|
28781 | * [en]Execute to stop the toast from showing.[/en]
|
28782 | * [ja]この関数を実行すると、ダイアログの表示を止めます。[/ja]
|
28783 | */
|
28784 |
|
28785 | /**
|
28786 | * @event postshow
|
28787 | * @description
|
28788 | * [en]Fired just after the toast is displayed.[/en]
|
28789 | * [ja]ダイアログが表示された直後に発火します。[/ja]
|
28790 | * @param {Object} event [en]Event object.[/en]
|
28791 | * @param {Object} event.toast
|
28792 | * [en]Toast object.[/en]
|
28793 | * [ja]ダイアログのオブジェクト。[/ja]
|
28794 | */
|
28795 |
|
28796 | /**
|
28797 | * @event prehide
|
28798 | * @description
|
28799 | * [en]Fired just before the toast is hidden.[/en]
|
28800 | * [ja]ダイアログが隠れる直前に発火します。[/ja]
|
28801 | * @param {Object} event [en]Event object.[/en]
|
28802 | * @param {Object} event.toast
|
28803 | * [en]Toast object.[/en]
|
28804 | * [ja]ダイアログのオブジェクト。[/ja]
|
28805 | * @param {Function} event.cancel
|
28806 | * [en]Execute to stop the toast from hiding.[/en]
|
28807 | * [ja]この関数を実行すると、ダイアログが閉じようとするのを止めます。[/ja]
|
28808 | */
|
28809 |
|
28810 | /**
|
28811 | * @event posthide
|
28812 | * @description
|
28813 | * [en]Fired just after the toast is hidden.[/en]
|
28814 | * [ja]ダイアログが隠れた後に発火します。[/ja]
|
28815 | * @param {Object} event [en]Event object.[/en]
|
28816 | * @param {Object} event.toast
|
28817 | * [en]Toast object.[/en]
|
28818 | * [ja]ダイアログのオブジェクト。[/ja]
|
28819 | */
|
28820 |
|
28821 | /**
|
28822 | * @attribute animation
|
28823 | * @type {String}
|
28824 | * @default default
|
28825 | * @description
|
28826 | * [en]The animation used when showing and hiding the toast. Can be either `"default"`, `"ascend"` (Android), `"lift"` (iOS), `"fall"`, `"fade"` or `"none"`.[/en]
|
28827 | * [ja][/ja]
|
28828 | */
|
28829 |
|
28830 | /**
|
28831 | * @attribute animation-options
|
28832 | * @type {Expression}
|
28833 | * @description
|
28834 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
28835 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。e.g. <code>{duration: 0.2, delay: 1, timing: 'ease-in'}</code>[/ja]
|
28836 | */
|
28837 |
|
28838 | /**
|
28839 | * @property animationOptions
|
28840 | * @type {Object}
|
28841 | * @description
|
28842 | * [en]Specify the animation's duration, timing and delay with an object literal. E.g. `{duration: 0.2, delay: 1, timing: 'ease-in'}`.[/en]
|
28843 | * [ja]アニメーション時のduration, timing, delayをオブジェクトリテラルで指定します。例:{duration: 0.2, delay: 1, timing: 'ease-in'}[/ja]
|
28844 | */
|
28845 |
|
28846 | /**
|
28847 | * @attribute visible
|
28848 | * @type {Boolean}
|
28849 | * @description
|
28850 | * [en]Whether the toast is visible or not.[/en]
|
28851 | * [ja]要素が見える場合に`true`。[/ja]
|
28852 | */
|
28853 | function ToastElement() {
|
28854 | var _this;
|
28855 |
|
28856 | _classCallCheck(this, ToastElement);
|
28857 |
|
28858 | _this = _super.call(this);
|
28859 | _this._defaultDBB = null;
|
28860 | contentReady(_assertThisInitialized(_this), function () {
|
28861 | return _this._compile();
|
28862 | });
|
28863 | return _this;
|
28864 | }
|
28865 |
|
28866 | _createClass(ToastElement, [{
|
28867 | key: "_scheme",
|
28868 | get: function get() {
|
28869 | return scheme;
|
28870 | }
|
28871 | }, {
|
28872 | key: "_toast",
|
28873 | get: function get() {
|
28874 | return util$4.findChild(this, ".".concat(defaultClassName));
|
28875 | }
|
28876 | }, {
|
28877 | key: "_updateAnimatorFactory",
|
28878 | value: function _updateAnimatorFactory() {
|
28879 | // Reset position style
|
28880 | this._toast && (this._toast.style.top = this._toast.style.bottom = '');
|
28881 | return new AnimatorFactory({
|
28882 | animators: _animatorDict,
|
28883 | baseClass: ToastAnimator,
|
28884 | baseClassName: 'ToastAnimator',
|
28885 | defaultAnimation: this.getAttribute('animation')
|
28886 | });
|
28887 | }
|
28888 | /**
|
28889 | * @property onDeviceBackButton
|
28890 | * @type {Object}
|
28891 | * @description
|
28892 | * [en]Back-button handler.[/en]
|
28893 | * [ja]バックボタンハンドラ。[/ja]
|
28894 | */
|
28895 |
|
28896 | }, {
|
28897 | key: "_compile",
|
28898 | value: function _compile() {
|
28899 | autoStyle.prepare(this);
|
28900 | this.style.display = 'none';
|
28901 | this.style.zIndex = 10000; // Lower than dialogs
|
28902 |
|
28903 | var messageClassName = 'toast__message';
|
28904 | var buttonClassName = 'toast__button';
|
28905 | var toast = util$4.findChild(this, ".".concat(defaultClassName));
|
28906 |
|
28907 | if (!toast) {
|
28908 | toast = document.createElement('div');
|
28909 | toast.classList.add(defaultClassName);
|
28910 |
|
28911 | while (this.childNodes[0]) {
|
28912 | toast.appendChild(this.childNodes[0]);
|
28913 | }
|
28914 | }
|
28915 |
|
28916 | var button = util$4.findChild(toast, ".".concat(buttonClassName));
|
28917 |
|
28918 | if (!button) {
|
28919 | button = util$4.findChild(toast, function (e) {
|
28920 | return util$4.match(e, '.button') || util$4.match(e, 'button');
|
28921 | });
|
28922 |
|
28923 | if (button) {
|
28924 | button.classList.remove('button');
|
28925 | button.classList.add(buttonClassName);
|
28926 | toast.appendChild(button);
|
28927 | }
|
28928 | }
|
28929 |
|
28930 | if (!util$4.findChild(toast, ".".concat(messageClassName))) {
|
28931 | var message = util$4.findChild(toast, '.message');
|
28932 |
|
28933 | if (!message) {
|
28934 | message = document.createElement('div');
|
28935 |
|
28936 | for (var i = toast.childNodes.length - 1; i >= 0; i--) {
|
28937 | if (toast.childNodes[i] !== button) {
|
28938 | message.insertBefore(toast.childNodes[i], message.firstChild);
|
28939 | }
|
28940 | }
|
28941 | }
|
28942 |
|
28943 | message.classList.add(messageClassName);
|
28944 | toast.insertBefore(message, toast.firstChild);
|
28945 | }
|
28946 |
|
28947 | if (toast.parentNode !== this) {
|
28948 | this.appendChild(toast);
|
28949 | }
|
28950 |
|
28951 | ModifierUtil.initModifier(this, this._scheme);
|
28952 | }
|
28953 | /**
|
28954 | * @property visible
|
28955 | * @type {Boolean}
|
28956 | * @description
|
28957 | * [en]Whether the element is visible or not.[/en]
|
28958 | * [ja]要素が見える場合に`true`。[/ja]
|
28959 | */
|
28960 |
|
28961 | /**
|
28962 | * @method show
|
28963 | * @signature show([options])
|
28964 | * @param {Object} [options]
|
28965 | * [en]Parameter object.[/en]
|
28966 | * [ja]オプションを指定するオブジェクト。[/ja]
|
28967 | * @param {String} [options.animation]
|
28968 | * [en]Animation name. Available animations are `"default"`, `"ascend"` (Android), `"lift"` (iOS), `"fall"`, `"fade"` or `"none"`.[/en]
|
28969 | * [ja][/ja]
|
28970 | * @param {String} [options.animationOptions]
|
28971 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
|
28972 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
|
28973 | * @description
|
28974 | * [en]Show the element.[/en]
|
28975 | * [ja][/ja]
|
28976 | * @return {Promise}
|
28977 | * [en]Resolves to the displayed element[/en]
|
28978 | * [ja][/ja]
|
28979 | */
|
28980 |
|
28981 | /**
|
28982 | * @method toggle
|
28983 | * @signature toggle([options])
|
28984 | * @param {Object} [options]
|
28985 | * [en]Parameter object.[/en]
|
28986 | * [ja]オプションを指定するオブジェクト。[/ja]
|
28987 | * @param {String} [options.animation]
|
28988 | * [en]Animation name. Available animations are `"default"`, `"ascend"` (Android), `"lift"` (iOS), `"fall"`, `"fade"` or `"none"`.[/en]
|
28989 | * [ja][/ja]
|
28990 | * @param {String} [options.animationOptions]
|
28991 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
|
28992 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
|
28993 | * @description
|
28994 | * [en]Toggle toast visibility.[/en]
|
28995 | * [ja][/ja]
|
28996 | */
|
28997 |
|
28998 | /**
|
28999 | * @method hide
|
29000 | * @signature hide([options])
|
29001 | * @param {Object} [options]
|
29002 | * [en]Parameter object.[/en]
|
29003 | * [ja]オプションを指定するオブジェクト。[/ja]
|
29004 | * @param {String} [options.animation]
|
29005 | * [en]Animation name. Available animations are `"default"`, `"ascend"` (Android), `"lift"` (iOS), `"fall"`, `"fade"` or `"none"`.[/en]
|
29006 | * [ja][/ja]
|
29007 | * @param {String} [options.animationOptions]
|
29008 | * [en]Specify the animation's duration, delay and timing. E.g. `{duration: 0.2, delay: 0.4, timing: 'ease-in'}`.[/en]
|
29009 | * [ja]アニメーション時のduration, delay, timingを指定します。e.g. {duration: 0.2, delay: 0.4, timing: 'ease-in'}[/ja]
|
29010 | * @description
|
29011 | * [en]Hide toast.[/en]
|
29012 | * [ja][/ja]
|
29013 | * @return {Promise}
|
29014 | * [en]Resolves to the hidden element[/en]
|
29015 | * [ja][/ja]
|
29016 | */
|
29017 |
|
29018 | /**
|
29019 | * @param {String} name
|
29020 | * @param {Function} Animator
|
29021 | */
|
29022 |
|
29023 | }], [{
|
29024 | key: "registerAnimator",
|
29025 | value: function registerAnimator(name, Animator) {
|
29026 | if (!(Animator.prototype instanceof ToastAnimator)) {
|
29027 | util$4.throw('"Animator" param must inherit OnsToastElement.ToastAnimator');
|
29028 | }
|
29029 |
|
29030 | _animatorDict[name] = Animator;
|
29031 | }
|
29032 | }, {
|
29033 | key: "animators",
|
29034 | get: function get() {
|
29035 | return _animatorDict;
|
29036 | }
|
29037 | }, {
|
29038 | key: "ToastAnimator",
|
29039 | get: function get() {
|
29040 | return ToastAnimator;
|
29041 | }
|
29042 | }]);
|
29043 |
|
29044 | return ToastElement;
|
29045 | }(BaseDialogElement);
|
29046 | onsElements.Toast = ToastElement;
|
29047 | customElements.define('ons-toast', ToastElement);
|
29048 |
|
29049 | /**
|
29050 | * @element ons-toolbar-button
|
29051 | * @category page
|
29052 | * @modifier material
|
29053 | * [en]Material Design toolbar button.[/en]
|
29054 | * [ja][/ja]
|
29055 | * @modifier outline
|
29056 | * [en]A button with an outline.[/en]
|
29057 | * [ja]アウトラインをもったボタンを表示します。[/ja]
|
29058 | * @description
|
29059 | * [en]Button component for ons-toolbar and ons-bottom-toolbar.[/en]
|
29060 | * [ja]ons-toolbarあるいはons-bottom-toolbarに設置できるボタン用コンポーネントです。[/ja]
|
29061 | * @codepen aHmGL
|
29062 | * @tutorial vanilla/Reference/page
|
29063 | * @guide compilation.html#toolbar-compilation
|
29064 | * [en]Adding a toolbar[/en]
|
29065 | * [ja]ツールバーの追加[/ja]
|
29066 | * @seealso ons-toolbar
|
29067 | * [en]The `<ons-toolbar>` component displays a navigation bar at the top of a page.[/en]
|
29068 | * [ja]ons-toolbarコンポーネント[/ja]
|
29069 | * @seealso ons-back-button
|
29070 | * [en]The `<ons-back-button>` displays a back button in the navigation bar.[/en]
|
29071 | * [ja]ons-back-buttonコンポーネント[/ja]
|
29072 | * @example
|
29073 | * <ons-toolbar>
|
29074 | * <div class="left">
|
29075 | * <ons-toolbar-button>
|
29076 | * Button
|
29077 | * </ons-toolbar-button>
|
29078 | * </div>
|
29079 | * <div class="center">
|
29080 | * Title
|
29081 | * </div>
|
29082 | * <div class="right">
|
29083 | * <ons-toolbar-button>
|
29084 | * <ons-icon icon="ion-navicon" size="28px"></ons-icon>
|
29085 | * </ons-toolbar-button>
|
29086 | * </div>
|
29087 | * </ons-toolbar>
|
29088 | */
|
29089 |
|
29090 | var ToolbarButtonElement = /*#__PURE__*/function (_BaseButtonElement) {
|
29091 | _inherits(ToolbarButtonElement, _BaseButtonElement);
|
29092 |
|
29093 | var _super = _createSuper(ToolbarButtonElement);
|
29094 |
|
29095 | function ToolbarButtonElement() {
|
29096 | _classCallCheck(this, ToolbarButtonElement);
|
29097 |
|
29098 | return _super.apply(this, arguments);
|
29099 | }
|
29100 |
|
29101 | _createClass(ToolbarButtonElement, [{
|
29102 | key: "_scheme",
|
29103 | get:
|
29104 | /**
|
29105 | * @attribute modifier
|
29106 | * @type {String}
|
29107 | * @description
|
29108 | * [en]The appearance of the button.[/en]
|
29109 | * [ja]ボタンの表現を指定します。[/ja]
|
29110 | */
|
29111 |
|
29112 | /**
|
29113 | * @attribute icon
|
29114 | * @type {String}
|
29115 | * @description
|
29116 | * [en]Creates an `ons-icon` component with this string.[/en]
|
29117 | * [ja]`ons-icon`コンポーネントを悪性します。[/ja]
|
29118 | */
|
29119 |
|
29120 | /**
|
29121 | * @attribute disabled
|
29122 | * @description
|
29123 | * [en]Specify if button should be disabled.[/en]
|
29124 | * [ja]ボタンを無効化する場合は指定してください。[/ja]
|
29125 | */
|
29126 |
|
29127 | /**
|
29128 | * @property disabled
|
29129 | * @type {Boolean}
|
29130 | * @description
|
29131 | * [en]Whether the element is disabled or not.[/en]
|
29132 | * [ja]無効化されている場合に`true`。[/ja]
|
29133 | */
|
29134 | function get() {
|
29135 | return {
|
29136 | '': 'toolbar-button--*'
|
29137 | };
|
29138 | }
|
29139 | }, {
|
29140 | key: "_defaultClassName",
|
29141 | get: function get() {
|
29142 | return 'toolbar-button';
|
29143 | }
|
29144 | }, {
|
29145 | key: "_rippleOpt",
|
29146 | get: function get() {
|
29147 | return [this, undefined, {
|
29148 | center: '',
|
29149 | 'size': 'contain',
|
29150 | 'background': 'transparent'
|
29151 | }];
|
29152 | }
|
29153 | }]);
|
29154 |
|
29155 | return ToolbarButtonElement;
|
29156 | }(BaseButtonElement);
|
29157 | onsElements.ToolbarButton = ToolbarButtonElement;
|
29158 | customElements.define('ons-toolbar-button', ToolbarButtonElement);
|
29159 |
|
29160 | setup$1(ons); // Setup initial listeners
|
29161 |
|
29162 | window._superSecretOns = ons;
|
29163 |
|
29164 | return ons;
|
29165 |
|
29166 | }));
|
29167 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25zZW51aS5qcyIsInNvdXJjZXMiOlsiLi4vZXNtL29ucy9wbGF0Zm9ybS5qcyIsIi4uL2VzbS9wb2x5ZmlsbHMvcG9seWZpbGwtc3dpdGNoZXMuanMiLCIuLi9lc20vcG9seWZpbGxzL2N1c3RvbS1lbGVtZW50cy9jdXN0b20tZWxlbWVudHMubWluLmpzIiwiLi4vZXNtL3BvbHlmaWxscy9NdXRhdGlvbk9ic2VydmVyQDAuNy4yMi9NdXRhdGlvbk9ic2VydmVyLmpzIiwiLi4vZXNtL3BvbHlmaWxscy9zZXRJbW1lZGlhdGVAMS4wLjIrbW9kL3NldEltbWVkaWF0ZS5qcyIsIi4uL2VzbS92ZW5kb3Ivdmlld3BvcnQuanMiLCIuLi9lc20vb25zL21pY3JvZXZlbnQuanMiLCIuLi9lc20vb25zL2VsZW1lbnRzLmpzIiwiLi4vZXNtL29ucy9zdHlsZXIuanMiLCIuLi9lc20vb25zL2F1dG9zdHlsZS5qcyIsIi4uL2VzbS9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyIsIi4uL2VzbS9vbnMvYW5pbWF0aW9uLW9wdGlvbnMtcGFyc2VyLmpzIiwiLi4vZXNtL29ucy91dGlsLmpzIiwiLi4vZXNtL29ucy9wYWdlLWF0dHJpYnV0ZS1leHByZXNzaW9uLmpzIiwiLi4vZXNtL29ucy9pbnRlcm5hbC9pbnRlcm5hbC5qcyIsIi4uL2VzbS9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyIsIi4uL2VzbS9vbnMvaW50ZXJuYWwvZGV2aWNlLWJhY2stYnV0dG9uLWRpc3BhdGNoZXIuanMiLCIuLi9lc20vb25zL2ludGVybmFsL2luZGV4LmpzIiwiLi4vZXNtL3NldHVwLmpzIiwiLi4vZXNtL29ucy9hbmltaXQuanMiLCIuLi9lc20vb25zL2dlc3R1cmUtZGV0ZWN0b3IuanMiLCIuLi9lc20vb25zL2NvbnRlbnQtcmVhZHkuanMiLCIuLi9lc20vb25zL2ludGVybmFsL3RvYXN0LXF1ZXVlLmpzIiwiLi4vZXNtL29ucy9ub3RpZmljYXRpb24uanMiLCIuLi9lc20vb25zL2FjdGlvbi1zaGVldC5qcyIsIi4uL2VzbS9vbnMvb3JpZW50YXRpb24uanMiLCIuLi9lc20vb25zL21vZGlmaWVyLmpzIiwiLi4vZXNtL29ucy9zb2Z0d2FyZS1rZXlib2FyZC5qcyIsIi4uL2VzbS9vbnMvZG9vcmxvY2suanMiLCIuLi9lc20vb25zL3BhZ2UtbG9hZGVyLmpzIiwiLi4vZXNtL29ucy9pbmRleC5qcyIsIi4uL2VzbS9lbGVtZW50cy9iYXNlL2Jhc2UtZWxlbWVudC5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtaWYuanMiLCIuLi9lc20vb25zL2Jhc2UtYW5pbWF0b3IuanMiLCIuLi9lc20vb25zL2lwaG9uZXgtcGF0Y2guanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWFjdGlvbi1zaGVldC9hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9iYXNlL2Jhc2UtZGlhbG9nLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1hY3Rpb24tc2hlZXQuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXJpcHBsZS9hbmltYXRvci1jc3MuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXJpcHBsZS5qcyIsIi4uL2VzbS9lbGVtZW50cy9iYXNlL2Jhc2UtYnV0dG9uLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1hY3Rpb24tc2hlZXQtYnV0dG9uLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1hbGVydC1kaWFsb2cvYW5pbWF0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWFsZXJ0LWRpYWxvZy5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtYWxlcnQtZGlhbG9nLWJ1dHRvbi5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtYmFjay1idXR0b24uanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWJvdHRvbS10b29sYmFyLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1idXR0b24uanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWNhcmQuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWNhcm91c2VsLWl0ZW0uanMiLCIuLi9lc20vb25zL2ludGVybmFsL3N3aXBlci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtY2Fyb3VzZWwuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWNvbC5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtZGlhbG9nL2FuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1kaWFsb2cuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWZhYi5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtZ2VzdHVyZS1kZXRlY3Rvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtaWNvbi5qcyIsIi4uL2VzbS9vbnMvaW50ZXJuYWwvbGF6eS1yZXBlYXQuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWxhenktcmVwZWF0LmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1saXN0LWhlYWRlci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbGlzdC10aXRsZS5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbGlzdC1pdGVtL2FuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1saXN0LWl0ZW0uanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWxpc3QuanMiLCIuLi9lc20vZWxlbWVudHMvYmFzZS9iYXNlLWlucHV0LmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1pbnB1dC5qcyIsIi4uL2VzbS9lbGVtZW50cy9iYXNlL2Jhc2UtY2hlY2tib3guanMiLCIuLi9lc20vZWxlbWVudHMvb25zLWNoZWNrYm94LmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1yYWRpby5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtc2VhcmNoLWlucHV0LmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1tb2RhbC9hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbW9kYWwvZmFkZS1hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbW9kYWwvbGlmdC1hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbW9kYWwuanMiLCIuLi9lc20vb25zL2ludGVybmFsL3N3aXBlLXJldmVhbC5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbmF2aWdhdG9yL2FuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IvaW9zLXN3aXBlLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IvaW9zLXNsaWRlLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IvaW9zLWxpZnQtYW5pbWF0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLW5hdmlnYXRvci9pb3MtZmFkZS1hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbmF2aWdhdG9yL21kLXNsaWRlLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IvbWQtbGlmdC1hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtbmF2aWdhdG9yL21kLWZhZGUtYW5pbWF0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLW5hdmlnYXRvci9ub25lLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXRvb2xiYXIuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXBhZ2UuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXBvcG92ZXIvYW5pbWF0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXBvcG92ZXIuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXByb2dyZXNzLWJhci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtcHJvZ3Jlc3MtY2lyY3VsYXIuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXB1bGwtaG9vay5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtcmFuZ2UuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXJvdy5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtc2VnbWVudC5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtc2VsZWN0LmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zcGVlZC1kaWFsLWl0ZW0uanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXNwZWVkLWRpYWwuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXNwbGl0dGVyLWNvbnRlbnQuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXNwbGl0dGVyLW1hc2suanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXNwbGl0dGVyL2FuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zcGxpdHRlci9vdmVybGF5LWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zcGxpdHRlci9wdXNoLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zcGxpdHRlci9yZXZlYWwtYW5pbWF0b3IuanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXNwbGl0dGVyLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zcGxpdHRlci1zaWRlLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy1zd2l0Y2guanMiLCIuLi9lc20vZWxlbWVudHMvb25zLXRhYmJhci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtdGFiLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy10b2FzdC9hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtdG9hc3QvZmFkZS1hbmltYXRvci5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtdG9hc3QvYXNjZW5kLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy10b2FzdC9saWZ0LWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy10b2FzdC9mYWxsLWFuaW1hdG9yLmpzIiwiLi4vZXNtL2VsZW1lbnRzL29ucy10b2FzdC5qcyIsIi4uL2VzbS9lbGVtZW50cy9vbnMtdG9vbGJhci1idXR0b24uanMiLCIuLi9lc20vaW5kZXgudW1kLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbi8vIFNhdmUgSFRNTEVsZW1lbnQgb2JqZWN0IGJlZm9yZSBDdXN0b20gRWxlbWVudHMgcG9seWZpbGwgcGF0Y2ggZ2xvYmFsIEhUTUxFbGVtZW50LlxuY29uc3QgTmF0aXZlSFRNTEVsZW1lbnQgPSB3aW5kb3cuSFRNTEVsZW1lbnQ7XG5cbi8qKlxuICogQG9iamVjdCBvbnMucGxhdGZvcm1cbiAqIEBjYXRlZ29yeSB1dGlsXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVV0aWxpdHkgbWV0aG9kcyB0byBkZXRlY3QgY3VycmVudCBwbGF0Zm9ybS5bL2VuXVxuICogICBbamFd54++5Zyo5a6f6KGM44GV44KM44Gm44GE44KL44OX44Op44OD44OI44OV44Kp44O844Og44KS5qSc55+l44GZ44KL44Gf44KB44Gu44Om44O844OG44Kj44Oq44OG44Kj44Oh44K944OD44OJ44KS5Y+O44KB44Gf44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAqL1xuY2xhc3MgUGxhdGZvcm0ge1xuXG4gIC8qKlxuICAgKiBBbGwgZWxlbWVudHMgd2lsbCBiZSByZW5kZXJlZCBhcyBpZiB0aGUgYXBwIHdhcyBydW5uaW5nIG9uIHRoaXMgcGxhdGZvcm0uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9zZWxlY3RlZFBsYXRmb3JtID0gbnVsbDtcbiAgICB0aGlzLl9pZ25vcmVQbGF0Zm9ybVNlbGVjdCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2VsZWN0XG4gICAqIEBzaWduYXR1cmUgc2VsZWN0KHBsYXRmb3JtKVxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHBsYXRmb3JtIE5hbWUgb2YgdGhlIHBsYXRmb3JtLlxuICAgKiAgIFtlbl1Qb3NzaWJsZSB2YWx1ZXMgYXJlOiBcIm9wZXJhXCIsIFwiZmlyZWZveFwiLCBcInNhZmFyaVwiLCBcImNocm9tZVwiLCBcImllXCIsIFwiYW5kcm9pZFwiLCBcImJsYWNrYmVycnlcIiwgXCJpb3NcIiBvciBcIndwXCIuWy9lbl1cbiAgICogICBbamFdXCJvcGVyYVwiLCBcImZpcmVmb3hcIiwgXCJzYWZhcmlcIiwgXCJjaHJvbWVcIiwgXCJpZVwiLCBcImFuZHJvaWRcIiwgXCJibGFja2JlcnJ5XCIsIFwiaW9zXCIsIFwid3BcIuOBruOBhOOBmuOCjOOBi+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TZXRzIHRoZSBwbGF0Zm9ybSB1c2VkIHRvIHJlbmRlciB0aGUgZWxlbWVudHMuIFVzZWZ1bCBmb3IgdGVzdGluZy5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgpLmj4/nlLvjgZnjgovjgZ/jgoHjgavliKnnlKjjgZnjgovjg5fjg6njg4Pjg4jjg5Xjgqnjg7zjg6DlkI3jgpLoqK3lrprjgZfjgb7jgZnjgILjg4bjgrnjg4jjgavkvr/liKnjgafjgZnjgIJbL2phXVxuICAgKi9cbiAgc2VsZWN0KHBsYXRmb3JtKSB7XG4gICAgaWYgKHR5cGVvZiBwbGF0Zm9ybSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUGxhdGZvcm0gPSBwbGF0Zm9ybS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gIH1cblxuICBfZ2V0U2VsZWN0ZWRQbGF0Zm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5faWdub3JlUGxhdGZvcm1TZWxlY3QgPyBudWxsIDogdGhpcy5fc2VsZWN0ZWRQbGF0Zm9ybTtcbiAgfVxuXG4gIF9ydW5PbkFjdHVhbFBsYXRmb3JtKGZuKSB7XG4gICAgdGhpcy5faWdub3JlUGxhdGZvcm1TZWxlY3QgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IGZuKCk7XG4gICAgdGhpcy5faWdub3JlUGxhdGZvcm1TZWxlY3QgPSBmYWxzZTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gR2VuZXJhbFxuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIEBtZXRob2QgaXNXZWJWaWV3XG4gICAqIEBzaWduYXR1cmUgaXNXZWJWaWV3KClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciBhcHAgaXMgcnVubmluZyBpbiBDb3Jkb3ZhLlsvZW5dXG4gICAqICAgW2phXUNvcmRvdmHlhoXjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNXZWJWaWV3KCkge1xuICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAndW5pbml0aWFsaXplZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaXNXZWJWaWV3KCkgbWV0aG9kIGlzIGF2YWlsYWJsZSBhZnRlciBkb20gY29udGVudHMgbG9hZGVkLicpO1xuICAgIH1cblxuICAgIHJldHVybiAhISh3aW5kb3cuY29yZG92YSB8fCB3aW5kb3cucGhvbmVnYXAgfHwgd2luZG93LlBob25lR2FwKTtcbiAgfVxuXG4gIC8vLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBpT1MgZGV2aWNlc1xuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIEBtZXRob2QgaXNJUGhvbmVcbiAgICogQHNpZ25hdHVyZSBpc0lQaG9uZSgpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGRldmljZSBpcyBpUGhvbmUuWy9lbl1cbiAgICogICBbamFdaVBob25l5LiK44Gn5a6f6KGM44GV44KM44Gm44GE44KL44GL44Gp44GG44GL44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGlzSVBob25lKCkge1xuICAgIHJldHVybiAvaVBob25lL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzSVBob25lWFxuICAgKiBAc2lnbmF0dXJlIGlzSVBob25lWCgpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGRldmljZSBpcyBpUGhvbmUgWCwgWFMsIFhTIE1heCwgWFIsIDExLCAxMSBQcm8sIDExIFBybyBNYXgsIDEyIE1pbmksIDEyLCAxMiBQcm8gb3IgMTIgUHJvIE1heC5bL2VuXVxuICAgKiAgIFtqYV1pUGhvbmUgWCDjgoQgWFPjgIFYUyBNYXjjgIFYUuOAgTEx44CBMTEgUHJv44CBMTEgUHJvIE1heOOAgTEyIE1pbmnjgIExMuOAgTEyIFByb+OAgeOBvuOBn+OBrzEyIFBybyBNYXjkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNJUGhvbmVYKCkge1xuICAgIC8vIGlPUyBXZWJWaWV3cyBvbiB0aGUgc2FtZSBpT1MgdmVyc2lvbiBoYXZlIHRoZSBzYW1lIHVzZXIgYWdlbnQuXG4gICAgLy8gV2UgY2Fubm90IGF2b2lkIHVzaW5nIHdpbmRvdy5zY3JlZW4uXG4gICAgLy8gV2UgYWxzbyBjYW5ub3QgdXNlIGNvcmRvdmEtcGx1Z2luLWRldmljZSBzaW5jZSBpdHMgYmVoYXZpb3IgaXMgZGlmZmVyZW50IGJldHdlZW4gc2ltdWxhdG9ycyBhbmQgcmVhbCBkZXZpY2VzLlxuICAgIC8vIFRoaXMgd29ya3Mgd2VsbCBib3RoIGluIGlPUyBTYWZhcmkgYW5kIChVSXxXSylXZWJWaWV3IG9mIGlQaG9uZSBYLlxuICAgIHJldHVybiB0aGlzLmlzSVBob25lKCkgJiZcbiAgICAgIChcbiAgICAgICAgLy8gWCwgWFMsIDExIFBybywgMTIgTWluaVxuICAgICAgICB3aW5kb3cuc2NyZWVuLndpZHRoID09PSAzNzUgJiYgd2luZG93LnNjcmVlbi5oZWlnaHQgPT09IDgxMiB8fCAvLyBwb3J0cmFpdFxuICAgICAgICB3aW5kb3cuc2NyZWVuLndpZHRoID09PSA4MTIgJiYgd2luZG93LnNjcmVlbi5oZWlnaHQgPT09IDM3NSB8fCAvLyBsYW5kc2NhcGVcblxuICAgICAgICAvLyBYUyBNYXgsIFhSLCAxMSwgMTEgUHJvIE1heFxuICAgICAgICB3aW5kb3cuc2NyZWVuLndpZHRoID09PSA0MTQgJiYgd2luZG93LnNjcmVlbi5oZWlnaHQgPT09IDg5NiB8fCAvLyBwb3J0cmFpdFxuICAgICAgICB3aW5kb3cuc2NyZWVuLndpZHRoID09PSA4OTYgJiYgd2luZG93LnNjcmVlbi5oZWlnaHQgPT09IDQxNCB8fCAvLyBsYW5kc2NhcGVcblxuICAgICAgICAvLyAxMiwgMTIgUHJvXG4gICAgICAgIHdpbmRvdy5zY3JlZW4ud2lkdGggPT09IDM5MCAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA9PT0gODQ0IHx8IC8vIHBvcnRyYWl0XG4gICAgICAgIHdpbmRvdy5zY3JlZW4ud2lkdGggPT09IDg0NCAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA9PT0gMzkwIHx8IC8vIGxhbmRzY2FwZVxuXG4gICAgICAgIC8vIDEyIFBybyBNYXhcbiAgICAgICAgd2luZG93LnNjcmVlbi53aWR0aCA9PT0gNDI4ICYmIHdpbmRvdy5zY3JlZW4uaGVpZ2h0ID09PSA5MjYgfHwgLy8gcG9ydHJhaXRcbiAgICAgICAgd2luZG93LnNjcmVlbi53aWR0aCA9PT0gOTI2ICYmIHdpbmRvdy5zY3JlZW4uaGVpZ2h0ID09PSA0MjggIC8vIGxhbmRzY2FwZVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzSVBhZFxuICAgKiBAc2lnbmF0dXJlIGlzSVBhZCgpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGRldmljZSBpcyBpUGFkLlsvZW5dXG4gICAqICAgW2phXWlQYWTkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNJUGFkKCkge1xuICAgIHJldHVybiAvaVBhZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgdGhpcy5pc0lQYWRPUygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBpc0lQb2QoKSB7XG4gICAgcmV0dXJuIC9pUG9kL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgfVxuXG4gIC8vLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBpT1MgdmVyc2lvbnNcbiAgLy8tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzSU9TXG4gICAqIEBzaWduYXR1cmUgaXNJT1MoW2ZvcmNlQWN0dWFsUGxhdGZvcm1dKVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGZvcmNlQWN0dWFsUGxhdGZvcm1cbiAgICogICBbZW5dSWYgdHJ1ZSwgc2VsZWN0ZWQgcGxhdGZvcm0gaXMgaWdub3JlZCBhbmQgdGhlIGFjdHVhbCBwbGF0Zm9ybSBpcyByZXR1cm5lZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmV0dXJucyB3aGV0aGVyIHRoZSBPUyBpcyBpT1MuIEJ5IGRlZmF1bHQgd2lsbCByZXR1cm4gbWFudWFsbHkgc2VsZWN0ZWQgcGxhdGZvcm0gaWYgaXQgaXMgc2V0LlsvZW5dXG4gICAqICAgW2phXWlPU+S4iuOBp+Wun+ihjOOBleOCjOOBpuOBhOOCi+OBi+OBqeOBhuOBi+OCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBpc0lPUyhmb3JjZUFjdHVhbFBsYXRmb3JtKSB7XG4gICAgaWYgKCFmb3JjZUFjdHVhbFBsYXRmb3JtICYmIHRoaXMuX2dldFNlbGVjdGVkUGxhdGZvcm0oKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFNlbGVjdGVkUGxhdGZvcm0oKSA9PT0gJ2lvcyc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkZXZpY2UgPT09ICdvYmplY3QnICYmICEvYnJvd3Nlci9pLnRlc3QoZGV2aWNlLnBsYXRmb3JtKSkge1xuICAgICAgcmV0dXJuIC9pT1MvaS50ZXN0KGRldmljZS5wbGF0Zm9ybSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAvaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgdGhpcy5pc0lQYWRPUygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzSU9TN2Fib3ZlXG4gICAqIEBzaWduYXR1cmUgaXNJT1M3YWJvdmUoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmV0dXJucyB3aGV0aGVyIHRoZSBpT1MgdmVyc2lvbiBpcyA3IG9yIGFib3ZlLlsvZW5dXG4gICAqICAgW2phXWlPUzfku6XkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNJT1M3YWJvdmUoKSB7XG4gICAgaWYgKHR5cGVvZiBkZXZpY2UgPT09ICdvYmplY3QnICYmICEvYnJvd3Nlci9pLnRlc3QoZGV2aWNlLnBsYXRmb3JtKSkge1xuICAgICAgcmV0dXJuICgvaU9TL2kudGVzdChkZXZpY2UucGxhdGZvcm0pICYmIChwYXJzZUludChkZXZpY2UudmVyc2lvbi5zcGxpdCgnLicpWzBdKSA+PSA3KSk7XG4gICAgfSBlbHNlIGlmICgvaVBob25lfGlQYWR8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgIGNvbnN0IHZlciA9IChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9cXGJbMC05XStfWzAtOV0rKD86X1swLTldKyk/XFxiLykgfHwgWycnXSlbMF0ucmVwbGFjZSgvXy9nLCAnLicpO1xuICAgICAgcmV0dXJuIChwYXJzZUludCh2ZXIuc3BsaXQoJy4nKVswXSkgPj0gNyk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzSVBhZE9TXG4gICAqIEBzaWduYXR1cmUgaXNJUGFkT1MoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmV0dXJucyB3aGV0aGVyIHRoZSBPUyBpcyBpUGFkT1MuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGlzSVBhZE9TKCkge1xuICAgIC8vIFRoZSBpUGFkT1MgVXNlciBBZ2VudCBzdHJpbmcgaXMgdGhlIHNhbWUgYXMgTWFjT1Mgc28gYXMgYVxuICAgIC8vIHdvcmthcm91bmQgd2UgdGVzdCB0aGUgbWF4IHRvdWNoIHBvaW50cywgd2hpY2ggaXMgNSBmb3JcbiAgICAvLyBpUGFkcyBhbmQgMCBmb3IgZGVza3RvcCBicm93c2Vycy5cbiAgICByZXR1cm4gISEoL01hY2ludG9zaC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzICYmIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA9PT0gNSk7XG4gIH1cblxuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gaU9TIGJyb3dzZXJzXG4gIC8vLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogQG1ldGhvZCBpc0lPU1NhZmFyaVxuICAgKiBAc2lnbmF0dXJlIGlzSU9TU2FmYXJpKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciBhcHAgaXMgcnVubmluZyBpbiBpT1MgU2FmYXJpLlsvZW5dXG4gICAqICAgW2phXWlPUyBTYWZhcmnjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNJT1NTYWZhcmkoKSB7XG4gICAgY29uc3QgbmF2aWdhdG9yID0gd2luZG93Lm5hdmlnYXRvcjtcbiAgICBjb25zdCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7XG5cbiAgICByZXR1cm4gISEodGhpcy5pc0lPUygpICYmIHVhLmluZGV4T2YoJ1NhZmFyaScpICE9PSAtMSAmJiB1YS5pbmRleE9mKCdWZXJzaW9uJykgIT09IC0xICYmICFuYXZpZ2F0b3Iuc3RhbmRhbG9uZSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBpc1dLV2ViVmlld1xuICAgKiBAc2lnbmF0dXJlIGlzV0tXZWJWaWV3KClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciBhcHAgaXMgcnVubmluZyBpbiBXS1dlYlZpZXcuWy9lbl1cbiAgICogICBbamFdV0tXZWJWaWV344Gn5a6f6KGM44GV44KM44Gm44GE44KL44GL44Gp44GG44GL44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGlzV0tXZWJWaWV3KCkge1xuICAgIGNvbnN0IGx0ZTkgPSAvY29uc3RydWN0b3IvaS50ZXN0KE5hdGl2ZUhUTUxFbGVtZW50KTtcbiAgICByZXR1cm4gISEodGhpcy5pc0lPUygpICYmIHdpbmRvdy53ZWJraXQgJiYgd2luZG93LndlYmtpdC5tZXNzYWdlSGFuZGxlcnMgJiYgd2luZG93LmluZGV4ZWREQiAmJiAhbHRlOSk7XG4gIH1cblxuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQW5kcm9pZCBkZXZpY2VzXG4gIC8vLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogQG1ldGhvZCBpc0FuZHJvaWRQaG9uZVxuICAgKiBAc2lnbmF0dXJlIGlzQW5kcm9pZFBob25lKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciB0aGUgZGV2aWNlIGlzIEFuZHJvaWQgcGhvbmUuWy9lbl1cbiAgICogICBbamFdQW5kcm9pZOaQuuW4r+S4iuOBp+Wun+ihjOOBleOCjOOBpuOBhOOCi+OBi+OBqeOBhuOBi+OCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBpc0FuZHJvaWRQaG9uZSgpIHtcbiAgICByZXR1cm4gL0FuZHJvaWQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmIC9Nb2JpbGUvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaXNBbmRyb2lkVGFibGV0XG4gICAqIEBzaWduYXR1cmUgaXNBbmRyb2lkVGFibGV0KClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciB0aGUgZGV2aWNlIGlzIEFuZHJvaWQgdGFibGV0LlsvZW5dXG4gICAqICAgW2phXUFuZHJvaWTjgr/jg5bjg6zjg4Pjg4jkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNBbmRyb2lkVGFibGV0KCkge1xuICAgIHJldHVybiAvQW5kcm9pZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgIS9Nb2JpbGUvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICB9XG5cbiAgLy8tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEFuZHJvaWQgdmVyc2lvbnNcbiAgLy8tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzQW5kcm9pZFxuICAgKiBAc2lnbmF0dXJlIGlzQW5kcm9pZChbZm9yY2VBY3R1YWxQbGF0Zm9ybV0pXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2VBY3R1YWxQbGF0Zm9ybVxuICAgKiAgIFtlbl1JZiB0cnVlLCBzZWxlY3RlZCBwbGF0Zm9ybSBpcyBpZ25vcmVkIGFuZCB0aGUgYWN0dWFsIHBsYXRmb3JtIGlzIHJldHVybmVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIE9TIGlzIEFuZHJvaWQuIEJ5IGRlZmF1bHQgd2lsbCByZXR1cm4gbWFudWFsbHkgc2VsZWN0ZWQgcGxhdGZvcm0gaWYgaXQgaXMgc2V0LlsvZW5dXG4gICAqICAgW2phXUFuZHJvaWTkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNBbmRyb2lkKGZvcmNlQWN0dWFsUGxhdGZvcm0pIHtcbiAgICBpZiAoIWZvcmNlQWN0dWFsUGxhdGZvcm0gJiYgdGhpcy5fZ2V0U2VsZWN0ZWRQbGF0Zm9ybSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0U2VsZWN0ZWRQbGF0Zm9ybSgpID09PSAnYW5kcm9pZCc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkZXZpY2UgPT09ICdvYmplY3QnICYmICEvYnJvd3Nlci9pLnRlc3QoZGV2aWNlLnBsYXRmb3JtKSkge1xuICAgICAgcmV0dXJuIC9BbmRyb2lkL2kudGVzdChkZXZpY2UucGxhdGZvcm0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gL0FuZHJvaWQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBPdGhlciBkZXZpY2VzXG4gIC8vLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogQG1ldGhvZCBpc1dQXG4gICAqIEBzaWduYXR1cmUgaXNXUChbZm9yY2VBY3R1YWxQbGF0Zm9ybV0pXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2VBY3R1YWxQbGF0Zm9ybVxuICAgKiAgIFtlbl1JZiB0cnVlLCBzZWxlY3RlZCBwbGF0Zm9ybSBpcyBpZ25vcmVkIGFuZCB0aGUgYWN0dWFsIHBsYXRmb3JtIGlzIHJldHVybmVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIE9TIGlzIFdpbmRvd3MgcGhvbmUuIEJ5IGRlZmF1bHQgd2lsbCByZXR1cm4gbWFudWFsbHkgc2VsZWN0ZWQgcGxhdGZvcm0gaWYgaXQgaXMgc2V0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBpc1dQKGZvcmNlQWN0dWFsUGxhdGZvcm0pIHtcbiAgICBpZiAoIWZvcmNlQWN0dWFsUGxhdGZvcm0gJiYgdGhpcy5fZ2V0U2VsZWN0ZWRQbGF0Zm9ybSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0U2VsZWN0ZWRQbGF0Zm9ybSgpID09PSAnd3AnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGV2aWNlID09PSAnb2JqZWN0JyAmJiAhL2Jyb3dzZXIvaS50ZXN0KGRldmljZS5wbGF0Zm9ybSkpIHtcbiAgICAgIHJldHVybiAvV2luMzJOVHxXaW5DRS9pLnRlc3QoZGV2aWNlLnBsYXRmb3JtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIC9XaW5kb3dzIFBob25lfElFTW9iaWxlfFdQRGVza3RvcC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaXNCbGFja0JlcnJ5XG4gICAqIEBzaWduYXR1cmUgaXNCbGFja0JlcnJ5KFtmb3JjZUFjdHVhbFBsYXRmb3JtXSlcbiAgICogQHBhcmFtIHtCb29sZWFufSBmb3JjZUFjdHVhbFBsYXRmb3JtXG4gICAqICAgW2VuXUlmIHRydWUsIHNlbGVjdGVkIHBsYXRmb3JtIGlzIGlnbm9yZWQgYW5kIHRoZSBhY3R1YWwgcGxhdGZvcm0gaXMgcmV0dXJuZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciB0aGUgZGV2aWNlIGlzIEJsYWNrQmVycnkuIEJ5IGRlZmF1bHQgd2lsbCByZXR1cm4gbWFudWFsbHkgc2VsZWN0ZWQgcGxhdGZvcm0gaWYgaXQgaXMgc2V0LlsvZW5dXG4gICAqICAgW2phXUJsYWNrQmVycnnkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNCbGFja0JlcnJ5KGZvcmNlQWN0dWFsUGxhdGZvcm0pIHtcbiAgICBpZiAoIWZvcmNlQWN0dWFsUGxhdGZvcm0gJiYgdGhpcy5fZ2V0U2VsZWN0ZWRQbGF0Zm9ybSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0U2VsZWN0ZWRQbGF0Zm9ybSgpID09PSAnYmxhY2tiZXJyeSc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkZXZpY2UgPT09ICdvYmplY3QnICYmICEvYnJvd3Nlci9pLnRlc3QoZGV2aWNlLnBsYXRmb3JtKSkge1xuICAgICAgcmV0dXJuIC9CbGFja0JlcnJ5L2kudGVzdChkZXZpY2UucGxhdGZvcm0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gL0JsYWNrQmVycnl8UklNIFRhYmxldCBPU3xCQjEwL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICB9XG4gIH1cblxuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gT3RoZXIgYnJvd3NlcnNcbiAgLy8tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzT3BlcmFcbiAgICogQHNpZ25hdHVyZSBpc09wZXJhKFtmb3JjZUFjdHVhbFBsYXRmb3JtXSlcbiAgICogQHBhcmFtIHtCb29sZWFufSBmb3JjZUFjdHVhbFBsYXRmb3JtXG4gICAqICAgW2VuXUlmIHRydWUsIHNlbGVjdGVkIHBsYXRmb3JtIGlzIGlnbm9yZWQgYW5kIHRoZSBhY3R1YWwgcGxhdGZvcm0gaXMgcmV0dXJuZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciB0aGUgYnJvd3NlciBpcyBPcGVyYS4gQnkgZGVmYXVsdCB3aWxsIHJldHVybiBtYW51YWxseSBzZWxlY3RlZCBwbGF0Zm9ybSBpZiBpdCBpcyBzZXQuWy9lbl1cbiAgICogICBbamFdT3BlcmHkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNPcGVyYShmb3JjZUFjdHVhbFBsYXRmb3JtKSB7XG4gICAgaWYgKCFmb3JjZUFjdHVhbFBsYXRmb3JtICYmIHRoaXMuX2dldFNlbGVjdGVkUGxhdGZvcm0oKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFNlbGVjdGVkUGxhdGZvcm0oKSA9PT0gJ29wZXJhJztcbiAgICB9XG5cbiAgICByZXR1cm4gKCEhd2luZG93Lm9wZXJhIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignIE9QUi8nKSA+PSAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGlzRmlyZWZveFxuICAgKiBAc2lnbmF0dXJlIGlzRmlyZWZveChbZm9yY2VBY3R1YWxQbGF0Zm9ybV0pXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2VBY3R1YWxQbGF0Zm9ybVxuICAgKiAgIFtlbl1JZiB0cnVlLCBzZWxlY3RlZCBwbGF0Zm9ybSBpcyBpZ25vcmVkIGFuZCB0aGUgYWN0dWFsIHBsYXRmb3JtIGlzIHJldHVybmVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGJyb3dzZXIgaXMgRmlyZWZveC4gQnkgZGVmYXVsdCB3aWxsIHJldHVybiBtYW51YWxseSBzZWxlY3RlZCBwbGF0Zm9ybSBpZiBpdCBpcyBzZXQuWy9lbl1cbiAgICogICBbamFdRmlyZWZveOS4iuOBp+Wun+ihjOOBleOCjOOBpuOBhOOCi+OBi+OBqeOBhuOBi+OCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBpc0ZpcmVmb3goZm9yY2VBY3R1YWxQbGF0Zm9ybSkge1xuICAgIGlmICghZm9yY2VBY3R1YWxQbGF0Zm9ybSAmJiB0aGlzLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkgPT09ICdmaXJlZm94JztcbiAgICB9XG5cbiAgICByZXR1cm4gKHR5cGVvZiBJbnN0YWxsVHJpZ2dlciAhPT0gJ3VuZGVmaW5lZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaXNTYWZhcmlcbiAgICogQHNpZ25hdHVyZSBpc1NhZmFyaShbZm9yY2VBY3R1YWxQbGF0Zm9ybV0pXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2VBY3R1YWxQbGF0Zm9ybVxuICAgKiAgIFtlbl1JZiB0cnVlLCBzZWxlY3RlZCBwbGF0Zm9ybSBpcyBpZ25vcmVkIGFuZCB0aGUgYWN0dWFsIHBsYXRmb3JtIGlzIHJldHVybmVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGJyb3dzZXIgaXMgU2FmYXJpLiBCeSBkZWZhdWx0IHdpbGwgcmV0dXJuIG1hbnVhbGx5IHNlbGVjdGVkIHBsYXRmb3JtIGlmIGl0IGlzIHNldC5bL2VuXVxuICAgKiAgIFtqYV1TYWZhcmnkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNTYWZhcmkoZm9yY2VBY3R1YWxQbGF0Zm9ybSkge1xuICAgIGlmICghZm9yY2VBY3R1YWxQbGF0Zm9ybSAmJiB0aGlzLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkgPT09ICdzYWZhcmknO1xuICAgIH1cblxuICAgIHJldHVybiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdy5IVE1MRWxlbWVudCkuaW5kZXhPZignQ29uc3RydWN0b3InKSA+IDApIHx8IChmdW5jdGlvbiAocCkgeyByZXR1cm4gcC50b1N0cmluZygpID09PSAnW29iamVjdCBTYWZhcmlSZW1vdGVOb3RpZmljYXRpb25dJzsgfSkoIXdpbmRvd1snc2FmYXJpJ10gfHwgc2FmYXJpLnB1c2hOb3RpZmljYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaXNDaHJvbWVcbiAgICogQHNpZ25hdHVyZSBpc0Nocm9tZShbZm9yY2VBY3R1YWxQbGF0Zm9ybV0pXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2VBY3R1YWxQbGF0Zm9ybVxuICAgKiAgIFtlbl1JZiB0cnVlLCBzZWxlY3RlZCBwbGF0Zm9ybSBpcyBpZ25vcmVkIGFuZCB0aGUgYWN0dWFsIHBsYXRmb3JtIGlzIHJldHVybmVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGJyb3dzZXIgaXMgQ2hyb21lLiBCeSBkZWZhdWx0IHdpbGwgcmV0dXJuIG1hbnVhbGx5IHNlbGVjdGVkIHBsYXRmb3JtIGlmIGl0IGlzIHNldC5bL2VuXVxuICAgKiAgIFtqYV1DaHJvbWXkuIrjgaflrp/ooYzjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNDaHJvbWUoZm9yY2VBY3R1YWxQbGF0Zm9ybSkge1xuICAgIGlmICghZm9yY2VBY3R1YWxQbGF0Zm9ybSAmJiB0aGlzLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkgPT09ICdjaHJvbWUnO1xuICAgIH1cblxuICAgIHJldHVybiAoISF3aW5kb3cuY2hyb21lICYmICEoISF3aW5kb3cub3BlcmEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCcgT1BSLycpID49IDApICYmICEobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCcgRWRnZS8nKSA+PSAwKSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBpc0lFXG4gICAqIEBzaWduYXR1cmUgaXNJRShbZm9yY2VBY3R1YWxQbGF0Zm9ybV0pXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZm9yY2VBY3R1YWxQbGF0Zm9ybVxuICAgKiAgIFtlbl1JZiB0cnVlLCBzZWxlY3RlZCBwbGF0Zm9ybSBpcyBpZ25vcmVkIGFuZCB0aGUgYWN0dWFsIHBsYXRmb3JtIGlzIHJldHVybmVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIGJyb3dzZXIgaXMgSW50ZXJuZXQgRXhwbG9yZXIuIEJ5IGRlZmF1bHQgd2lsbCByZXR1cm4gbWFudWFsbHkgc2VsZWN0ZWQgcGxhdGZvcm0gaWYgaXQgaXMgc2V0LlsvZW5dXG4gICAqICAgW2phXUludGVybmV0IEV4cGxvcmVy5LiK44Gn5a6f6KGM44GV44KM44Gm44GE44KL44GL44Gp44GG44GL44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGlzSUUoZm9yY2VBY3R1YWxQbGF0Zm9ybSkge1xuICAgIGlmICghZm9yY2VBY3R1YWxQbGF0Zm9ybSAmJiB0aGlzLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkgPT09ICdpZSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlIHx8ICEhZG9jdW1lbnQuZG9jdW1lbnRNb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaXNFZGdlXG4gICAqIEBzaWduYXR1cmUgaXNFZGdlKFtmb3JjZUFjdHVhbFBsYXRmb3JtXSlcbiAgICogQHBhcmFtIHtCb29sZWFufSBmb3JjZUFjdHVhbFBsYXRmb3JtXG4gICAqICAgW2VuXUlmIHRydWUsIHNlbGVjdGVkIHBsYXRmb3JtIGlzIGlnbm9yZWQgYW5kIHRoZSBhY3R1YWwgcGxhdGZvcm0gaXMgcmV0dXJuZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgd2hldGhlciB0aGUgYnJvd3NlciBpcyBFZGdlLiBCeSBkZWZhdWx0IHdpbGwgcmV0dXJuIG1hbnVhbGx5IHNlbGVjdGVkIHBsYXRmb3JtIGlmIGl0IGlzIHNldC5bL2VuXVxuICAgKiAgIFtqYV1FZGdl5LiK44Gn5a6f6KGM44GV44KM44Gm44GE44KL44GL44Gp44GG44GL44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGlzRWRnZShmb3JjZUFjdHVhbFBsYXRmb3JtKSB7XG4gICAgaWYgKCFmb3JjZUFjdHVhbFBsYXRmb3JtICYmIHRoaXMuX2dldFNlbGVjdGVkUGxhdGZvcm0oKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldFNlbGVjdGVkUGxhdGZvcm0oKSA9PT0gJ2VkZ2UnO1xuICAgIH1cblxuICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJyBFZGdlLycpID49IDA7XG4gIH1cblxuICAvLy0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gVXRpbGl0eSBmdW5jdGlvbnNcbiAgLy8tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAqL1xuICBnZXRNb2JpbGVPUygpIHtcbiAgICBpZiAodGhpcy5pc0FuZHJvaWQoKSkge1xuICAgICAgcmV0dXJuICdhbmRyb2lkJztcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpcy5pc0lPUygpKSB7XG4gICAgICByZXR1cm4gJ2lvcyc7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMuaXNXUCgpKSB7XG4gICAgICByZXR1cm4gJ3dwJztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gJ290aGVyJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7U3RyaW5nfVxuICAgKi9cbiAgZ2V0SU9TRGV2aWNlKCkge1xuICAgIGlmICh0aGlzLmlzSVBob25lKCkpIHtcbiAgICAgIHJldHVybiAnaXBob25lJztcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpcy5pc0lQYWQoKSkge1xuICAgICAgcmV0dXJuICdpcGFkJztcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpcy5pc0lQb2QoKSkge1xuICAgICAgcmV0dXJuICdpcG9kJztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gJ25hJztcbiAgICB9XG4gIH1cbn1cblxuXG5leHBvcnQgZGVmYXVsdCBuZXcgUGxhdGZvcm0oKTtcbiIsIi8vIEZvciBAb25zZW51aS9jdXN0b20tZWxlbWVudHNcbmlmICh3aW5kb3cuY3VzdG9tRWxlbWVudHMpIHsgLy8gZXZlbiBpZiBuYXRpdmUgQ0UxIGltcGwgZXhpc3RzLCB1c2UgcG9seWZpbGxcbiAgICB3aW5kb3cuY3VzdG9tRWxlbWVudHMuZm9yY2VQb2x5ZmlsbCA9IHRydWU7XG59XG4iLCIoZnVuY3Rpb24oKXtcbid1c2Ugc3RyaWN0Jzt2YXIgZz1uZXcgZnVuY3Rpb24oKXt9O3ZhciBhYT1uZXcgU2V0KFwiYW5ub3RhdGlvbi14bWwgY29sb3ItcHJvZmlsZSBmb250LWZhY2UgZm9udC1mYWNlLXNyYyBmb250LWZhY2UtdXJpIGZvbnQtZmFjZS1mb3JtYXQgZm9udC1mYWNlLW5hbWUgbWlzc2luZy1nbHlwaFwiLnNwbGl0KFwiIFwiKSk7ZnVuY3Rpb24gayhiKXt2YXIgYT1hYS5oYXMoYik7Yj0vXlthLXpdWy4wLTlfYS16XSotW1xcLS4wLTlfYS16XSokLy50ZXN0KGIpO3JldHVybiFhJiZifWZ1bmN0aW9uIGwoYil7dmFyIGE9Yi5pc0Nvbm5lY3RlZDtpZih2b2lkIDAhPT1hKXJldHVybiBhO2Zvcig7YiYmIShiLl9fQ0VfaXNJbXBvcnREb2N1bWVudHx8YiBpbnN0YW5jZW9mIERvY3VtZW50KTspYj1iLnBhcmVudE5vZGV8fCh3aW5kb3cuU2hhZG93Um9vdCYmYiBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q/Yi5ob3N0OnZvaWQgMCk7cmV0dXJuISghYnx8IShiLl9fQ0VfaXNJbXBvcnREb2N1bWVudHx8YiBpbnN0YW5jZW9mIERvY3VtZW50KSl9XG5mdW5jdGlvbiBtKGIsYSl7Zm9yKDthJiZhIT09YiYmIWEubmV4dFNpYmxpbmc7KWE9YS5wYXJlbnROb2RlO3JldHVybiBhJiZhIT09Yj9hLm5leHRTaWJsaW5nOm51bGx9XG5mdW5jdGlvbiBuKGIsYSxlKXtlPWU/ZTpuZXcgU2V0O2Zvcih2YXIgYz1iO2M7KXtpZihjLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBkPWM7YShkKTt2YXIgaD1kLmxvY2FsTmFtZTtpZihcImxpbmtcIj09PWgmJlwiaW1wb3J0XCI9PT1kLmdldEF0dHJpYnV0ZShcInJlbFwiKSl7Yz1kLmltcG9ydDtpZihjIGluc3RhbmNlb2YgTm9kZSYmIWUuaGFzKGMpKWZvcihlLmFkZChjKSxjPWMuZmlyc3RDaGlsZDtjO2M9Yy5uZXh0U2libGluZyluKGMsYSxlKTtjPW0oYixkKTtjb250aW51ZX1lbHNlIGlmKFwidGVtcGxhdGVcIj09PWgpe2M9bShiLGQpO2NvbnRpbnVlfWlmKGQ9ZC5fX0NFX3NoYWRvd1Jvb3QpZm9yKGQ9ZC5maXJzdENoaWxkO2Q7ZD1kLm5leHRTaWJsaW5nKW4oZCxhLGUpfWM9Yy5maXJzdENoaWxkP2MuZmlyc3RDaGlsZDptKGIsYyl9fWZ1bmN0aW9uIHEoYixhLGUpe2JbYV09ZX07ZnVuY3Rpb24gcigpe3RoaXMuYT1uZXcgTWFwO3RoaXMuZj1uZXcgTWFwO3RoaXMuYz1bXTt0aGlzLmI9ITF9ZnVuY3Rpb24gYmEoYixhLGUpe2IuYS5zZXQoYSxlKTtiLmYuc2V0KGUuY29uc3RydWN0b3IsZSl9ZnVuY3Rpb24gdChiLGEpe2IuYj0hMDtiLmMucHVzaChhKX1mdW5jdGlvbiB2KGIsYSl7Yi5iJiZuKGEsZnVuY3Rpb24oYSl7cmV0dXJuIHcoYixhKX0pfWZ1bmN0aW9uIHcoYixhKXtpZihiLmImJiFhLl9fQ0VfcGF0Y2hlZCl7YS5fX0NFX3BhdGNoZWQ9ITA7Zm9yKHZhciBlPTA7ZTxiLmMubGVuZ3RoO2UrKyliLmNbZV0oYSl9fWZ1bmN0aW9uIHgoYixhKXt2YXIgZT1bXTtuKGEsZnVuY3Rpb24oYil7cmV0dXJuIGUucHVzaChiKX0pO2ZvcihhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBjPWVbYV07MT09PWMuX19DRV9zdGF0ZT9sKGMpJiZiLmNvbm5lY3RlZENhbGxiYWNrKGMpOnkoYixjKX19XG5mdW5jdGlvbiB6KGIsYSl7dmFyIGU9W107bihhLGZ1bmN0aW9uKGIpe3JldHVybiBlLnB1c2goYil9KTtmb3IoYT0wO2E8ZS5sZW5ndGg7YSsrKXt2YXIgYz1lW2FdOzE9PT1jLl9fQ0Vfc3RhdGUmJmIuZGlzY29ubmVjdGVkQ2FsbGJhY2soYyl9fVxuZnVuY3Rpb24gQShiLGEsZSl7ZT1lP2U6bmV3IFNldDt2YXIgYz1bXTtuKGEsZnVuY3Rpb24oZCl7aWYoXCJsaW5rXCI9PT1kLmxvY2FsTmFtZSYmXCJpbXBvcnRcIj09PWQuZ2V0QXR0cmlidXRlKFwicmVsXCIpKXt2YXIgYT1kLmltcG9ydDthIGluc3RhbmNlb2YgTm9kZSYmXCJjb21wbGV0ZVwiPT09YS5yZWFkeVN0YXRlPyhhLl9fQ0VfaXNJbXBvcnREb2N1bWVudD0hMCxhLl9fQ0VfaGFzUmVnaXN0cnk9ITApOmQuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIixmdW5jdGlvbigpe3ZhciBhPWQuaW1wb3J0O2EuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkfHwoYS5fX0NFX2RvY3VtZW50TG9hZEhhbmRsZWQ9ITAsYS5fX0NFX2lzSW1wb3J0RG9jdW1lbnQ9ITAsYS5fX0NFX2hhc1JlZ2lzdHJ5PSEwLG5ldyBTZXQoZSksZS5kZWxldGUoYSksQShiLGEsZSkpfSl9ZWxzZSBjLnB1c2goZCl9LGUpO2lmKGIuYilmb3IoYT0wO2E8Yy5sZW5ndGg7YSsrKXcoYixjW2FdKTtmb3IoYT0wO2E8Yy5sZW5ndGg7YSsrKXkoYixcbmNbYV0pfVxuZnVuY3Rpb24geShiLGEpe2lmKHZvaWQgMD09PWEuX19DRV9zdGF0ZSl7dmFyIGU9Yi5hLmdldChhLmxvY2FsTmFtZSk7aWYoZSl7ZS5jb25zdHJ1Y3Rpb25TdGFjay5wdXNoKGEpO3ZhciBjPWUuY29uc3RydWN0b3I7dHJ5e3RyeXtpZihuZXcgYyE9PWEpdGhyb3cgRXJyb3IoXCJUaGUgY3VzdG9tIGVsZW1lbnQgY29uc3RydWN0b3IgZGlkIG5vdCBwcm9kdWNlIHRoZSBlbGVtZW50IGJlaW5nIHVwZ3JhZGVkLlwiKTt9ZmluYWxseXtlLmNvbnN0cnVjdGlvblN0YWNrLnBvcCgpfX1jYXRjaChmKXt0aHJvdyBhLl9fQ0Vfc3RhdGU9MixmO31hLl9fQ0Vfc3RhdGU9MTthLl9fQ0VfZGVmaW5pdGlvbj1lO2lmKGUuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKWZvcihlPWUub2JzZXJ2ZWRBdHRyaWJ1dGVzLGM9MDtjPGUubGVuZ3RoO2MrKyl7dmFyIGQ9ZVtjXSxoPWEuZ2V0QXR0cmlidXRlKGQpO251bGwhPT1oJiZiLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhhLGQsbnVsbCxoLG51bGwpfWwoYSkmJmIuY29ubmVjdGVkQ2FsbGJhY2soYSl9fX1cbnIucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGIpe3ZhciBhPWIuX19DRV9kZWZpbml0aW9uO2EuY29ubmVjdGVkQ2FsbGJhY2smJmEuY29ubmVjdGVkQ2FsbGJhY2suY2FsbChiKTtiLmk9ITB9O3IucHJvdG90eXBlLmRpc2Nvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGIpe2IuaXx8dGhpcy5jb25uZWN0ZWRDYWxsYmFjayhiKTt2YXIgYT1iLl9fQ0VfZGVmaW5pdGlvbjthLmRpc2Nvbm5lY3RlZENhbGxiYWNrJiZhLmRpc2Nvbm5lY3RlZENhbGxiYWNrLmNhbGwoYik7Yi5pPXZvaWQgMH07ci5wcm90b3R5cGUuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrPWZ1bmN0aW9uKGIsYSxlLGMsZCl7dmFyIGg9Yi5fX0NFX2RlZmluaXRpb247aC5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2smJi0xPGgub2JzZXJ2ZWRBdHRyaWJ1dGVzLmluZGV4T2YoYSkmJmguYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrLmNhbGwoYixhLGUsYyxkKX07ZnVuY3Rpb24gQihiLGEpe3RoaXMuYz1iO3RoaXMuYT1hO3RoaXMuYj12b2lkIDA7QSh0aGlzLmMsdGhpcy5hKTtcImxvYWRpbmdcIj09PXRoaXMuYS5yZWFkeVN0YXRlJiYodGhpcy5iPW5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuZi5iaW5kKHRoaXMpKSx0aGlzLmIub2JzZXJ2ZSh0aGlzLmEse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSkpfWZ1bmN0aW9uIEMoYil7Yi5iJiZiLmIuZGlzY29ubmVjdCgpfUIucHJvdG90eXBlLmY9ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5hLnJlYWR5U3RhdGU7XCJpbnRlcmFjdGl2ZVwiIT09YSYmXCJjb21wbGV0ZVwiIT09YXx8Qyh0aGlzKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcih2YXIgZT1iW2FdLmFkZGVkTm9kZXMsYz0wO2M8ZS5sZW5ndGg7YysrKUEodGhpcy5jLGVbY10pfTtmdW5jdGlvbiBjYSgpe3ZhciBiPXRoaXM7dGhpcy5iPXRoaXMuYT12b2lkIDA7dGhpcy5jPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEpe2IuYj1hO2IuYSYmYShiLmEpfSl9ZnVuY3Rpb24gRChiKXtpZihiLmEpdGhyb3cgRXJyb3IoXCJBbHJlYWR5IHJlc29sdmVkLlwiKTtiLmE9dm9pZCAwO2IuYiYmYi5iKHZvaWQgMCl9O2Z1bmN0aW9uIEUoYil7dGhpcy5mPSExO3RoaXMuYT1iO3RoaXMuaD1uZXcgTWFwO3RoaXMuZz1mdW5jdGlvbihiKXtyZXR1cm4gYigpfTt0aGlzLmI9ITE7dGhpcy5jPVtdO3RoaXMubD1uZXcgQihiLGRvY3VtZW50KX1cbkUucHJvdG90eXBlLm09ZnVuY3Rpb24oYixhKXt2YXIgZT10aGlzO2lmKCEoYSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ3VzdG9tIGVsZW1lbnQgY29uc3RydWN0b3JzIG11c3QgYmUgZnVuY3Rpb25zLlwiKTtpZighayhiKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJUaGUgZWxlbWVudCBuYW1lICdcIitiK1wiJyBpcyBub3QgdmFsaWQuXCIpO2lmKHRoaXMuYS5hLmdldChiKSl0aHJvdyBFcnJvcihcIkEgY3VzdG9tIGVsZW1lbnQgd2l0aCBuYW1lICdcIitiK1wiJyBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuXCIpO2lmKHRoaXMuZil0aHJvdyBFcnJvcihcIkEgY3VzdG9tIGVsZW1lbnQgaXMgYWxyZWFkeSBiZWluZyBkZWZpbmVkLlwiKTt0aGlzLmY9ITA7dmFyIGMsZCxoLGYsdTt0cnl7dmFyIHA9ZnVuY3Rpb24oYil7dmFyIGE9UFtiXTtpZih2b2lkIDAhPT1hJiYhKGEgaW5zdGFuY2VvZiBGdW5jdGlvbikpdGhyb3cgRXJyb3IoXCJUaGUgJ1wiK2IrXCInIGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbi5cIik7XG5yZXR1cm4gYX0sUD1hLnByb3RvdHlwZTtpZighKFAgaW5zdGFuY2VvZiBPYmplY3QpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgY3VzdG9tIGVsZW1lbnQgY29uc3RydWN0b3IncyBwcm90b3R5cGUgaXMgbm90IGFuIG9iamVjdC5cIik7Yz1wKFwiY29ubmVjdGVkQ2FsbGJhY2tcIik7ZD1wKFwiZGlzY29ubmVjdGVkQ2FsbGJhY2tcIik7aD1wKFwiYWRvcHRlZENhbGxiYWNrXCIpO2Y9cChcImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja1wiKTt1PWEub2JzZXJ2ZWRBdHRyaWJ1dGVzfHxbXX1jYXRjaCh2YSl7cmV0dXJufWZpbmFsbHl7dGhpcy5mPSExfWJhKHRoaXMuYSxiLHtsb2NhbE5hbWU6Yixjb25zdHJ1Y3RvcjphLGNvbm5lY3RlZENhbGxiYWNrOmMsZGlzY29ubmVjdGVkQ2FsbGJhY2s6ZCxhZG9wdGVkQ2FsbGJhY2s6aCxhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s6ZixvYnNlcnZlZEF0dHJpYnV0ZXM6dSxjb25zdHJ1Y3Rpb25TdGFjazpbXX0pO3RoaXMuYy5wdXNoKGIpO3RoaXMuYnx8KHRoaXMuYj1cbiEwLHRoaXMuZyhmdW5jdGlvbigpe2lmKCExIT09ZS5iKWZvcihlLmI9ITEsQShlLmEsZG9jdW1lbnQpOzA8ZS5jLmxlbmd0aDspe3ZhciBiPWUuYy5zaGlmdCgpOyhiPWUuaC5nZXQoYikpJiZEKGIpfX0pKX07RS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGIpe2lmKGI9dGhpcy5hLmEuZ2V0KGIpKXJldHVybiBiLmNvbnN0cnVjdG9yfTtFLnByb3RvdHlwZS5zPWZ1bmN0aW9uKGIpe2lmKCFrKGIpKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgU3ludGF4RXJyb3IoXCInXCIrYitcIicgaXMgbm90IGEgdmFsaWQgY3VzdG9tIGVsZW1lbnQgbmFtZS5cIikpO3ZhciBhPXRoaXMuaC5nZXQoYik7aWYoYSlyZXR1cm4gYS5jO2E9bmV3IGNhO3RoaXMuaC5zZXQoYixhKTt0aGlzLmEuYS5nZXQoYikmJi0xPT09dGhpcy5jLmluZGV4T2YoYikmJkQoYSk7cmV0dXJuIGEuY307RS5wcm90b3R5cGUubz1mdW5jdGlvbihiKXtDKHRoaXMubCk7dmFyIGE9dGhpcy5nO3RoaXMuZz1mdW5jdGlvbihlKXtyZXR1cm4gYihmdW5jdGlvbigpe3JldHVybiBhKGUpfSl9fTtcbndpbmRvdy5DdXN0b21FbGVtZW50UmVnaXN0cnk9RTtFLnByb3RvdHlwZS5kZWZpbmU9RS5wcm90b3R5cGUubTtFLnByb3RvdHlwZS5nZXQ9RS5wcm90b3R5cGUuZ2V0O0UucHJvdG90eXBlLndoZW5EZWZpbmVkPUUucHJvdG90eXBlLnM7RS5wcm90b3R5cGUucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjaz1FLnByb3RvdHlwZS5vO3ZhciBGPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudCxkYT13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnROUyxlYT13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmltcG9ydE5vZGUsZmE9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5wcmVwZW5kLGdhPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUuYXBwZW5kLEc9d2luZG93Lk5vZGUucHJvdG90eXBlLmNsb25lTm9kZSxIPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZCxJPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUsSj13aW5kb3cuTm9kZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQsSz13aW5kb3cuTm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkLEw9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsXCJ0ZXh0Q29udGVudFwiKSxNPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hdHRhY2hTaGFkb3csTj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZSxcblwiaW5uZXJIVE1MXCIpLE89d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZSxRPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUsUj13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlLFM9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEF0dHJpYnV0ZU5TLFQ9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZU5TLFU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZU5TLFY9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50RWxlbWVudCxoYT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucHJlcGVuZCxpYT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYXBwZW5kLGphPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5iZWZvcmUsa2E9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFmdGVyLGxhPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5yZXBsYWNlV2l0aCxtYT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlLFxubmE9d2luZG93LkhUTUxFbGVtZW50LFc9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLFwiaW5uZXJIVE1MXCIpLFg9d2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEVsZW1lbnQ7ZnVuY3Rpb24gb2EoKXt2YXIgYj1ZO3dpbmRvdy5IVE1MRWxlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt2YXIgYT10aGlzLmNvbnN0cnVjdG9yLGM9Yi5mLmdldChhKTtpZighYyl0aHJvdyBFcnJvcihcIlRoZSBjdXN0b20gZWxlbWVudCBiZWluZyBjb25zdHJ1Y3RlZCB3YXMgbm90IHJlZ2lzdGVyZWQgd2l0aCBgY3VzdG9tRWxlbWVudHNgLlwiKTt2YXIgZD1jLmNvbnN0cnVjdGlvblN0YWNrO2lmKCFkLmxlbmd0aClyZXR1cm4gZD1GLmNhbGwoZG9jdW1lbnQsYy5sb2NhbE5hbWUpLE9iamVjdC5zZXRQcm90b3R5cGVPZihkLGEucHJvdG90eXBlKSxkLl9fQ0Vfc3RhdGU9MSxkLl9fQ0VfZGVmaW5pdGlvbj1jLHcoYixkKSxkO3ZhciBjPWQubGVuZ3RoLTEsaD1kW2NdO2lmKGg9PT1nKXRocm93IEVycm9yKFwiVGhlIEhUTUxFbGVtZW50IGNvbnN0cnVjdG9yIHdhcyBlaXRoZXIgY2FsbGVkIHJlZW50cmFudGx5IGZvciB0aGlzIGNvbnN0cnVjdG9yIG9yIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy5cIik7XG5kW2NdPWc7T2JqZWN0LnNldFByb3RvdHlwZU9mKGgsYS5wcm90b3R5cGUpO3coYixoKTtyZXR1cm4gaH1hLnByb3RvdHlwZT1uYS5wcm90b3R5cGU7cmV0dXJuIGF9KCl9O2Z1bmN0aW9uIHBhKGIsYSxlKXthLnByZXBlbmQ9ZnVuY3Rpb24oYSl7Zm9yKHZhciBkPVtdLGM9MDtjPGFyZ3VtZW50cy5sZW5ndGg7KytjKWRbYy0wXT1hcmd1bWVudHNbY107Yz1kLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gYiBpbnN0YW5jZW9mIE5vZGUmJmwoYil9KTtlLmouYXBwbHkodGhpcyxkKTtmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKyl6KGIsY1tmXSk7aWYobCh0aGlzKSlmb3IoYz0wO2M8ZC5sZW5ndGg7YysrKWY9ZFtjXSxmIGluc3RhbmNlb2YgRWxlbWVudCYmeChiLGYpfTthLmFwcGVuZD1mdW5jdGlvbihhKXtmb3IodmFyIGQ9W10sYz0wO2M8YXJndW1lbnRzLmxlbmd0aDsrK2MpZFtjLTBdPWFyZ3VtZW50c1tjXTtjPWQuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiBiIGluc3RhbmNlb2YgTm9kZSYmbChiKX0pO2UuYXBwZW5kLmFwcGx5KHRoaXMsZCk7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspeihiLGNbZl0pO2lmKGwodGhpcykpZm9yKGM9MDtjPFxuZC5sZW5ndGg7YysrKWY9ZFtjXSxmIGluc3RhbmNlb2YgRWxlbWVudCYmeChiLGYpfX07ZnVuY3Rpb24gcWEoKXt2YXIgYj1ZO3EoRG9jdW1lbnQucHJvdG90eXBlLFwiY3JlYXRlRWxlbWVudFwiLGZ1bmN0aW9uKGEpe2lmKHRoaXMuX19DRV9oYXNSZWdpc3RyeSl7dmFyIGU9Yi5hLmdldChhKTtpZihlKXJldHVybiBuZXcgZS5jb25zdHJ1Y3Rvcn1hPUYuY2FsbCh0aGlzLGEpO3coYixhKTtyZXR1cm4gYX0pO3EoRG9jdW1lbnQucHJvdG90eXBlLFwiaW1wb3J0Tm9kZVwiLGZ1bmN0aW9uKGEsZSl7YT1lYS5jYWxsKHRoaXMsYSxlKTt0aGlzLl9fQ0VfaGFzUmVnaXN0cnk/QShiLGEpOnYoYixhKTtyZXR1cm4gYX0pO3EoRG9jdW1lbnQucHJvdG90eXBlLFwiY3JlYXRlRWxlbWVudE5TXCIsZnVuY3Rpb24oYSxlKXtpZih0aGlzLl9fQ0VfaGFzUmVnaXN0cnkmJihudWxsPT09YXx8XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI9PT1hKSl7dmFyIGM9Yi5hLmdldChlKTtpZihjKXJldHVybiBuZXcgYy5jb25zdHJ1Y3Rvcn1hPWRhLmNhbGwodGhpcyxhLGUpO3coYixhKTtyZXR1cm4gYX0pO1xucGEoYixEb2N1bWVudC5wcm90b3R5cGUse2o6ZmEsYXBwZW5kOmdhfSl9O2Z1bmN0aW9uIHJhKCl7dmFyIGI9WTtmdW5jdGlvbiBhKGEsYyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsXCJ0ZXh0Q29udGVudFwiLHtlbnVtZXJhYmxlOmMuZW51bWVyYWJsZSxjb25maWd1cmFibGU6ITAsZ2V0OmMuZ2V0LHNldDpmdW5jdGlvbihhKXtpZih0aGlzLm5vZGVUeXBlPT09Tm9kZS5URVhUX05PREUpYy5zZXQuY2FsbCh0aGlzLGEpO2Vsc2V7dmFyIGQ9dm9pZCAwO2lmKHRoaXMuZmlyc3RDaGlsZCl7dmFyIGU9dGhpcy5jaGlsZE5vZGVzLHU9ZS5sZW5ndGg7aWYoMDx1JiZsKHRoaXMpKWZvcih2YXIgZD1BcnJheSh1KSxwPTA7cDx1O3ArKylkW3BdPWVbcF19Yy5zZXQuY2FsbCh0aGlzLGEpO2lmKGQpZm9yKGE9MDthPGQubGVuZ3RoO2ErKyl6KGIsZFthXSl9fX0pfXEoTm9kZS5wcm90b3R5cGUsXCJpbnNlcnRCZWZvcmVcIixmdW5jdGlvbihhLGMpe2lmKGEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXt2YXIgZD1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYS5jaGlsZE5vZGVzKTtcbmE9SS5jYWxsKHRoaXMsYSxjKTtpZihsKHRoaXMpKWZvcihjPTA7YzxkLmxlbmd0aDtjKyspeChiLGRbY10pO3JldHVybiBhfWQ9bChhKTtjPUkuY2FsbCh0aGlzLGEsYyk7ZCYmeihiLGEpO2wodGhpcykmJngoYixhKTtyZXR1cm4gY30pO3EoTm9kZS5wcm90b3R5cGUsXCJhcHBlbmRDaGlsZFwiLGZ1bmN0aW9uKGEpe2lmKGEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYS5jaGlsZE5vZGVzKTthPUguY2FsbCh0aGlzLGEpO2lmKGwodGhpcykpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspeChiLGNbZF0pO3JldHVybiBhfWM9bChhKTtkPUguY2FsbCh0aGlzLGEpO2MmJnooYixhKTtsKHRoaXMpJiZ4KGIsYSk7cmV0dXJuIGR9KTtxKE5vZGUucHJvdG90eXBlLFwiY2xvbmVOb2RlXCIsZnVuY3Rpb24oYSl7YT1HLmNhbGwodGhpcyxhKTt0aGlzLm93bmVyRG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT9BKGIsYSk6dihiLGEpO1xucmV0dXJuIGF9KTtxKE5vZGUucHJvdG90eXBlLFwicmVtb3ZlQ2hpbGRcIixmdW5jdGlvbihhKXt2YXIgYz1sKGEpLGQ9Si5jYWxsKHRoaXMsYSk7YyYmeihiLGEpO3JldHVybiBkfSk7cShOb2RlLnByb3RvdHlwZSxcInJlcGxhY2VDaGlsZFwiLGZ1bmN0aW9uKGEsYyl7aWYoYSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBkPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhLmNoaWxkTm9kZXMpO2E9Sy5jYWxsKHRoaXMsYSxjKTtpZihsKHRoaXMpKWZvcih6KGIsYyksYz0wO2M8ZC5sZW5ndGg7YysrKXgoYixkW2NdKTtyZXR1cm4gYX12YXIgZD1sKGEpLGU9Sy5jYWxsKHRoaXMsYSxjKSxmPWwodGhpcyk7ZiYmeihiLGMpO2QmJnooYixhKTtmJiZ4KGIsYSk7cmV0dXJuIGV9KTtMJiZMLmdldD9hKE5vZGUucHJvdG90eXBlLEwpOnQoYixmdW5jdGlvbihiKXthKGIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPVxuMDtiPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7YisrKWEucHVzaCh0aGlzLmNoaWxkTm9kZXNbYl0udGV4dENvbnRlbnQpO3JldHVybiBhLmpvaW4oXCJcIil9LHNldDpmdW5jdGlvbihhKXtmb3IoO3RoaXMuZmlyc3RDaGlsZDspSi5jYWxsKHRoaXMsdGhpcy5maXJzdENoaWxkKTtILmNhbGwodGhpcyxkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSl9fSl9KX07ZnVuY3Rpb24gc2EoYil7dmFyIGE9RWxlbWVudC5wcm90b3R5cGU7YS5iZWZvcmU9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPVtdLGQ9MDtkPGFyZ3VtZW50cy5sZW5ndGg7KytkKWNbZC0wXT1hcmd1bWVudHNbZF07ZD1jLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIE5vZGUmJmwoYSl9KTtqYS5hcHBseSh0aGlzLGMpO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXooYixkW2VdKTtpZihsKHRoaXMpKWZvcihkPTA7ZDxjLmxlbmd0aDtkKyspZT1jW2RdLGUgaW5zdGFuY2VvZiBFbGVtZW50JiZ4KGIsZSl9O2EuYWZ0ZXI9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPVtdLGQ9MDtkPGFyZ3VtZW50cy5sZW5ndGg7KytkKWNbZC0wXT1hcmd1bWVudHNbZF07ZD1jLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIE5vZGUmJmwoYSl9KTtrYS5hcHBseSh0aGlzLGMpO2Zvcih2YXIgZT0wO2U8ZC5sZW5ndGg7ZSsrKXooYixkW2VdKTtpZihsKHRoaXMpKWZvcihkPVxuMDtkPGMubGVuZ3RoO2QrKyllPWNbZF0sZSBpbnN0YW5jZW9mIEVsZW1lbnQmJngoYixlKX07YS5yZXBsYWNlV2l0aD1mdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0wO2Q8YXJndW1lbnRzLmxlbmd0aDsrK2QpY1tkLTBdPWFyZ3VtZW50c1tkXTt2YXIgZD1jLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIE5vZGUmJmwoYSl9KSxlPWwodGhpcyk7bGEuYXBwbHkodGhpcyxjKTtmb3IodmFyIGY9MDtmPGQubGVuZ3RoO2YrKyl6KGIsZFtmXSk7aWYoZSlmb3IoeihiLHRoaXMpLGQ9MDtkPGMubGVuZ3RoO2QrKyllPWNbZF0sZSBpbnN0YW5jZW9mIEVsZW1lbnQmJngoYixlKX07YS5yZW1vdmU9ZnVuY3Rpb24oKXt2YXIgYT1sKHRoaXMpO21hLmNhbGwodGhpcyk7YSYmeihiLHRoaXMpfX07ZnVuY3Rpb24gdGEoKXt2YXIgYj1ZO2Z1bmN0aW9uIGEoYSxjKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxcImlubmVySFRNTFwiLHtlbnVtZXJhYmxlOmMuZW51bWVyYWJsZSxjb25maWd1cmFibGU6ITAsZ2V0OmMuZ2V0LHNldDpmdW5jdGlvbihhKXt2YXIgZD10aGlzLGU9dm9pZCAwO2wodGhpcykmJihlPVtdLG4odGhpcyxmdW5jdGlvbihhKXthIT09ZCYmZS5wdXNoKGEpfSkpO2Muc2V0LmNhbGwodGhpcyxhKTtpZihlKWZvcih2YXIgZj0wO2Y8ZS5sZW5ndGg7ZisrKXt2YXIgaD1lW2ZdOzE9PT1oLl9fQ0Vfc3RhdGUmJmIuZGlzY29ubmVjdGVkQ2FsbGJhY2soaCl9dGhpcy5vd25lckRvY3VtZW50Ll9fQ0VfaGFzUmVnaXN0cnk/QShiLHRoaXMpOnYoYix0aGlzKTtyZXR1cm4gYX19KX1mdW5jdGlvbiBlKGEsYyl7cShhLFwiaW5zZXJ0QWRqYWNlbnRFbGVtZW50XCIsZnVuY3Rpb24oYSxkKXt2YXIgZT1sKGQpO2E9Yy5jYWxsKHRoaXMsYSxkKTtlJiZ6KGIsZCk7bChhKSYmeChiLGQpO1xucmV0dXJuIGF9KX1NP3EoRWxlbWVudC5wcm90b3R5cGUsXCJhdHRhY2hTaGFkb3dcIixmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX0NFX3NoYWRvd1Jvb3Q9YT1NLmNhbGwodGhpcyxhKX0pOmNvbnNvbGUud2FybihcIkN1c3RvbSBFbGVtZW50czogYEVsZW1lbnQjYXR0YWNoU2hhZG93YCB3YXMgbm90IHBhdGNoZWQuXCIpO2lmKE4mJk4uZ2V0KWEoRWxlbWVudC5wcm90b3R5cGUsTik7ZWxzZSBpZihXJiZXLmdldClhKEhUTUxFbGVtZW50LnByb3RvdHlwZSxXKTtlbHNle3ZhciBjPUYuY2FsbChkb2N1bWVudCxcImRpdlwiKTt0KGIsZnVuY3Rpb24oYil7YShiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRy5jYWxsKHRoaXMsITApLmlubmVySFRNTH0sc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPVwidGVtcGxhdGVcIj09PXRoaXMubG9jYWxOYW1lP3RoaXMuY29udGVudDp0aGlzO2ZvcihjLmlubmVySFRNTD1hOzA8Yi5jaGlsZE5vZGVzLmxlbmd0aDspSi5jYWxsKGIsXG5iLmNoaWxkTm9kZXNbMF0pO2Zvcig7MDxjLmNoaWxkTm9kZXMubGVuZ3RoOylILmNhbGwoYixjLmNoaWxkTm9kZXNbMF0pfX0pfSl9cShFbGVtZW50LnByb3RvdHlwZSxcInNldEF0dHJpYnV0ZVwiLGZ1bmN0aW9uKGEsYyl7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gUS5jYWxsKHRoaXMsYSxjKTt2YXIgZD1PLmNhbGwodGhpcyxhKTtRLmNhbGwodGhpcyxhLGMpO2M9Ty5jYWxsKHRoaXMsYSk7Yi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxhLGQsYyxudWxsKX0pO3EoRWxlbWVudC5wcm90b3R5cGUsXCJzZXRBdHRyaWJ1dGVOU1wiLGZ1bmN0aW9uKGEsYyxlKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiBULmNhbGwodGhpcyxhLGMsZSk7dmFyIGQ9Uy5jYWxsKHRoaXMsYSxjKTtULmNhbGwodGhpcyxhLGMsZSk7ZT1TLmNhbGwodGhpcyxhLGMpO2IuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYyxkLGUsYSl9KTtxKEVsZW1lbnQucHJvdG90eXBlLFwicmVtb3ZlQXR0cmlidXRlXCIsXG5mdW5jdGlvbihhKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiBSLmNhbGwodGhpcyxhKTt2YXIgYz1PLmNhbGwodGhpcyxhKTtSLmNhbGwodGhpcyxhKTtudWxsIT09YyYmYi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxhLGMsbnVsbCxudWxsKX0pO3EoRWxlbWVudC5wcm90b3R5cGUsXCJyZW1vdmVBdHRyaWJ1dGVOU1wiLGZ1bmN0aW9uKGEsYyl7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gVS5jYWxsKHRoaXMsYSxjKTt2YXIgZD1TLmNhbGwodGhpcyxhLGMpO1UuY2FsbCh0aGlzLGEsYyk7dmFyIGU9Uy5jYWxsKHRoaXMsYSxjKTtkIT09ZSYmYi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxjLGQsZSxhKX0pO1g/ZShIVE1MRWxlbWVudC5wcm90b3R5cGUsWCk6Vj9lKEVsZW1lbnQucHJvdG90eXBlLFYpOmNvbnNvbGUud2FybihcIkN1c3RvbSBFbGVtZW50czogYEVsZW1lbnQjaW5zZXJ0QWRqYWNlbnRFbGVtZW50YCB3YXMgbm90IHBhdGNoZWQuXCIpO1xucGEoYixFbGVtZW50LnByb3RvdHlwZSx7ajpoYSxhcHBlbmQ6aWF9KTtzYShiKX07LypcblxuIENvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0XG4gVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG4gQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dFxuKi9cbnZhciBaPXdpbmRvdy5jdXN0b21FbGVtZW50cztpZighWnx8Wi5mb3JjZVBvbHlmaWxsfHxcImZ1bmN0aW9uXCIhPXR5cGVvZiBaLmRlZmluZXx8XCJmdW5jdGlvblwiIT10eXBlb2YgWi5nZXQpe3ZhciBZPW5ldyByO29hKCk7cWEoKTtyYSgpO3RhKCk7ZG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT0hMDt2YXIgdWE9bmV3IEUoWSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdyxcImN1c3RvbUVsZW1lbnRzXCIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnVhfSl9O1xufSkuY2FsbChzZWxmKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3VzdG9tLWVsZW1lbnRzLm1pbi5qcy5tYXBcbiIsIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0XG4gKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0XG4gKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzb1xuICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHRcbiAqL1xuLy8gQHZlcnNpb24gMC43LjIyXG5cbihmdW5jdGlvbihnbG9iYWwpIHtcbiAgaWYgKGdsb2JhbC5Kc011dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHJlZ2lzdHJhdGlvbnNUYWJsZSA9IG5ldyBXZWFrTWFwKCk7XG4gIHZhciBzZXRJbW1lZGlhdGU7XG4gIGlmICgvVHJpZGVudHxFZGdlLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG4gICAgc2V0SW1tZWRpYXRlID0gc2V0VGltZW91dDtcbiAgfSBlbHNlIGlmICh3aW5kb3cuc2V0SW1tZWRpYXRlKSB7XG4gICAgc2V0SW1tZWRpYXRlID0gd2luZG93LnNldEltbWVkaWF0ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2V0SW1tZWRpYXRlUXVldWUgPSBbXTtcbiAgICB2YXIgc2VudGluZWwgPSBTdHJpbmcoTWF0aC5yYW5kb20oKSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGlmIChlLmRhdGEgPT09IHNlbnRpbmVsKSB7XG4gICAgICAgIHZhciBxdWV1ZSA9IHNldEltbWVkaWF0ZVF1ZXVlO1xuICAgICAgICBzZXRJbW1lZGlhdGVRdWV1ZSA9IFtdO1xuICAgICAgICBxdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKGZ1bmMpIHtcbiAgICAgICAgICBmdW5jKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uKGZ1bmMpIHtcbiAgICAgIHNldEltbWVkaWF0ZVF1ZXVlLnB1c2goZnVuYyk7XG4gICAgICB3aW5kb3cucG9zdE1lc3NhZ2Uoc2VudGluZWwsIFwiKlwiKTtcbiAgICB9O1xuICB9XG4gIHZhciBpc1NjaGVkdWxlZCA9IGZhbHNlO1xuICB2YXIgc2NoZWR1bGVkT2JzZXJ2ZXJzID0gW107XG4gIGZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2sob2JzZXJ2ZXIpIHtcbiAgICBzY2hlZHVsZWRPYnNlcnZlcnMucHVzaChvYnNlcnZlcik7XG4gICAgaWYgKCFpc1NjaGVkdWxlZCkge1xuICAgICAgaXNTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgc2V0SW1tZWRpYXRlKGRpc3BhdGNoQ2FsbGJhY2tzKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gd3JhcElmTmVlZGVkKG5vZGUpIHtcbiAgICByZXR1cm4gd2luZG93LlNoYWRvd0RPTVBvbHlmaWxsICYmIHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbC53cmFwSWZOZWVkZWQobm9kZSkgfHwgbm9kZTtcbiAgfVxuICBmdW5jdGlvbiBkaXNwYXRjaENhbGxiYWNrcygpIHtcbiAgICBpc1NjaGVkdWxlZCA9IGZhbHNlO1xuICAgIHZhciBvYnNlcnZlcnMgPSBzY2hlZHVsZWRPYnNlcnZlcnM7XG4gICAgc2NoZWR1bGVkT2JzZXJ2ZXJzID0gW107XG4gICAgb2JzZXJ2ZXJzLnNvcnQoZnVuY3Rpb24obzEsIG8yKSB7XG4gICAgICByZXR1cm4gbzEudWlkXyAtIG8yLnVpZF87XG4gICAgfSk7XG4gICAgdmFyIGFueU5vbkVtcHR5ID0gZmFsc2U7XG4gICAgb2JzZXJ2ZXJzLmZvckVhY2goZnVuY3Rpb24ob2JzZXJ2ZXIpIHtcbiAgICAgIHZhciBxdWV1ZSA9IG9ic2VydmVyLnRha2VSZWNvcmRzKCk7XG4gICAgICByZW1vdmVUcmFuc2llbnRPYnNlcnZlcnNGb3Iob2JzZXJ2ZXIpO1xuICAgICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBvYnNlcnZlci5jYWxsYmFja18ocXVldWUsIG9ic2VydmVyKTtcbiAgICAgICAgYW55Tm9uRW1wdHkgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChhbnlOb25FbXB0eSkgZGlzcGF0Y2hDYWxsYmFja3MoKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVUcmFuc2llbnRPYnNlcnZlcnNGb3Iob2JzZXJ2ZXIpIHtcbiAgICBvYnNlcnZlci5ub2Rlc18uZm9yRWFjaChmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgcmVnaXN0cmF0aW9ucyA9IHJlZ2lzdHJhdGlvbnNUYWJsZS5nZXQobm9kZSk7XG4gICAgICBpZiAoIXJlZ2lzdHJhdGlvbnMpIHJldHVybjtcbiAgICAgIHJlZ2lzdHJhdGlvbnMuZm9yRWFjaChmdW5jdGlvbihyZWdpc3RyYXRpb24pIHtcbiAgICAgICAgaWYgKHJlZ2lzdHJhdGlvbi5vYnNlcnZlciA9PT0gb2JzZXJ2ZXIpIHJlZ2lzdHJhdGlvbi5yZW1vdmVUcmFuc2llbnRPYnNlcnZlcnMoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGZvckVhY2hBbmNlc3RvckFuZE9ic2VydmVyRW5xdWV1ZVJlY29yZCh0YXJnZXQsIGNhbGxiYWNrKSB7XG4gICAgZm9yICh2YXIgbm9kZSA9IHRhcmdldDsgbm9kZTsgbm9kZSA9IG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgdmFyIHJlZ2lzdHJhdGlvbnMgPSByZWdpc3RyYXRpb25zVGFibGUuZ2V0KG5vZGUpO1xuICAgICAgaWYgKHJlZ2lzdHJhdGlvbnMpIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByZWdpc3RyYXRpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdmFyIHJlZ2lzdHJhdGlvbiA9IHJlZ2lzdHJhdGlvbnNbal07XG4gICAgICAgICAgdmFyIG9wdGlvbnMgPSByZWdpc3RyYXRpb24ub3B0aW9ucztcbiAgICAgICAgICBpZiAobm9kZSAhPT0gdGFyZ2V0ICYmICFvcHRpb25zLnN1YnRyZWUpIGNvbnRpbnVlO1xuICAgICAgICAgIHZhciByZWNvcmQgPSBjYWxsYmFjayhvcHRpb25zKTtcbiAgICAgICAgICBpZiAocmVjb3JkKSByZWdpc3RyYXRpb24uZW5xdWV1ZShyZWNvcmQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHZhciB1aWRDb3VudGVyID0gMDtcbiAgZnVuY3Rpb24gSnNNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5jYWxsYmFja18gPSBjYWxsYmFjaztcbiAgICB0aGlzLm5vZGVzXyA9IFtdO1xuICAgIHRoaXMucmVjb3Jkc18gPSBbXTtcbiAgICB0aGlzLnVpZF8gPSArK3VpZENvdW50ZXI7XG4gIH1cbiAgSnNNdXRhdGlvbk9ic2VydmVyLnByb3RvdHlwZSA9IHtcbiAgICBvYnNlcnZlOiBmdW5jdGlvbih0YXJnZXQsIG9wdGlvbnMpIHtcbiAgICAgIHRhcmdldCA9IHdyYXBJZk5lZWRlZCh0YXJnZXQpO1xuICAgICAgaWYgKCFvcHRpb25zLmNoaWxkTGlzdCAmJiAhb3B0aW9ucy5hdHRyaWJ1dGVzICYmICFvcHRpb25zLmNoYXJhY3RlckRhdGEgfHwgb3B0aW9ucy5hdHRyaWJ1dGVPbGRWYWx1ZSAmJiAhb3B0aW9ucy5hdHRyaWJ1dGVzIHx8IG9wdGlvbnMuYXR0cmlidXRlRmlsdGVyICYmIG9wdGlvbnMuYXR0cmlidXRlRmlsdGVyLmxlbmd0aCAmJiAhb3B0aW9ucy5hdHRyaWJ1dGVzIHx8IG9wdGlvbnMuY2hhcmFjdGVyRGF0YU9sZFZhbHVlICYmICFvcHRpb25zLmNoYXJhY3RlckRhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVnaXN0cmF0aW9ucyA9IHJlZ2lzdHJhdGlvbnNUYWJsZS5nZXQodGFyZ2V0KTtcbiAgICAgIGlmICghcmVnaXN0cmF0aW9ucykgcmVnaXN0cmF0aW9uc1RhYmxlLnNldCh0YXJnZXQsIHJlZ2lzdHJhdGlvbnMgPSBbXSk7XG4gICAgICB2YXIgcmVnaXN0cmF0aW9uO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWdpc3RyYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChyZWdpc3RyYXRpb25zW2ldLm9ic2VydmVyID09PSB0aGlzKSB7XG4gICAgICAgICAgcmVnaXN0cmF0aW9uID0gcmVnaXN0cmF0aW9uc1tpXTtcbiAgICAgICAgICByZWdpc3RyYXRpb24ucmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgICAgICAgcmVnaXN0cmF0aW9uLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXJlZ2lzdHJhdGlvbikge1xuICAgICAgICByZWdpc3RyYXRpb24gPSBuZXcgUmVnaXN0cmF0aW9uKHRoaXMsIHRhcmdldCwgb3B0aW9ucyk7XG4gICAgICAgIHJlZ2lzdHJhdGlvbnMucHVzaChyZWdpc3RyYXRpb24pO1xuICAgICAgICB0aGlzLm5vZGVzXy5wdXNoKHRhcmdldCk7XG4gICAgICB9XG4gICAgICByZWdpc3RyYXRpb24uYWRkTGlzdGVuZXJzKCk7XG4gICAgfSxcbiAgICBkaXNjb25uZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMubm9kZXNfLmZvckVhY2goZnVuY3Rpb24obm9kZSkge1xuICAgICAgICB2YXIgcmVnaXN0cmF0aW9ucyA9IHJlZ2lzdHJhdGlvbnNUYWJsZS5nZXQobm9kZSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVnaXN0cmF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciByZWdpc3RyYXRpb24gPSByZWdpc3RyYXRpb25zW2ldO1xuICAgICAgICAgIGlmIChyZWdpc3RyYXRpb24ub2JzZXJ2ZXIgPT09IHRoaXMpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJhdGlvbi5yZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIHJlZ2lzdHJhdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCB0aGlzKTtcbiAgICAgIHRoaXMucmVjb3Jkc18gPSBbXTtcbiAgICB9LFxuICAgIHRha2VSZWNvcmRzOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjb3B5T2ZSZWNvcmRzID0gdGhpcy5yZWNvcmRzXztcbiAgICAgIHRoaXMucmVjb3Jkc18gPSBbXTtcbiAgICAgIHJldHVybiBjb3B5T2ZSZWNvcmRzO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gTXV0YXRpb25SZWNvcmQodHlwZSwgdGFyZ2V0KSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICB0aGlzLmFkZGVkTm9kZXMgPSBbXTtcbiAgICB0aGlzLnJlbW92ZWROb2RlcyA9IFtdO1xuICAgIHRoaXMucHJldmlvdXNTaWJsaW5nID0gbnVsbDtcbiAgICB0aGlzLm5leHRTaWJsaW5nID0gbnVsbDtcbiAgICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBudWxsO1xuICAgIHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlID0gbnVsbDtcbiAgICB0aGlzLm9sZFZhbHVlID0gbnVsbDtcbiAgfVxuICBmdW5jdGlvbiBjb3B5TXV0YXRpb25SZWNvcmQob3JpZ2luYWwpIHtcbiAgICB2YXIgcmVjb3JkID0gbmV3IE11dGF0aW9uUmVjb3JkKG9yaWdpbmFsLnR5cGUsIG9yaWdpbmFsLnRhcmdldCk7XG4gICAgcmVjb3JkLmFkZGVkTm9kZXMgPSBvcmlnaW5hbC5hZGRlZE5vZGVzLnNsaWNlKCk7XG4gICAgcmVjb3JkLnJlbW92ZWROb2RlcyA9IG9yaWdpbmFsLnJlbW92ZWROb2Rlcy5zbGljZSgpO1xuICAgIHJlY29yZC5wcmV2aW91c1NpYmxpbmcgPSBvcmlnaW5hbC5wcmV2aW91c1NpYmxpbmc7XG4gICAgcmVjb3JkLm5leHRTaWJsaW5nID0gb3JpZ2luYWwubmV4dFNpYmxpbmc7XG4gICAgcmVjb3JkLmF0dHJpYnV0ZU5hbWUgPSBvcmlnaW5hbC5hdHRyaWJ1dGVOYW1lO1xuICAgIHJlY29yZC5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBvcmlnaW5hbC5hdHRyaWJ1dGVOYW1lc3BhY2U7XG4gICAgcmVjb3JkLm9sZFZhbHVlID0gb3JpZ2luYWwub2xkVmFsdWU7XG4gICAgcmV0dXJuIHJlY29yZDtcbiAgfVxuICB2YXIgY3VycmVudFJlY29yZCwgcmVjb3JkV2l0aE9sZFZhbHVlO1xuICBmdW5jdGlvbiBnZXRSZWNvcmQodHlwZSwgdGFyZ2V0KSB7XG4gICAgcmV0dXJuIGN1cnJlbnRSZWNvcmQgPSBuZXcgTXV0YXRpb25SZWNvcmQodHlwZSwgdGFyZ2V0KTtcbiAgfVxuICBmdW5jdGlvbiBnZXRSZWNvcmRXaXRoT2xkVmFsdWUob2xkVmFsdWUpIHtcbiAgICBpZiAocmVjb3JkV2l0aE9sZFZhbHVlKSByZXR1cm4gcmVjb3JkV2l0aE9sZFZhbHVlO1xuICAgIHJlY29yZFdpdGhPbGRWYWx1ZSA9IGNvcHlNdXRhdGlvblJlY29yZChjdXJyZW50UmVjb3JkKTtcbiAgICByZWNvcmRXaXRoT2xkVmFsdWUub2xkVmFsdWUgPSBvbGRWYWx1ZTtcbiAgICByZXR1cm4gcmVjb3JkV2l0aE9sZFZhbHVlO1xuICB9XG4gIGZ1bmN0aW9uIGNsZWFyUmVjb3JkcygpIHtcbiAgICBjdXJyZW50UmVjb3JkID0gcmVjb3JkV2l0aE9sZFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIGZ1bmN0aW9uIHJlY29yZFJlcHJlc2VudHNDdXJyZW50TXV0YXRpb24ocmVjb3JkKSB7XG4gICAgcmV0dXJuIHJlY29yZCA9PT0gcmVjb3JkV2l0aE9sZFZhbHVlIHx8IHJlY29yZCA9PT0gY3VycmVudFJlY29yZDtcbiAgfVxuICBmdW5jdGlvbiBzZWxlY3RSZWNvcmQobGFzdFJlY29yZCwgbmV3UmVjb3JkKSB7XG4gICAgaWYgKGxhc3RSZWNvcmQgPT09IG5ld1JlY29yZCkgcmV0dXJuIGxhc3RSZWNvcmQ7XG4gICAgaWYgKHJlY29yZFdpdGhPbGRWYWx1ZSAmJiByZWNvcmRSZXByZXNlbnRzQ3VycmVudE11dGF0aW9uKGxhc3RSZWNvcmQpKSByZXR1cm4gcmVjb3JkV2l0aE9sZFZhbHVlO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIFJlZ2lzdHJhdGlvbihvYnNlcnZlciwgdGFyZ2V0LCBvcHRpb25zKSB7XG4gICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzID0gW107XG4gIH1cbiAgUmVnaXN0cmF0aW9uLnByb3RvdHlwZSA9IHtcbiAgICBlbnF1ZXVlOiBmdW5jdGlvbihyZWNvcmQpIHtcbiAgICAgIHZhciByZWNvcmRzID0gdGhpcy5vYnNlcnZlci5yZWNvcmRzXztcbiAgICAgIHZhciBsZW5ndGggPSByZWNvcmRzLmxlbmd0aDtcbiAgICAgIGlmIChyZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGxhc3RSZWNvcmQgPSByZWNvcmRzW2xlbmd0aCAtIDFdO1xuICAgICAgICB2YXIgcmVjb3JkVG9SZXBsYWNlTGFzdCA9IHNlbGVjdFJlY29yZChsYXN0UmVjb3JkLCByZWNvcmQpO1xuICAgICAgICBpZiAocmVjb3JkVG9SZXBsYWNlTGFzdCkge1xuICAgICAgICAgIHJlY29yZHNbbGVuZ3RoIC0gMV0gPSByZWNvcmRUb1JlcGxhY2VMYXN0O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZWR1bGVDYWxsYmFjayh0aGlzLm9ic2VydmVyKTtcbiAgICAgIH1cbiAgICAgIHJlY29yZHNbbGVuZ3RoXSA9IHJlY29yZDtcbiAgICB9LFxuICAgIGFkZExpc3RlbmVyczogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmFkZExpc3RlbmVyc18odGhpcy50YXJnZXQpO1xuICAgIH0sXG4gICAgYWRkTGlzdGVuZXJzXzogZnVuY3Rpb24obm9kZSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICBpZiAob3B0aW9ucy5hdHRyaWJ1dGVzKSBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJET01BdHRyTW9kaWZpZWRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgICBpZiAob3B0aW9ucy5jaGFyYWN0ZXJEYXRhKSBub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgICBpZiAob3B0aW9ucy5jaGlsZExpc3QpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTU5vZGVJbnNlcnRlZFwiLCB0aGlzLCB0cnVlKTtcbiAgICAgIGlmIChvcHRpb25zLmNoaWxkTGlzdCB8fCBvcHRpb25zLnN1YnRyZWUpIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTU5vZGVSZW1vdmVkXCIsIHRoaXMsIHRydWUpO1xuICAgIH0sXG4gICAgcmVtb3ZlTGlzdGVuZXJzOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXJzXyh0aGlzLnRhcmdldCk7XG4gICAgfSxcbiAgICByZW1vdmVMaXN0ZW5lcnNfOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIGlmIChvcHRpb25zLmF0dHJpYnV0ZXMpIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTUF0dHJNb2RpZmllZFwiLCB0aGlzLCB0cnVlKTtcbiAgICAgIGlmIChvcHRpb25zLmNoYXJhY3RlckRhdGEpIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZFwiLCB0aGlzLCB0cnVlKTtcbiAgICAgIGlmIChvcHRpb25zLmNoaWxkTGlzdCkgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NTm9kZUluc2VydGVkXCIsIHRoaXMsIHRydWUpO1xuICAgICAgaWYgKG9wdGlvbnMuY2hpbGRMaXN0IHx8IG9wdGlvbnMuc3VidHJlZSkgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NTm9kZVJlbW92ZWRcIiwgdGhpcywgdHJ1ZSk7XG4gICAgfSxcbiAgICBhZGRUcmFuc2llbnRPYnNlcnZlcjogZnVuY3Rpb24obm9kZSkge1xuICAgICAgaWYgKG5vZGUgPT09IHRoaXMudGFyZ2V0KSByZXR1cm47XG4gICAgICB0aGlzLmFkZExpc3RlbmVyc18obm9kZSk7XG4gICAgICB0aGlzLnRyYW5zaWVudE9ic2VydmVkTm9kZXMucHVzaChub2RlKTtcbiAgICAgIHZhciByZWdpc3RyYXRpb25zID0gcmVnaXN0cmF0aW9uc1RhYmxlLmdldChub2RlKTtcbiAgICAgIGlmICghcmVnaXN0cmF0aW9ucykgcmVnaXN0cmF0aW9uc1RhYmxlLnNldChub2RlLCByZWdpc3RyYXRpb25zID0gW10pO1xuICAgICAgcmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMpO1xuICAgIH0sXG4gICAgcmVtb3ZlVHJhbnNpZW50T2JzZXJ2ZXJzOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB0cmFuc2llbnRPYnNlcnZlZE5vZGVzID0gdGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzO1xuICAgICAgdGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzID0gW107XG4gICAgICB0cmFuc2llbnRPYnNlcnZlZE5vZGVzLmZvckVhY2goZnVuY3Rpb24obm9kZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyc18obm9kZSk7XG4gICAgICAgIHZhciByZWdpc3RyYXRpb25zID0gcmVnaXN0cmF0aW9uc1RhYmxlLmdldChub2RlKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWdpc3RyYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHJlZ2lzdHJhdGlvbnNbaV0gPT09IHRoaXMpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJhdGlvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCB0aGlzKTtcbiAgICB9LFxuICAgIGhhbmRsZUV2ZW50OiBmdW5jdGlvbihlKSB7XG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgc3dpdGNoIChlLnR5cGUpIHtcbiAgICAgICBjYXNlIFwiRE9NQXR0ck1vZGlmaWVkXCI6XG4gICAgICAgIHZhciBuYW1lID0gZS5hdHRyTmFtZTtcbiAgICAgICAgdmFyIG5hbWVzcGFjZSA9IGUucmVsYXRlZE5vZGUubmFtZXNwYWNlVVJJO1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgIHZhciByZWNvcmQgPSBuZXcgZ2V0UmVjb3JkKFwiYXR0cmlidXRlc1wiLCB0YXJnZXQpO1xuICAgICAgICByZWNvcmQuYXR0cmlidXRlTmFtZSA9IG5hbWU7XG4gICAgICAgIHJlY29yZC5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgICAgIHZhciBvbGRWYWx1ZSA9IGUuYXR0ckNoYW5nZSA9PT0gTXV0YXRpb25FdmVudC5BRERJVElPTiA/IG51bGwgOiBlLnByZXZWYWx1ZTtcbiAgICAgICAgZm9yRWFjaEFuY2VzdG9yQW5kT2JzZXJ2ZXJFbnF1ZXVlUmVjb3JkKHRhcmdldCwgZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAgIGlmICghb3B0aW9ucy5hdHRyaWJ1dGVzKSByZXR1cm47XG4gICAgICAgICAgaWYgKG9wdGlvbnMuYXR0cmlidXRlRmlsdGVyICYmIG9wdGlvbnMuYXR0cmlidXRlRmlsdGVyLmxlbmd0aCAmJiBvcHRpb25zLmF0dHJpYnV0ZUZpbHRlci5pbmRleE9mKG5hbWUpID09PSAtMSAmJiBvcHRpb25zLmF0dHJpYnV0ZUZpbHRlci5pbmRleE9mKG5hbWVzcGFjZSkgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChvcHRpb25zLmF0dHJpYnV0ZU9sZFZhbHVlKSByZXR1cm4gZ2V0UmVjb3JkV2l0aE9sZFZhbHVlKG9sZFZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgICBjYXNlIFwiRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkXCI6XG4gICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgdmFyIHJlY29yZCA9IGdldFJlY29yZChcImNoYXJhY3RlckRhdGFcIiwgdGFyZ2V0KTtcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gZS5wcmV2VmFsdWU7XG4gICAgICAgIGZvckVhY2hBbmNlc3RvckFuZE9ic2VydmVyRW5xdWV1ZVJlY29yZCh0YXJnZXQsIGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMuY2hhcmFjdGVyRGF0YSkgcmV0dXJuO1xuICAgICAgICAgIGlmIChvcHRpb25zLmNoYXJhY3RlckRhdGFPbGRWYWx1ZSkgcmV0dXJuIGdldFJlY29yZFdpdGhPbGRWYWx1ZShvbGRWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAgY2FzZSBcIkRPTU5vZGVSZW1vdmVkXCI6XG4gICAgICAgIHRoaXMuYWRkVHJhbnNpZW50T2JzZXJ2ZXIoZS50YXJnZXQpO1xuXG4gICAgICAgY2FzZSBcIkRPTU5vZGVJbnNlcnRlZFwiOlxuICAgICAgICB2YXIgY2hhbmdlZE5vZGUgPSBlLnRhcmdldDtcbiAgICAgICAgdmFyIGFkZGVkTm9kZXMsIHJlbW92ZWROb2RlcztcbiAgICAgICAgaWYgKGUudHlwZSA9PT0gXCJET01Ob2RlSW5zZXJ0ZWRcIikge1xuICAgICAgICAgIGFkZGVkTm9kZXMgPSBbIGNoYW5nZWROb2RlIF07XG4gICAgICAgICAgcmVtb3ZlZE5vZGVzID0gW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWRkZWROb2RlcyA9IFtdO1xuICAgICAgICAgIHJlbW92ZWROb2RlcyA9IFsgY2hhbmdlZE5vZGUgXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldmlvdXNTaWJsaW5nID0gY2hhbmdlZE5vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB2YXIgbmV4dFNpYmxpbmcgPSBjaGFuZ2VkTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgdmFyIHJlY29yZCA9IGdldFJlY29yZChcImNoaWxkTGlzdFwiLCBlLnRhcmdldC5wYXJlbnROb2RlKTtcbiAgICAgICAgcmVjb3JkLmFkZGVkTm9kZXMgPSBhZGRlZE5vZGVzO1xuICAgICAgICByZWNvcmQucmVtb3ZlZE5vZGVzID0gcmVtb3ZlZE5vZGVzO1xuICAgICAgICByZWNvcmQucHJldmlvdXNTaWJsaW5nID0gcHJldmlvdXNTaWJsaW5nO1xuICAgICAgICByZWNvcmQubmV4dFNpYmxpbmcgPSBuZXh0U2libGluZztcbiAgICAgICAgZm9yRWFjaEFuY2VzdG9yQW5kT2JzZXJ2ZXJFbnF1ZXVlUmVjb3JkKGUucmVsYXRlZE5vZGUsIGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAoIW9wdGlvbnMuY2hpbGRMaXN0KSByZXR1cm47XG4gICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjbGVhclJlY29yZHMoKTtcbiAgICB9XG4gIH07XG4gIGdsb2JhbC5Kc011dGF0aW9uT2JzZXJ2ZXIgPSBKc011dGF0aW9uT2JzZXJ2ZXI7XG4gIGlmICghZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciA9IEpzTXV0YXRpb25PYnNlcnZlcjtcbiAgICBKc011dGF0aW9uT2JzZXJ2ZXIuX2lzUG9seWZpbGxlZCA9IHRydWU7XG4gIH1cbn0pKHNlbGYpO1xuIiwiLypcbkNvcHlyaWdodCAoYykgMjAxMiBCYXJuZXNhbmRub2JsZS5jb20sIGxsYywgRG9uYXZvbiBXZXN0LCBhbmQgRG9tZW5pYyBEZW5pY29sYVxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmdcbmEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG53aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG5kaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbnBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0b1xudGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZVxuaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EXG5OT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFXG5MSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OXG5PRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT05cbldJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4qL1xuKGZ1bmN0aW9uIChnbG9iYWwsIHVuZGVmaW5lZCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgaWYgKGdsb2JhbC5zZXRJbW1lZGlhdGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBuZXh0SGFuZGxlID0gMTsgLy8gU3BlYyBzYXlzIGdyZWF0ZXIgdGhhbiB6ZXJvXG4gICAgdmFyIHRhc2tzQnlIYW5kbGUgPSB7fTtcbiAgICB2YXIgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgdmFyIGRvYyA9IGdsb2JhbC5kb2N1bWVudDtcbiAgICB2YXIgc2V0SW1tZWRpYXRlO1xuXG4gICAgZnVuY3Rpb24gYWRkRnJvbVNldEltbWVkaWF0ZUFyZ3VtZW50cyhhcmdzKSB7XG4gICAgICAgIHRhc2tzQnlIYW5kbGVbbmV4dEhhbmRsZV0gPSBwYXJ0aWFsbHlBcHBsaWVkLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBhY2NlcHRzIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyBzZXRJbW1lZGlhdGUsIGJ1dFxuICAgIC8vIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJlcXVpcmVzIG5vIGFyZ3VtZW50cy5cbiAgICBmdW5jdGlvbiBwYXJ0aWFsbHlBcHBsaWVkKGhhbmRsZXIpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlci5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAobmV3IEZ1bmN0aW9uKFwiXCIgKyBoYW5kbGVyKSkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBydW5JZlByZXNlbnQoaGFuZGxlKSB7XG4gICAgICAgIC8vIEZyb20gdGhlIHNwZWM6IFwiV2FpdCB1bnRpbCBhbnkgaW52b2NhdGlvbnMgb2YgdGhpcyBhbGdvcml0aG0gc3RhcnRlZCBiZWZvcmUgdGhpcyBvbmUgaGF2ZSBjb21wbGV0ZWQuXCJcbiAgICAgICAgLy8gU28gaWYgd2UncmUgY3VycmVudGx5IHJ1bm5pbmcgYSB0YXNrLCB3ZSdsbCBuZWVkIHRvIGRlbGF5IHRoaXMgaW52b2NhdGlvbi5cbiAgICAgICAgaWYgKGN1cnJlbnRseVJ1bm5pbmdBVGFzaykge1xuICAgICAgICAgICAgLy8gRGVsYXkgYnkgZG9pbmcgYSBzZXRUaW1lb3V0LiBzZXRJbW1lZGlhdGUgd2FzIHRyaWVkIGluc3RlYWQsIGJ1dCBpbiBGaXJlZm94IDcgaXQgZ2VuZXJhdGVkIGFcbiAgICAgICAgICAgIC8vIFwidG9vIG11Y2ggcmVjdXJzaW9uXCIgZXJyb3IuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KHBhcnRpYWxseUFwcGxpZWQocnVuSWZQcmVzZW50LCBoYW5kbGUpLCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0YXNrID0gdGFza3NCeUhhbmRsZVtoYW5kbGVdO1xuICAgICAgICAgICAgaWYgKHRhc2spIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRhc2soKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckltbWVkaWF0ZShoYW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShoYW5kbGUpIHtcbiAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgc2V0SW1tZWRpYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gYWRkRnJvbVNldEltbWVkaWF0ZUFyZ3VtZW50cyhhcmd1bWVudHMpO1xuICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhwYXJ0aWFsbHlBcHBsaWVkKHJ1bklmUHJlc2VudCwgaGFuZGxlKSk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRJbW1lZGlhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBhZGRGcm9tU2V0SW1tZWRpYXRlQXJndW1lbnRzKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBnbG9iYWwucG9zdE1lc3NhZ2UobWVzc2FnZVByZWZpeCArIGhhbmRsZSwgXCIqXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICBzZXRJbW1lZGlhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBoYW5kbGUgPSBhZGRGcm9tU2V0SW1tZWRpYXRlQXJndW1lbnRzKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQyLnBvc3RNZXNzYWdlKGhhbmRsZSk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgc2V0SW1tZWRpYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgaGFuZGxlID0gYWRkRnJvbVNldEltbWVkaWF0ZUFyZ3VtZW50cyhhcmd1bWVudHMpO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgPHNjcmlwdD4gZWxlbWVudDsgaXRzIHJlYWR5c3RhdGVjaGFuZ2UgZXZlbnQgd2lsbCBiZSBmaXJlZCBhc3luY2hyb25vdXNseSBvbmNlIGl0IGlzIGluc2VydGVkXG4gICAgICAgICAgICAvLyBpbnRvIHRoZSBkb2N1bWVudC4gRG8gc28sIHRodXMgcXVldWluZyB1cCB0aGUgdGFzay4gUmVtZW1iZXIgdG8gY2xlYW4gdXAgb25jZSBpdCdzIGJlZW4gY2FsbGVkLlxuICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGRvYy5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICAgICAgc2NyaXB0ID0gbnVsbDtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBodG1sLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGFkZEZyb21TZXRJbW1lZGlhdGVBcmd1bWVudHMoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQocGFydGlhbGx5QXBwbGllZChydW5JZlByZXNlbnQsIGhhbmRsZSksIDApO1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHNlbGYpKTtcbiIsIihmdW5jdGlvbigpIHtcbiAgdmFyIERFRkFVTFRfVklFV1BPUlQgPSAnd2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSxtYXhpbXVtLXNjYWxlPTEsbWluaW11bS1zY2FsZT0xLHVzZXItc2NhbGFibGU9bm8nO1xuXG4gIHZhciBWaWV3cG9ydCA9IHtcbiAgICBlbnN1cmVWaWV3cG9ydEVsZW1lbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZpZXdwb3J0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT12aWV3cG9ydF0nKTtcblxuICAgICAgaWYgKCF2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbWV0YScpO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQubmFtZSA9ICd2aWV3cG9ydCc7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodmlld3BvcnRFbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHZpZXdwb3J0RWxlbWVudDtcbiAgICB9LFxuXG4gICAgc2V0dXA6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZpZXdwb3J0RWxlbWVudCA9IFZpZXdwb3J0LmVuc3VyZVZpZXdwb3J0RWxlbWVudCgpO1xuXG4gICAgICBpZiAoIXZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnY29udGVudCcpKSB7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnLCBERUZBVUxUX1ZJRVdQT1JUKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2luZG93LlZpZXdwb3J0ID0gVmlld3BvcnQ7XG59KSgpO1xuIiwiLyoqXG4gKiBNaWNyb0V2ZW50IC0gdG8gbWFrZSBhbnkganMgb2JqZWN0IGFuIGV2ZW50IGVtaXR0ZXIgKHNlcnZlciBvciBicm93c2VyKVxuICpcbiAqIC0gcHVyZSBqYXZhc2NyaXB0IC0gc2VydmVyIGNvbXBhdGlibGUsIGJyb3dzZXIgY29tcGF0aWJsZVxuICogLSBkb250IHJlbHkgb24gdGhlIGJyb3dzZXIgZG9tc1xuICogLSBzdXBlciBzaW1wbGUgLSB5b3UgZ2V0IGl0IGltbWVkaWF0ZWx5LCBubyBteXN0ZXJ5LCBubyBtYWdpYyBpbnZvbHZlZFxuICpcbiAqIC0gY3JlYXRlIGEgTWljcm9FdmVudERlYnVnIHdpdGggZ29vZGllcyB0byBkZWJ1Z1xuICogICAtIG1ha2UgaXQgc2FmZXIgdG8gdXNlXG4qL1xuXG4vKiogTk9URTogVGhpcyBsaWJyYXJ5IGlzIGN1c3RvbWl6ZWQgZm9yIE9uc2VuIFVJLiAqL1xuXG5jb25zdCBNaWNyb0V2ZW50ICA9IGZ1bmN0aW9uKCl7fTtcbk1pY3JvRXZlbnQucHJvdG90eXBlICA9IHtcbiAgb246IGZ1bmN0aW9uKGV2ZW50LCBmY3Qpe1xuICAgIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgICB0aGlzLl9ldmVudHNbZXZlbnRdID0gdGhpcy5fZXZlbnRzW2V2ZW50XSB8fCBbXTtcbiAgICB0aGlzLl9ldmVudHNbZXZlbnRdLnB1c2goZmN0KTtcbiAgfSxcbiAgb25jZTogZnVuY3Rpb24oZXZlbnQsIGZjdCl7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciB3cmFwcGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLm9mZihldmVudCwgd3JhcHBlcik7XG4gICAgICByZXR1cm4gZmN0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgICB0aGlzLm9uKGV2ZW50LCB3cmFwcGVyKTtcbiAgfSxcbiAgb2ZmOiBmdW5jdGlvbihldmVudCwgZmN0KXtcbiAgICB0aGlzLl9ldmVudHMgPSB0aGlzLl9ldmVudHMgfHwge307XG4gICAgaWYgKGV2ZW50IGluIHRoaXMuX2V2ZW50cyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9ldmVudHNbZXZlbnRdID0gdGhpcy5fZXZlbnRzW2V2ZW50XVxuICAgICAgLmZpbHRlcihmdW5jdGlvbihfZmN0KSB7XG4gICAgICAgIGlmIChmY3QpIHtcbiAgICAgICAgICAgcmV0dXJuIGZjdCAhPT0gX2ZjdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9LFxuICBlbWl0OiBmdW5jdGlvbihldmVudCAvKiAsIGFyZ3MuLi4gKi8pe1xuICAgIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgICBpZiAoZXZlbnQgaW4gdGhpcy5fZXZlbnRzID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2V2ZW50c1tldmVudF0ubGVuZ3RoOyBpKyspe1xuICAgICAgdGhpcy5fZXZlbnRzW2V2ZW50XVtpXS5hcHBseSh0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogbWl4aW4gd2lsbCBkZWxlZ2F0ZSBhbGwgTWljcm9FdmVudC5qcyBmdW5jdGlvbiBpbiB0aGUgZGVzdGluYXRpb24gb2JqZWN0XG4gKlxuICogLSByZXF1aXJlKCdNaWNyb0V2ZW50JykubWl4aW4oRm9vYmFyKSB3aWxsIG1ha2UgRm9vYmFyIGFibGUgdG8gdXNlIE1pY3JvRXZlbnRcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGhlIG9iamVjdCB3aGljaCB3aWxsIHN1cHBvcnQgTWljcm9FdmVudFxuKi9cbk1pY3JvRXZlbnQubWl4aW4gID0gZnVuY3Rpb24oZGVzdE9iamVjdCl7XG4gIHZhciBwcm9wcyA9IFsnb24nLCAnb25jZScsICdvZmYnLCAnZW1pdCddO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSArKyl7XG4gICAgaWYgKHR5cGVvZiBkZXN0T2JqZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBkZXN0T2JqZWN0LnByb3RvdHlwZVtwcm9wc1tpXV0gID0gTWljcm9FdmVudC5wcm90b3R5cGVbcHJvcHNbaV1dO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXN0T2JqZWN0W3Byb3BzW2ldXSA9IE1pY3JvRXZlbnQucHJvdG90eXBlW3Byb3BzW2ldXTtcbiAgICB9XG4gIH1cbn07XG5cbndpbmRvdy5NaWNyb0V2ZW50ID0gTWljcm9FdmVudDtcbmV4cG9ydCBkZWZhdWx0IE1pY3JvRXZlbnQ7XG4iLCJleHBvcnQgZGVmYXVsdCB7IH07XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5cbi8qKlxuICogQWRkIHZlbmRvciBwcmVmaXguXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuY29uc3QgcHJlZml4ID0gKGZ1bmN0aW9uKCkge1xuICBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICcnKTtcbiAgY29uc3QgcHJlZml4ID0gKEFycmF5LnByb3RvdHlwZS5zbGljZVxuICAgIC5jYWxsKHN0eWxlcylcbiAgICAuam9pbignJylcbiAgICAubWF0Y2goLy0obW96fHdlYmtpdHxtcyktLykgfHwgKHN0eWxlcy5PTGluayA9PT0gJycgJiYgWycnLCAnbyddKVxuICApWzFdO1xuXG4gIHJldHVybiBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuICctJyArIHByZWZpeCArICctJyArIHV0aWwuaHlwaGVuYXRlKG5hbWUpO1xuICB9O1xufSkoKTtcblxuXG4vKipcbiAqIE1pbmltYWwgdXRpbGl0eSBsaWJyYXJ5IGZvciBtYW5pcHVsYXRpbmcgZWxlbWVudCdzIHN0eWxlLlxuICogU2V0IGVsZW1lbnQncyBzdHlsZS5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZXNcbiAqIEByZXR1cm4ge0VsZW1lbnR9XG4gKi9cbmNvbnN0IHN0eWxlciA9IGZ1bmN0aW9uKGVsZW1lbnQsIHN0eWxlKSB7XG4gIE9iamVjdC5rZXlzKHN0eWxlKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChrZXkgaW4gZWxlbWVudC5zdHlsZSkge1xuICAgICAgZWxlbWVudC5zdHlsZVtrZXldID0gc3R5bGVba2V5XTtcbiAgICB9IGVsc2UgaWYgKHByZWZpeChrZXkpIGluIGVsZW1lbnQuc3R5bGUpIHtcbiAgICAgIGVsZW1lbnQuc3R5bGVbcHJlZml4KGtleSldID0gc3R5bGVba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXRpbC53YXJuKCdObyBzdWNoIHN0eWxlIHByb3BlcnR5OiAnICsga2V5KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gc3R5bGVzIFNwYWNlLXNlcGFyYXRlZCBDU1MgcHJvcGVydGllcyB0byByZW1vdmVcbiAqL1xuc3R5bGVyLmNsZWFyID0gZnVuY3Rpb24oZWxlbWVudCwgc3R5bGVzID0gJycpIHtcbiAgY29uc3QgY2xlYXJsaXN0ID0gc3R5bGVzLnNwbGl0KC9cXHMrLykucmVkdWNlKChyLCBzKSA9PiByLmNvbmNhdChbdXRpbC5oeXBoZW5hdGUocyksIHByZWZpeChzKV0pLCBbXSksXG4gICAga2V5cyA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSBlbGVtZW50LnN0eWxlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3Qga2V5ID0gZWxlbWVudC5zdHlsZVtpXTtcbiAgICBpZiAoY2xlYXJsaXN0Lmxlbmd0aCA9PT0gMCB8fCBjbGVhcmxpc3Quc29tZShzID0+IGtleS5pbmRleE9mKHMpID09PSAwKSkge1xuICAgICAga2V5cy5wdXNoKGtleSk7IC8vIFN0b3JlIHRoZSBrZXkgdG8gZml4IFNhZmFyaSBzdHlsZSBpbmRleGVzXG4gICAgfVxuICB9XG5cbiAga2V5cy5mb3JFYWNoKGtleSA9PiBlbGVtZW50LnN0eWxlW2tleV0gPSAnJyk7XG4gIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdHlsZScpID09PSAnJyAmJiBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHN0eWxlcjtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNQbGF0Zm9ybSBmcm9tICcuL3BsYXRmb3JtLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4vdXRpbC5qcyc7XG5cbmxldCBhdXRvU3R5bGVFbmFibGVkID0gdHJ1ZTtcblxuLy8gTW9kaWZpZXJzXG5jb25zdCBtb2RpZmllcnNNYXAgPSB7XG4gICdxdWlldCc6ICdtYXRlcmlhbC0tZmxhdCcsXG4gICdsaWdodCc6ICdtYXRlcmlhbC0tZmxhdCcsXG4gICdvdXRsaW5lJzogJ21hdGVyaWFsLS1mbGF0JyxcbiAgJ2N0YSc6ICcnLFxuICAnbGFyZ2UtLXF1aWV0JzogJ21hdGVyaWFsLS1mbGF0IGxhcmdlJyxcbiAgJ2xhcmdlLS1jdGEnOiAnbGFyZ2UnLFxuICAnbm9ib3JkZXInOiAnJyxcbiAgJ3RhcHBhYmxlJzogJydcbn07XG5cbmNvbnN0IHBsYXRmb3JtcyA9IHt9O1xuXG5wbGF0Zm9ybXMuYW5kcm9pZCA9IGVsZW1lbnQgPT4ge1xuXG4gIGNvbnN0IGVsZW1lbnROYW1lID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKCF1dGlsLmhhc01vZGlmaWVyKGVsZW1lbnQsICdtYXRlcmlhbCcpKSB7XG4gICAgY29uc3Qgb2xkTW9kaWZpZXIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKSB8fCAnJztcblxuICAgIGNvbnN0IG5ld01vZGlmaWVyID0gb2xkTW9kaWZpZXIudHJpbSgpLnNwbGl0KC9cXHMrLykubWFwKGUgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGlmaWVyc01hcCwgZSkgPyBtb2RpZmllcnNNYXBbZV0gOiBlKTtcbiAgICBuZXdNb2RpZmllci51bnNoaWZ0KCdtYXRlcmlhbCcpO1xuXG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJywgbmV3TW9kaWZpZXIuam9pbignICcpLnRyaW0oKSk7XG4gIH1cblxuICBjb25zdCBlbGVtZW50cyA9IFtcbiAgICAnb25zLWFsZXJ0LWRpYWxvZy1idXR0b24nLFxuICAgICdvbnMtdG9vbGJhci1idXR0b24nLFxuICAgICdvbnMtYmFjay1idXR0b24nLFxuICAgICdvbnMtYnV0dG9uJyxcbiAgICAnb25zLWxpc3QtaXRlbScsXG4gICAgJ29ucy1mYWInLFxuICAgICdvbnMtc3BlZWQtZGlhbCcsXG4gICAgJ29ucy1zcGVlZC1kaWFsLWl0ZW0nLFxuICAgICdvbnMtdGFiJ1xuICBdO1xuXG5cbiAgLy8gRWZmZWN0c1xuICBpZiAoZWxlbWVudHMuaW5kZXhPZihlbGVtZW50TmFtZSkgIT09IC0xXG4gICAgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdyaXBwbGUnKVxuICAgICYmICFlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ29ucy1yaXBwbGUnKSkge1xuXG4gICAgaWYgKGVsZW1lbnROYW1lID09PSAnb25zLWxpc3QtaXRlbScpIHtcbiAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgndGFwcGFibGUnKSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgncmlwcGxlJywgJycpO1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGFwcGFibGUnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JpcHBsZScsICcnKTtcbiAgICB9XG4gIH1cbn07XG5cbnBsYXRmb3Jtcy5pb3MgPSBlbGVtZW50ID0+IHtcblxuIC8vIE1vZGlmaWVyc1xuIGlmICh1dGlsLnJlbW92ZU1vZGlmaWVyKGVsZW1lbnQsICdtYXRlcmlhbCcpKSB7XG4gICBpZiAodXRpbC5yZW1vdmVNb2RpZmllcihlbGVtZW50LCAnbWF0ZXJpYWwtLWZsYXQnKSkge1xuICAgICB1dGlsLmFkZE1vZGlmaWVyKGVsZW1lbnQsICh1dGlsLnJlbW92ZU1vZGlmaWVyKGVsZW1lbnQsICdsYXJnZScpKSA/ICdsYXJnZS0tcXVpZXQnIDogJ3F1aWV0Jyk7XG4gICB9XG5cbiAgIGlmICghZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJykpIHtcbiAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ21vZGlmaWVyJyk7XG4gICB9XG4gfVxuXG4gLy8gRWZmZWN0c1xuIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgncmlwcGxlJykpIHtcbiAgIGlmIChlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ29ucy1saXN0LWl0ZW0nKSB7XG4gICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YXBwYWJsZScsICcnKTtcbiAgIH1cblxuICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JpcHBsZScpO1xuIH1cbn07XG5cbmNvbnN0IHVubG9ja2VkID0ge1xuICBhbmRyb2lkOiB0cnVlXG59O1xuXG5jb25zdCBnZXRQbGF0Zm9ybSA9IChlbGVtZW50LCBmb3JjZSkgPT4ge1xuICBpZiAoYXV0b1N0eWxlRW5hYmxlZCAmJiAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGUtYXV0by1zdHlsaW5nJykpIHtcbiAgICBjb25zdCBtb2JpbGVPUyA9IG9uc1BsYXRmb3JtLmdldE1vYmlsZU9TKCk7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwbGF0Zm9ybXMsIG1vYmlsZU9TKSAmJiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHVubG9ja2VkLCBtb2JpbGVPUykgfHwgZm9yY2UpKSB7XG4gICAgICByZXR1cm4gbW9iaWxlT1M7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgcHJlcGFyZSA9IChlbGVtZW50LCBmb3JjZSkgPT4ge1xuICBjb25zdCBwID0gZ2V0UGxhdGZvcm0oZWxlbWVudCwgZm9yY2UpO1xuICBwICYmIHBsYXRmb3Jtc1twXShlbGVtZW50KTtcbn07XG5cbmNvbnN0IG1hcE1vZGlmaWVyID0gKG1vZGlmaWVyLCBlbGVtZW50LCBmb3JjZSkgPT4ge1xuICBpZiAoZ2V0UGxhdGZvcm0oZWxlbWVudCwgZm9yY2UpKSB7XG4gICAgcmV0dXJuIG1vZGlmaWVyLnNwbGl0KC9cXHMrLykubWFwKG0gPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGlmaWVyc01hcCwgbSkgPyBtb2RpZmllcnNNYXBbbV0gOiBtKS5qb2luKCcgJyk7XG4gIH1cbiAgcmV0dXJuIG1vZGlmaWVyO1xufTtcblxuY29uc3QgcmVzdG9yZU1vZGlmaWVyID0gZWxlbWVudCA9PiB7XG4gIGlmIChnZXRQbGF0Zm9ybShlbGVtZW50KSA9PT0gJ2FuZHJvaWQnKSB7XG4gICAgY29uc3QgbW9kaWZpZXIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKSB8fCAnJztcbiAgICBsZXQgbmV3TW9kaWZpZXIgPSBtYXBNb2RpZmllcihtb2RpZmllciwgZWxlbWVudCk7XG5cbiAgICBpZiAoIS8oXnxcXHMrKW1hdGVyaWFsKCR8XFxzKykvaS50ZXN0KG1vZGlmaWVyKSkge1xuICAgICAgbmV3TW9kaWZpZXIgPSAnbWF0ZXJpYWwgJyArIG5ld01vZGlmaWVyO1xuICAgIH1cblxuICAgIGlmIChuZXdNb2RpZmllciAhPT0gbW9kaWZpZXIpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdtb2RpZmllcicsIG5ld01vZGlmaWVyLnRyaW0oKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpc0VuYWJsZWQ6ICgpID0+IGF1dG9TdHlsZUVuYWJsZWQsXG4gIGVuYWJsZTogKCkgPT4gYXV0b1N0eWxlRW5hYmxlZCA9IHRydWUsXG4gIGRpc2FibGU6ICgpID0+IGF1dG9TdHlsZUVuYWJsZWQgPSBmYWxzZSxcbiAgcHJlcGFyZSxcbiAgbWFwTW9kaWZpZXIsXG4gIGdldFBsYXRmb3JtLFxuICByZXN0b3JlTW9kaWZpZXJcbn07XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuLi91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vYXV0b3N0eWxlLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kaWZpZXJVdGlsIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBsYXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjdXJyZW50XG4gICAqL1xuICBzdGF0aWMgZGlmZihsYXN0LCBjdXJyZW50KSB7XG4gICAgbGFzdCA9IG1ha2VEaWN0KCgnJyArIGxhc3QpLnRyaW0oKSk7XG4gICAgY3VycmVudCA9IG1ha2VEaWN0KCgnJyArIGN1cnJlbnQpLnRyaW0oKSk7XG5cbiAgICBjb25zdCByZW1vdmVkID0gT2JqZWN0LmtleXMobGFzdCkucmVkdWNlKChyZXN1bHQsIHRva2VuKSA9PiB7XG4gICAgICBpZiAoIWN1cnJlbnRbdG9rZW5dKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRva2VuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3QgYWRkZWQgPSBPYmplY3Qua2V5cyhjdXJyZW50KS5yZWR1Y2UoKHJlc3VsdCwgdG9rZW4pID0+IHtcbiAgICAgIGlmICghbGFzdFt0b2tlbl0pIHtcbiAgICAgICAgcmVzdWx0LnB1c2godG9rZW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCBbXSk7XG5cbiAgICByZXR1cm4ge2FkZGVkLCByZW1vdmVkfTtcblxuICAgIGZ1bmN0aW9uIG1ha2VEaWN0KG1vZGlmaWVyKSB7XG4gICAgICBjb25zdCBkaWN0ID0ge307XG4gICAgICBNb2RpZmllclV0aWwuc3BsaXQobW9kaWZpZXIpLmZvckVhY2godG9rZW4gPT4gZGljdFt0b2tlbl0gPSB0b2tlbik7XG4gICAgICByZXR1cm4gZGljdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpZmZcbiAgICogQHBhcmFtIHtBcnJheX0gZGlmZi5yZW1vdmVkXG4gICAqIEBwYXJhbSB7QXJyYXl9IGRpZmYuYWRkZWRcbiAgICogQHBhcmFtIHtPYmplY3R9IGNsYXNzTGlzdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVcbiAgICovXG4gIHN0YXRpYyBhcHBseURpZmZUb0NsYXNzTGlzdChkaWZmLCBjbGFzc0xpc3QsIHRlbXBsYXRlKSB7XG4gICAgZGlmZi5hZGRlZFxuICAgICAgLm1hcChtb2RpZmllciA9PiB0ZW1wbGF0ZS5yZXBsYWNlKC9cXCovZywgbW9kaWZpZXIpKVxuICAgICAgLmZvckVhY2goa2xhc3MgPT4ga2xhc3Muc3BsaXQoL1xccysvKS5mb3JFYWNoKGsgPT4gY2xhc3NMaXN0LmFkZChrKSkpO1xuXG4gICAgZGlmZi5yZW1vdmVkXG4gICAgICAubWFwKG1vZGlmaWVyID0+IHRlbXBsYXRlLnJlcGxhY2UoL1xcKi9nLCBtb2RpZmllcikpXG4gICAgICAuZm9yRWFjaChrbGFzcyA9PiBrbGFzcy5zcGxpdCgvXFxzKy8pLmZvckVhY2goayA9PiBjbGFzc0xpc3QucmVtb3ZlKGspKSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpZmZcbiAgICogQHBhcmFtIHtBcnJheX0gZGlmZi5yZW1vdmVkXG4gICAqIEBwYXJhbSB7QXJyYXl9IGRpZmYuYWRkZWRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1lXG4gICAqL1xuICBzdGF0aWMgYXBwbHlEaWZmVG9FbGVtZW50KGRpZmYsIGVsZW1lbnQsIHNjaGVtZSkge1xuICAgIE9iamVjdC5rZXlzKHNjaGVtZSkuZm9yRWFjaChzZWxlY3RvciA9PiB7XG4gICAgICBjb25zdCB0YXJnZXRFbGVtZW50cyA9ICFzZWxlY3RvciB8fCB1dGlsLm1hdGNoKGVsZW1lbnQsIHNlbGVjdG9yKVxuICAgICAgICA/IFtlbGVtZW50XVxuICAgICAgICA6IEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChcbiAgICAgICAgICAgIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvciksXG4gICAgICAgICAgICB0YXJnZXRFbGVtZW50ID0+ICF1dGlsLmZpbmRQYXJlbnQodGFyZ2V0RWxlbWVudCwgZWxlbWVudC50YWdOYW1lLCBwYXJlbnQgPT4gcGFyZW50ID09PSBlbGVtZW50KVxuICAgICAgICAgICk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0RWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgTW9kaWZpZXJVdGlsLmFwcGx5RGlmZlRvQ2xhc3NMaXN0KGRpZmYsIHRhcmdldEVsZW1lbnRzW2ldLmNsYXNzTGlzdCwgc2NoZW1lW3NlbGVjdG9yXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IGxhc3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IGN1cnJlbnRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gc2NoZW1lXG4gICAqL1xuICBzdGF0aWMgb25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgZWxlbWVudCwgc2NoZW1lKSB7XG4gICAgTW9kaWZpZXJVdGlsLmFwcGx5RGlmZlRvRWxlbWVudChNb2RpZmllclV0aWwuZGlmZihsYXN0LCBjdXJyZW50KSwgZWxlbWVudCwgc2NoZW1lKTtcbiAgICBhdXRvU3R5bGUucmVzdG9yZU1vZGlmaWVyKGVsZW1lbnQpO1xuICB9XG5cbiAgc3RhdGljIHJlZnJlc2goZWxlbWVudCwgc2NoZW1lKSB7XG4gICAgTW9kaWZpZXJVdGlsLmFwcGx5RGlmZlRvRWxlbWVudChNb2RpZmllclV0aWwuZGlmZignJywgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJykgfHwgJycpLCBlbGVtZW50LCBzY2hlbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IHNjaGVtZVxuICAgKi9cbiAgc3RhdGljIGluaXRNb2RpZmllcihlbGVtZW50LCBzY2hlbWUpIHtcbiAgICBjb25zdCBtb2RpZmllciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdtb2RpZmllcicpO1xuICAgIGlmICh0eXBlb2YgbW9kaWZpZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgTW9kaWZpZXJVdGlsLmFwcGx5RGlmZlRvRWxlbWVudCh7XG4gICAgICByZW1vdmVkOiBbXSxcbiAgICAgIGFkZGVkOiBNb2RpZmllclV0aWwuc3BsaXQobW9kaWZpZXIpXG4gICAgfSwgZWxlbWVudCwgc2NoZW1lKTtcbiAgfVxuXG4gIHN0YXRpYyBzcGxpdChtb2RpZmllcikge1xuICAgIGlmICh0eXBlb2YgbW9kaWZpZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGlmaWVyLnRyaW0oKS5zcGxpdCgvICsvKS5maWx0ZXIodG9rZW4gPT4gdG9rZW4gIT09ICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgbW9kaWZpZXIgdG9rZW4gdG8gYW4gZWxlbWVudC5cbiAgICovXG4gIHN0YXRpYyBhZGRNb2RpZmllcihlbGVtZW50LCBtb2RpZmllclRva2VuKSB7XG4gICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbW9kaWZpZXInKSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJywgbW9kaWZpZXJUb2tlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRva2VucyA9IE1vZGlmaWVyVXRpbC5zcGxpdChlbGVtZW50LmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKSk7XG4gICAgICBpZiAodG9rZW5zLmluZGV4T2YobW9kaWZpZXJUb2tlbikgPT0gLTEpIHtcbiAgICAgICAgdG9rZW5zLnB1c2gobW9kaWZpZXJUb2tlbik7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdtb2RpZmllcicsIHRva2Vucy5qb2luKCcgJykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgbW9kaWZpZXIgdG9rZW4gZnJvbSBhbiBlbGVtZW50LlxuICAgKi9cbiAgc3RhdGljIHJlbW92ZU1vZGlmaWVyKGVsZW1lbnQsIG1vZGlmaWVyVG9rZW4pIHtcbiAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ21vZGlmaWVyJykpIHtcbiAgICAgIGNvbnN0IHRva2VucyA9IE1vZGlmaWVyVXRpbC5zcGxpdChlbGVtZW50LmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKSk7XG4gICAgICBjb25zdCBpbmRleCA9IHRva2Vucy5pbmRleE9mKG1vZGlmaWVyVG9rZW4pO1xuICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICB0b2tlbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJywgdG9rZW5zLmpvaW4oJyAnKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IHN0YXJ0c1dpdGggPSAocywgYykgPT4gcy5zdWJzdHIoMCwgYy5sZW5ndGgpID09PSBjO1xuY29uc3QgZW5kc1dpdGggPSAocywgYykgPT4gcy5zdWJzdHIocy5sZW5ndGggLSBjLmxlbmd0aCwgYy5sZW5ndGgpID09PSBjO1xuY29uc3QgdW53cmFwID0gcyA9PiBzLnNsaWNlKDEsIC0xKTtcbmNvbnN0IGlzT2JqZWN0U3RyaW5nID0gcyA9PiBzdGFydHNXaXRoKHMsICd7JykgJiYgZW5kc1dpdGgocywgJ30nKTtcbmNvbnN0IGlzQXJyYXlTdHJpbmcgPSBzID0+IHN0YXJ0c1dpdGgocywgJ1snKSAmJiBlbmRzV2l0aChzLCAnXScpO1xuY29uc3QgaXNRdW90ZWRTdHJpbmcgPSBzID0+IChzdGFydHNXaXRoKHMsICdcXCcnKSAmJiBlbmRzV2l0aChzLCAnXFwnJykpIHx8IChzdGFydHNXaXRoKHMsICdcIicpICYmIGVuZHNXaXRoKHMsICdcIicpKTtcblxuY29uc3QgZXJyb3IgPSAodG9rZW4sIHN0cmluZywgb3JpZ2luYWxTdHJpbmcpID0+IHtcbiAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHRva2VuIFxcJycgKyB0b2tlbiArICdcXCcgYXQgcG9zaXRpb24gJyArIChvcmlnaW5hbFN0cmluZy5sZW5ndGggLSBzdHJpbmcubGVuZ3RoIC0gMSkgKyAnIGluIHN0cmluZzogXFwnJyArIG9yaWdpbmFsU3RyaW5nICsgJ1xcJycpO1xufTtcblxuY29uc3QgcHJvY2Vzc1Rva2VuID0gKHRva2VuLCBzdHJpbmcsIG9yaWdpbmFsU3RyaW5nKSA9PiB7XG4gIGlmICh0b2tlbiA9PT0gJ3RydWUnIHx8IHRva2VuID09PSAnZmFsc2UnKSB7XG4gICAgcmV0dXJuIHRva2VuID09PSAndHJ1ZSc7XG4gIH0gZWxzZSBpZiAoaXNRdW90ZWRTdHJpbmcodG9rZW4pKSB7XG4gICAgcmV0dXJuIHVud3JhcCh0b2tlbik7XG4gIH0gZWxzZSBpZiAoIWlzTmFOKHRva2VuKSkge1xuICAgIHJldHVybiArKHRva2VuKTtcbiAgfSBlbHNlIGlmIChpc09iamVjdFN0cmluZyh0b2tlbikpIHtcbiAgICByZXR1cm4gcGFyc2VPYmplY3QodW53cmFwKHRva2VuKSk7XG4gIH0gZWxzZSBpZiAoaXNBcnJheVN0cmluZyh0b2tlbikpIHtcbiAgICByZXR1cm4gcGFyc2VBcnJheSh1bndyYXAodG9rZW4pKTtcbiAgfSBlbHNlIHtcbiAgICBlcnJvcih0b2tlbiwgc3RyaW5nLCBvcmlnaW5hbFN0cmluZyk7XG4gIH1cbn07XG5cbmNvbnN0IG5leHRUb2tlbiA9IChzdHJpbmcpID0+IHtcbiAgc3RyaW5nID0gc3RyaW5nLnRyaW0oKTtcbiAgbGV0IGxpbWl0ID0gc3RyaW5nLmxlbmd0aDtcblxuICBpZiAoc3RyaW5nWzBdID09PSAnOicgfHwgc3RyaW5nWzBdID09PSAnLCcpIHtcblxuICAgIGxpbWl0ID0gMTtcblxuICB9IGVsc2UgaWYgKHN0cmluZ1swXSA9PT0gJ3snIHx8IHN0cmluZ1swXSA9PT0gJ1snKSB7XG5cbiAgICBjb25zdCBjID0gc3RyaW5nLmNoYXJDb2RlQXQoMCk7XG4gICAgbGV0IG5lc3RlZE9iamVjdCA9IDE7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdChpKSA9PT0gYykge1xuICAgICAgICBuZXN0ZWRPYmplY3QrKztcbiAgICAgIH0gZWxzZSBpZiAoc3RyaW5nLmNoYXJDb2RlQXQoaSkgPT09IGMgKyAyKSB7XG4gICAgICAgIG5lc3RlZE9iamVjdC0tO1xuICAgICAgICBpZiAobmVzdGVkT2JqZWN0ID09PSAwKSB7XG4gICAgICAgICAgbGltaXQgPSBpICsgMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICB9IGVsc2UgaWYgKHN0cmluZ1swXSA9PT0gJ1xcJycgfHwgc3RyaW5nWzBdID09PSAnXCInKSB7XG5cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHN0cmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHN0cmluZ1tpXSA9PT0gc3RyaW5nWzBdKSB7XG4gICAgICAgIGxpbWl0ID0gaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICB9IGVsc2Uge1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChbJyAnLCAnLCcsICc6J10uaW5kZXhPZihzdHJpbmdbaV0pICE9PSAtMSkge1xuICAgICAgICBsaW1pdCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgcmV0dXJuIHN0cmluZy5zbGljZSgwLCBsaW1pdCk7XG59O1xuXG5jb25zdCBwYXJzZU9iamVjdCA9IChzdHJpbmcpID0+IHtcbiAgY29uc3QgaXNWYWxpZEtleSA9IGtleSA9PiAvXltBLVpfJF1bQS1aMC05XyRdKiQvaS50ZXN0KGtleSk7XG5cbiAgc3RyaW5nID0gc3RyaW5nLnRyaW0oKTtcbiAgY29uc3Qgb3JpZ2luYWxTdHJpbmcgPSBzdHJpbmc7XG4gIGNvbnN0IG9iamVjdCA9IHt9O1xuICBsZXQgcmVhZGluZ0tleSA9IHRydWUsIGtleSwgcHJldmlvdXNUb2tlbiwgdG9rZW47XG5cbiAgd2hpbGUgKHN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgcHJldmlvdXNUb2tlbiA9IHRva2VuO1xuICAgIHRva2VuID0gbmV4dFRva2VuKHN0cmluZyk7XG4gICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKHRva2VuLmxlbmd0aCwgc3RyaW5nLmxlbmd0aCkudHJpbSgpO1xuXG4gICAgaWYgKCh0b2tlbiA9PT0gJzonICYmICghcmVhZGluZ0tleSB8fCAhcHJldmlvdXNUb2tlbiB8fCBwcmV2aW91c1Rva2VuID09PSAnLCcpKVxuICAgICAgIHx8ICh0b2tlbiA9PT0gJywnICYmIHJlYWRpbmdLZXkpXG4gICAgICAgfHwgKHRva2VuICE9PSAnOicgJiYgdG9rZW4gIT09ICcsJyAmJiAocHJldmlvdXNUb2tlbiAmJiBwcmV2aW91c1Rva2VuICE9PSAnLCcgJiYgcHJldmlvdXNUb2tlbiAhPT0gJzonKSkpIHtcbiAgICAgIGVycm9yKHRva2VuLCBzdHJpbmcsIG9yaWdpbmFsU3RyaW5nKTtcbiAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnOicgJiYgcmVhZGluZ0tleSAmJiBwcmV2aW91c1Rva2VuKSB7XG4gICAgICBwcmV2aW91c1Rva2VuID0gaXNRdW90ZWRTdHJpbmcocHJldmlvdXNUb2tlbikgPyB1bndyYXAocHJldmlvdXNUb2tlbikgOiBwcmV2aW91c1Rva2VuO1xuICAgICAgaWYgKGlzVmFsaWRLZXkocHJldmlvdXNUb2tlbikpIHtcbiAgICAgICAga2V5ID0gcHJldmlvdXNUb2tlbjtcbiAgICAgICAgcmVhZGluZ0tleSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleSB0b2tlbiBcXCcnICsgcHJldmlvdXNUb2tlbiArICdcXCcgYXQgcG9zaXRpb24gMCBpbiBzdHJpbmc6IFxcJycgKyBvcmlnaW5hbFN0cmluZyArICdcXCcnKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnLCcgJiYgIXJlYWRpbmdLZXkgJiYgcHJldmlvdXNUb2tlbikge1xuICAgICAgb2JqZWN0W2tleV0gPSBwcm9jZXNzVG9rZW4ocHJldmlvdXNUb2tlbiwgc3RyaW5nLCBvcmlnaW5hbFN0cmluZyk7XG4gICAgICByZWFkaW5nS2V5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAodG9rZW4pIHtcbiAgICBvYmplY3Rba2V5XSA9IHByb2Nlc3NUb2tlbih0b2tlbiwgc3RyaW5nLCBvcmlnaW5hbFN0cmluZyk7XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufTtcblxuY29uc3QgcGFyc2VBcnJheSA9IChzdHJpbmcpID0+IHtcbiAgc3RyaW5nID0gc3RyaW5nLnRyaW0oKTtcbiAgY29uc3Qgb3JpZ2luYWxTdHJpbmcgPSBzdHJpbmc7XG4gIGNvbnN0IGFycmF5ID0gW107XG4gIGxldCBwcmV2aW91c1Rva2VuLCB0b2tlbjtcblxuICB3aGlsZSAoc3RyaW5nLmxlbmd0aCA+IDApIHtcbiAgICBwcmV2aW91c1Rva2VuID0gdG9rZW47XG4gICAgdG9rZW4gPSBuZXh0VG9rZW4oc3RyaW5nKTtcbiAgICBzdHJpbmcgPSBzdHJpbmcuc2xpY2UodG9rZW4ubGVuZ3RoLCBzdHJpbmcubGVuZ3RoKS50cmltKCk7XG5cbiAgICBpZiAodG9rZW4gPT09ICcsJyAmJiAoIXByZXZpb3VzVG9rZW4gfHwgcHJldmlvdXNUb2tlbiA9PT0gJywnKSkge1xuICAgICAgZXJyb3IodG9rZW4sIHN0cmluZywgb3JpZ2luYWxTdHJpbmcpO1xuICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICcsJykge1xuICAgICAgYXJyYXkucHVzaChwcm9jZXNzVG9rZW4ocHJldmlvdXNUb2tlbiwgc3RyaW5nLCBvcmlnaW5hbFN0cmluZykpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0b2tlbikge1xuICAgIGlmICh0b2tlbiAhPT0gJywnKSB7XG4gICAgICBhcnJheS5wdXNoKHByb2Nlc3NUb2tlbih0b2tlbiwgc3RyaW5nLCBvcmlnaW5hbFN0cmluZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcih0b2tlbiwgc3RyaW5nLCBvcmlnaW5hbFN0cmluZyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufTtcblxuY29uc3QgcGFyc2UgPSAoc3RyaW5nKSA9PiB7XG4gIHN0cmluZyA9IHN0cmluZy50cmltKCk7XG5cbiAgaWYgKGlzT2JqZWN0U3RyaW5nKHN0cmluZykpIHtcbiAgICByZXR1cm4gcGFyc2VPYmplY3QodW53cmFwKHN0cmluZykpO1xuICB9IGVsc2UgaWYgKGlzQXJyYXlTdHJpbmcoc3RyaW5nKSkge1xuICAgIHJldHVybiBwYXJzZUFycmF5KHVud3JhcChzdHJpbmcpKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb3ZpZGVkIHN0cmluZyBtdXN0IGJlIG9iamVjdCBvciBhcnJheSBsaWtlOiAnICsgc3RyaW5nKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgcGFyc2U7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi9lbGVtZW50cy5qcyc7XG5pbXBvcnQgc3R5bGVyIGZyb20gJy4vc3R5bGVyLmpzJztcbmltcG9ydCBpbnRlcm5hbCBmcm9tICcuL2ludGVybmFsL2luZGV4LmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IGFuaW1hdGlvbk9wdGlvbnNQYXJzZSBmcm9tICcuL2FuaW1hdGlvbi1vcHRpb25zLXBhcnNlci5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi9wbGF0Zm9ybS5qcyc7XG5cbmNvbnN0IHV0aWwgPSB7fTtcbmNvbnN0IGVycm9yUHJlZml4ID0gJ1tPbnNlbiBVSV0nO1xuXG51dGlsLmdsb2JhbHMgPSB7XG4gIGZhYk9mZnNldDogMCxcbiAgZXJyb3JQcmVmaXgsXG4gIHN1cHBvcnRzUGFzc2l2ZTogZmFsc2Vcbn07XG5cbnBsYXRmb3JtLl9ydW5PbkFjdHVhbFBsYXRmb3JtKCgpID0+IHtcbiAgdXRpbC5nbG9iYWxzLmFjdHVhbE1vYmlsZU9TID0gcGxhdGZvcm0uZ2V0TW9iaWxlT1MoKTtcbiAgdXRpbC5nbG9iYWxzLmlzV0tXZWJWaWV3ID0gcGxhdGZvcm0uaXNXS1dlYlZpZXcoKTtcbn0pO1xuXG50cnkge1xuICBjb25zdCBvcHRzID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAncGFzc2l2ZScsIHtcbiAgICBnZXQoKSB7IHV0aWwuZ2xvYmFscy5zdXBwb3J0c1Bhc3NpdmUgPSB0cnVlOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ2V0dGVyLXJldHVyblxuICB9KTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3RQYXNzaXZlJywgbnVsbCwgb3B0cyk7XG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0UGFzc2l2ZScsIG51bGwsIG9wdHMpO1xufSBjYXRjaCAoZSkgeyBudWxsOyB9XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBUYXJnZXRcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIEV2ZW50IG5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXIgRXZlbnQgaGFuZGxlclxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRdIEV2ZW50IG9wdGlvbnMgKHBhc3NpdmUsIGNhcHR1cmUuLi4pXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtpc0dEXSBJZiBjb21lcyBmcm9tIEdlc3R1cmVEZXRlY3Rvci4gSnVzdCBmb3IgdGVzdGluZy5cbiAqL1xudXRpbC5hZGRFdmVudExpc3RlbmVyID0gKGVsLCBuYW1lLCBoYW5kbGVyLCBvcHQsIGlzR0QpID0+IHtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBoYW5kbGVyLCB1dGlsLmdsb2JhbHMuc3VwcG9ydHNQYXNzaXZlID8gb3B0IDogKG9wdCB8fCB7fSkuY2FwdHVyZSk7XG59O1xudXRpbC5yZW1vdmVFdmVudExpc3RlbmVyID0gKGVsLCBuYW1lLCBoYW5kbGVyLCBvcHQsIGlzR0QpID0+IHtcbiAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBoYW5kbGVyLCB1dGlsLmdsb2JhbHMuc3VwcG9ydHNQYXNzaXZlID8gb3B0IDogKG9wdCB8fCB7fSkuY2FwdHVyZSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nL0Z1bmN0aW9ufSBxdWVyeSBkb3QgY2xhc3MgbmFtZSBvciBub2RlIG5hbWUgb3IgbWF0Y2hlciBmdW5jdGlvbi5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICovXG51dGlsLnByZXBhcmVRdWVyeSA9IChxdWVyeSkgPT4ge1xuICByZXR1cm4gcXVlcnkgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHF1ZXJ5IDogKGVsZW1lbnQpID0+IHV0aWwubWF0Y2goZWxlbWVudCwgcXVlcnkpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVcbiAqIEBwYXJhbSB7U3RyaW5nL0Z1bmN0aW9ufSBzIENTUyBTZWxlY3Rvci5cbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbnV0aWwubWF0Y2ggPSAoZSwgcykgPT4gKGUubWF0Y2hlcyB8fCBlLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlLm1vek1hdGNoZXNTZWxlY3RvciB8fCBlLm1zTWF0Y2hlc1NlbGVjdG9yKS5jYWxsKGUsIHMpO1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmcvRnVuY3Rpb259IHF1ZXJ5IGRvdCBjbGFzcyBuYW1lIG9yIG5vZGUgbmFtZSBvciBtYXRjaGVyIGZ1bmN0aW9uLlxuICogQHJldHVybiB7SFRNTEVsZW1lbnQvbnVsbH1cbiAqL1xudXRpbC5maW5kQ2hpbGQgPSAoZWxlbWVudCwgcXVlcnkpID0+IHtcbiAgY29uc3QgbWF0Y2ggPSB1dGlsLnByZXBhcmVRdWVyeShxdWVyeSk7XG5cbiAgLy8gQ2F1dGlvbjogYGVsZW1lbnQuY2hpbGRyZW5gIGlzIGB1bmRlZmluZWRgIGluIHNvbWUgZW52aXJvbm1lbnRzIGlmIGBlbGVtZW50YCBpcyBgc3ZnYFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG5vZGUgPSBlbGVtZW50LmNoaWxkTm9kZXNbaV07XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7IC8vIHByb2Nlc3Mgb25seSBlbGVtZW50IG5vZGVzXG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKG1hdGNoKG5vZGUpKSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmcvRnVuY3Rpb259IHF1ZXJ5IGRvdCBjbGFzcyBuYW1lIG9yIG5vZGUgbmFtZSBvciBtYXRjaGVyIGZ1bmN0aW9uLlxuICogQHJldHVybiB7SFRNTEVsZW1lbnQvbnVsbH1cbiAqL1xudXRpbC5maW5kUGFyZW50ID0gKGVsZW1lbnQsIHF1ZXJ5LCB1bnRpbCkgPT4ge1xuICBjb25zdCBtYXRjaCA9IHV0aWwucHJlcGFyZVF1ZXJ5KHF1ZXJ5KTtcblxuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICBmb3IgKDs7KSB7XG4gICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50ID09PSBkb2N1bWVudCB8fCBwYXJlbnQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50IHx8ICh1bnRpbCAmJiB1bnRpbChwYXJlbnQpKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChtYXRjaChwYXJlbnQpKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cbiAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbnV0aWwuaXNBdHRhY2hlZCA9IGVsZW1lbnQgPT4gZG9jdW1lbnQuYm9keS5jb250YWlucyhlbGVtZW50KTtcblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbnV0aWwuaGFzQW55Q29tcG9uZW50QXNQYXJlbnQgPSAoZWxlbWVudCkgPT4ge1xuICB3aGlsZSAoZWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgIT09IGVsZW1lbnQpIHtcbiAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKS5tYXRjaCgvKG9ucy1uYXZpZ2F0b3J8b25zLXRhYmJhcnxvbnMtbW9kYWwpLykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xudXRpbC5nZXRBbGxDaGlsZE5vZGVzID0gKGVsZW1lbnQpID0+IHtcbiAgcmV0dXJuIFtlbGVtZW50XS5jb25jYXQoXG4gICAgLi4uQXJyYXkuZnJvbShlbGVtZW50LmNoaWxkcmVuKS5tYXAoY2hpbGRFbCA9PiB7XG4gICAgICByZXR1cm4gdXRpbC5nZXRBbGxDaGlsZE5vZGVzKGNoaWxkRWwpO1xuICAgIH0pXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xudXRpbC5pc1BhZ2VDb250cm9sID0gZWxlbWVudCA9PiBlbGVtZW50Lm5vZGVOYW1lLm1hdGNoKC9eb25zLShuYXZpZ2F0b3J8c3BsaXR0ZXJ8dGFiYmFyfHBhZ2UpJC9pKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb24gdG8gcHJvcGFnYXRlXG4gKi9cbnV0aWwucHJvcGFnYXRlQWN0aW9uID0gKGVsZW1lbnQsIGFjdGlvbikgPT4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoaWxkID0gZWxlbWVudC5jaGlsZE5vZGVzW2ldO1xuICAgIGlmIChjaGlsZFthY3Rpb25dIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIGNoaWxkW2FjdGlvbl0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXRpbC5wcm9wYWdhdGVBY3Rpb24oY2hpbGQsIGFjdGlvbik7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgLSBzdHJpbmcgdG8gYmUgY2FtZWxpemVkXG4gKiBAcmV0dXJuIHtTdHJpbmd9IENhbWVsaXplZCBzdHJpbmdcbiAqL1xudXRpbC5jYW1lbGl6ZSA9IHN0cmluZyA9PiBzdHJpbmcudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8tKFthLXpdKS9nLCAobSwgbCkgPT4gbC50b1VwcGVyQ2FzZSgpKTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyaW5nIC0gc3RyaW5nIHRvIGJlIGh5cGhlbmF0ZWRcbiAqIEByZXR1cm4ge1N0cmluZ30gSHlwaGVuYXRlZCBzdHJpbmdcbiAqL1xudXRpbC5oeXBoZW5hdGUgPSBzdHJpbmcgPT4gc3RyaW5nLnJlcGxhY2UoLyhbYS16QS1aXSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKCk7XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yIC0gdGFnIGFuZCBjbGFzcyBvbmx5XG4gKiBAcGFyYW0ge09iamVjdH0gc3R5bGVcbiAqIEBwYXJhbSB7RWxlbWVudH1cbiAqL1xudXRpbC5jcmVhdGUgPSAoc2VsZWN0b3IgPSAnJywgc3R5bGUgPSB7fSkgPT4ge1xuICBjb25zdCBjbGFzc0xpc3QgPSBzZWxlY3Rvci5zcGxpdCgnLicpO1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjbGFzc0xpc3Quc2hpZnQoKSB8fCAnZGl2Jyk7XG5cbiAgaWYgKGNsYXNzTGlzdC5sZW5ndGgpIHtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IGNsYXNzTGlzdC5qb2luKCcgJyk7XG4gIH1cblxuICBzdHlsZXIoZWxlbWVudCwgc3R5bGUpO1xuXG4gIHJldHVybiBlbGVtZW50O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30gaHRtbFxuICogQHJldHVybiB7RWxlbWVudH1cbiAqL1xudXRpbC5jcmVhdGVFbGVtZW50ID0gKGh0bWwpID0+IHtcbiAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gIGlmIChodG1sIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuaW1wb3J0Tm9kZShodG1sLCB0cnVlKSk7XG4gIH0gZWxzZSB7XG4gICAgd3JhcHBlci5pbm5lckhUTUwgPSBodG1sLnRyaW0oKTtcbiAgfVxuXG4gIGlmICh3cmFwcGVyLmNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICB1dGlsLnRocm93KCdIVE1MIHRlbXBsYXRlIG11c3QgY29udGFpbiBhIHNpbmdsZSByb290IGVsZW1lbnQnKTtcbiAgfVxuXG4gIGNvbnN0IGVsZW1lbnQgPSB3cmFwcGVyLmNoaWxkcmVuWzBdO1xuICB3cmFwcGVyLmNoaWxkcmVuWzBdLnJlbW92ZSgpO1xuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IGh0bWxcbiAqIEByZXR1cm4ge0hUTUxGcmFnbWVudH1cbiAqL1xudXRpbC5jcmVhdGVGcmFnbWVudCA9IChodG1sKSA9PiB7XG4gIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbDtcbiAgcmV0dXJuIGRvY3VtZW50LmltcG9ydE5vZGUodGVtcGxhdGUuY29udGVudCwgdHJ1ZSk7XG59O1xuXG4vKlxuICogQHBhcmFtIHtPYmplY3R9IGRzdCBEZXN0aW5hdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gc3JjIFNvdXJjZSBvYmplY3QocykuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZWZlcmVuY2UgdG8gYGRzdGAuXG4gKi9cbnV0aWwuZXh0ZW5kID0gKGRzdCwgLi4uYXJncykgPT4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJnc1tpXSkge1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFyZ3NbaV0pO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbal07XG4gICAgICAgIGRzdFtrZXldID0gYXJnc1tpXVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkc3Q7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcnJheUxpa2VcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG51dGlsLmFycmF5RnJvbSA9IChhcnJheUxpa2UpID0+IHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcnJheUxpa2UpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1N0cmluZ30ganNvblN0cmluZ1xuICogQHBhcmFtIHtPYmplY3R9IFtmYWlsU2FmZV1cbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xudXRpbC5wYXJzZUpTT05PYmplY3RTYWZlbHkgPSAoanNvblN0cmluZywgZmFpbFNhZmUgPSB7fSkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IEpTT04ucGFyc2UoJycgKyBqc29uU3RyaW5nKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWlsU2FmZTtcbiAgfVxuICByZXR1cm4gZmFpbFNhZmU7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIC0gcGF0aCBzdWNoIGFzICdteUFwcC5jb250cm9sbGVycy5kYXRhLmxvYWREYXRhJ1xuICogQHJldHVybiB7QW55fSAtIHdoYXRldmVyIGlzIGxvY2F0ZWQgYXQgdGhhdCBwYXRoXG4gKi9cbnV0aWwuZmluZEZyb21QYXRoID0gKHBhdGgpID0+IHtcbiAgcGF0aCA9IHBhdGguc3BsaXQoJy4nKTtcbiAgdmFyIGVsID0gd2luZG93LCBrZXk7XG4gIHdoaWxlIChrZXkgPSBwYXRoLnNoaWZ0KCkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25kLWFzc2lnblxuICAgIGVsID0gZWxba2V5XTtcbiAgfVxuICByZXR1cm4gZWw7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAtIFBhZ2Ugb3IgcGFnZS1jb250YWluZXIgdGhhdCBpbXBsZW1lbnRzICd0b3BQYWdlJ1xuICogQHJldHVybiB7SFRNTEVsZW1lbnR8bnVsbH0gLSBWaXNpYmxlIHBhZ2UgZWxlbWVudCBvciBudWxsIGlmIG5vdCBmb3VuZC5cbiAqL1xudXRpbC5nZXRUb3BQYWdlID0gY29udGFpbmVyID0+IGNvbnRhaW5lciAmJiAoY29udGFpbmVyLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ29ucy1wYWdlJyA/IGNvbnRhaW5lciA6IGNvbnRhaW5lci50b3BQYWdlKSB8fCBudWxsO1xuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lciAtIEVsZW1lbnQgd2hlcmUgdGhlIHNlYXJjaCBiZWdpbnNcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fG51bGx9IC0gUGFnZSBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIHZpc2libGUgdG9vbGJhciBvciBudWxsLlxuICovXG51dGlsLmZpbmRUb29sYmFyUGFnZSA9IGNvbnRhaW5lciA9PiB7XG4gIGNvbnN0IHBhZ2UgPSB1dGlsLmdldFRvcFBhZ2UoY29udGFpbmVyKTtcblxuICBpZiAocGFnZSkge1xuICAgIGlmIChwYWdlLl9jYW5BbmltYXRlVG9vbGJhcigpKSB7XG4gICAgICByZXR1cm4gcGFnZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhZ2UuX2NvbnRlbnRFbGVtZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuZXh0UGFnZSA9IHV0aWwuZ2V0VG9wUGFnZShwYWdlLl9jb250ZW50RWxlbWVudC5jaGlsZHJlbltpXSk7XG4gICAgICBpZiAobmV4dFBhZ2UgJiYgIS9vbnMtdGFiYmFyL2kudGVzdChwYWdlLl9jb250ZW50RWxlbWVudC5jaGlsZHJlbltpXS50YWdOYW1lKSkge1xuICAgICAgICByZXR1cm4gdXRpbC5maW5kVG9vbGJhclBhZ2UobmV4dFBhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbZGV0YWlsXVxuICogQHJldHVybiB7Q3VzdG9tRXZlbnR9XG4gKi9cbnV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCA9ICh0YXJnZXQsIGV2ZW50TmFtZSwgZGV0YWlsID0ge30pID0+IHtcblxuICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHtcbiAgICBidWJibGVzOiB0cnVlLFxuICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgZGV0YWlsOiBkZXRhaWxcbiAgfSk7XG5cbiAgT2JqZWN0LmtleXMoZGV0YWlsKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgZXZlbnRba2V5XSA9IGRldGFpbFtrZXldO1xuICB9KTtcblxuICB0YXJnZXQuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgcmV0dXJuIGV2ZW50O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHBhcmFtIHtTdHJpbmd9IG1vZGlmaWVyTmFtZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xudXRpbC5oYXNNb2RpZmllciA9ICh0YXJnZXQsIG1vZGlmaWVyTmFtZSkgPT4ge1xuICBpZiAoIXRhcmdldC5oYXNBdHRyaWJ1dGUoJ21vZGlmaWVyJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gUmVnRXhwKGAoXnxcXFxccyspJHttb2RpZmllck5hbWV9KCR8XFxcXHMrKWAsICdpJykudGVzdCh0YXJnZXQuZ2V0QXR0cmlidXRlKCdtb2RpZmllcicpKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7U3RyaW5nfSBtb2RpZmllck5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLmF1dG9TdHlsZSBNYXBzIHRoZSBtb2RpZmllck5hbWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGVkIG1vZGlmaWVyLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMuZm9yY2VBdXRvU3R5bGUgSWdub3JlcyBwbGF0Zm9ybSBsaW1pdGF0aW9uLlxuICogQHJldHVybiB7Qm9vbGVhbn0gV2hldGhlciBpdCB3YXMgYWRkZWQgb3Igbm90LlxuICovXG51dGlsLmFkZE1vZGlmaWVyID0gKHRhcmdldCwgbW9kaWZpZXJOYW1lLCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKG9wdGlvbnMuYXV0b1N0eWxlKSB7XG4gICAgbW9kaWZpZXJOYW1lID0gYXV0b1N0eWxlLm1hcE1vZGlmaWVyKG1vZGlmaWVyTmFtZSwgdGFyZ2V0LCBvcHRpb25zLmZvcmNlQXV0b1N0eWxlKTtcbiAgfVxuXG4gIGlmICh1dGlsLmhhc01vZGlmaWVyKHRhcmdldCwgbW9kaWZpZXJOYW1lKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJywgKCh0YXJnZXQuZ2V0QXR0cmlidXRlKCdtb2RpZmllcicpIHx8ICcnKSArICcgJyArIG1vZGlmaWVyTmFtZSkudHJpbSgpKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gbW9kaWZpZXJOYW1lXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucy5hdXRvU3R5bGUgTWFwcyB0aGUgbW9kaWZpZXJOYW1lIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlZCBtb2RpZmllci5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLmZvcmNlQXV0b1N0eWxlIElnbm9yZXMgcGxhdGZvcm0gbGltaXRhdGlvbi5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgaXQgd2FzIGZvdW5kIG9yIG5vdC5cbiAqL1xudXRpbC5yZW1vdmVNb2RpZmllciA9ICh0YXJnZXQsIG1vZGlmaWVyTmFtZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGlmIChvcHRpb25zLmF1dG9TdHlsZSkge1xuICAgIG1vZGlmaWVyTmFtZSA9IGF1dG9TdHlsZS5tYXBNb2RpZmllcihtb2RpZmllck5hbWUsIHRhcmdldCwgb3B0aW9ucy5mb3JjZUF1dG9TdHlsZSk7XG4gIH1cblxuICBpZiAoIXRhcmdldC5nZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJykgfHwgIXV0aWwuaGFzTW9kaWZpZXIodGFyZ2V0LCBtb2RpZmllck5hbWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbmV3TW9kaWZpZXJzID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihtID0+IG0gJiYgbSAhPT0gbW9kaWZpZXJOYW1lKTtcbiAgbmV3TW9kaWZpZXJzLmxlbmd0aCA/IHRhcmdldC5zZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJywgbmV3TW9kaWZpZXJzLmpvaW4oJyAnKSkgOiB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKCdtb2RpZmllcicpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7U3RyaW5nfSBtb2RpZmllck5hbWVcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gb3B0aW9ucy5mb3JjZSBGb3JjZXMgbW9kaWZpZXIgdG8gYmUgYWRkZWQgb3IgcmVtb3ZlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLmF1dG9TdHlsZSBNYXBzIHRoZSBtb2RpZmllck5hbWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGVkIG1vZGlmaWVyLlxuICogQHBhcmFtIHtCb29sZWFufSBvcHRpb25zLmZvcmNlQXV0b1N0eWxlIElnbm9yZXMgcGxhdGZvcm0gbGltaXRhdGlvbi5cbiAqIEByZXR1cm4ge0Jvb2xlYW59IFdoZXRoZXIgaXQgd2FzIGZvdW5kIG9yIG5vdC5cbiAqL1xudXRpbC50b2dnbGVNb2RpZmllciA9ICguLi5hcmdzKSA9PiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBhcmdzLmxlbmd0aCA+IDIgPyBhcmdzWzJdIDoge307XG4gIGNvbnN0IGZvcmNlID0gdHlwZW9mIG9wdGlvbnMgPT09ICdib29sZWFuJyA/IG9wdGlvbnMgOiBvcHRpb25zLmZvcmNlO1xuXG4gIGNvbnN0IHRvZ2dsZSA9IHR5cGVvZiBmb3JjZSA9PT0gJ2Jvb2xlYW4nID8gZm9yY2UgOiAhdXRpbC5oYXNNb2RpZmllciguLi5hcmdzKTtcbiAgdG9nZ2xlID8gdXRpbC5hZGRNb2RpZmllciguLi5hcmdzKSA6IHV0aWwucmVtb3ZlTW9kaWZpZXIoLi4uYXJncyk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqIEBwYXJhbSB7U3RyaW5nfSBkZWZhdWx0Q2xhc3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWVcbiAqL1xudXRpbC5yZXN0b3JlQ2xhc3MgPSAoZWwsIGRlZmF1bHRDbGFzcywgc2NoZW1lKSA9PiB7XG4gIGRlZmF1bHRDbGFzcy5zcGxpdCgvXFxzKy8pLmZvckVhY2goYyA9PiBjICE9PSAnJyAmJiAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKGMpICYmIGVsLmNsYXNzTGlzdC5hZGQoYykpO1xuICBlbC5oYXNBdHRyaWJ1dGUoJ21vZGlmaWVyJykgJiYgTW9kaWZpZXJVdGlsLnJlZnJlc2goZWwsIHNjaGVtZSk7XG59O1xuXG4vLyBUT0RPOiBGSVhcbnV0aWwudXBkYXRlUGFyZW50UG9zaXRpb24gPSAoZWwpID0+IHtcbiAgaWYgKCFlbC5fcGFyZW50VXBkYXRlZCAmJiBlbC5wYXJlbnRFbGVtZW50KSB7XG4gICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsLnBhcmVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSB7XG4gICAgICBlbC5wYXJlbnRFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB9XG4gICAgZWwuX3BhcmVudFVwZGF0ZWQgPSB0cnVlO1xuICB9XG59O1xuXG51dGlsLnRvZ2dsZUF0dHJpYnV0ZSA9IChlbGVtZW50LCBuYW1lLCB2YWx1ZSkgPT4ge1xuICBpZiAodmFsdWUpIHtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyA/ICcnIDogdmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9XG59O1xuXG51dGlsLmJpbmRMaXN0ZW5lcnMgPSAoZWxlbWVudCwgbGlzdGVuZXJOYW1lcykgPT4ge1xuICBsaXN0ZW5lck5hbWVzLmZvckVhY2gobmFtZSA9PiB7XG4gICAgY29uc3QgYm91bmROYW1lID0gbmFtZS5yZXBsYWNlKC9eX1thLXpdLywgJ19ib3VuZCcgKyBuYW1lWzFdLnRvVXBwZXJDYXNlKCkpO1xuICAgIGVsZW1lbnRbYm91bmROYW1lXSA9IGVsZW1lbnRbYm91bmROYW1lXSB8fCBlbGVtZW50W25hbWVdLmJpbmQoZWxlbWVudCk7XG4gIH0pO1xufTtcblxudXRpbC5lYWNoID0gKG9iaiwgZikgPT4gT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGtleSA9PiBmKGtleSwgb2JqW2tleV0pKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1JpcHBsZVxuICogQHBhcmFtIHtPYmplY3R9IGF0dHJzXG4gKi9cbnV0aWwudXBkYXRlUmlwcGxlID0gKHRhcmdldCwgaGFzUmlwcGxlLCBhdHRycyA9IHt9KSA9PiB7XG4gIGlmIChoYXNSaXBwbGUgPT09IHVuZGVmaW5lZCkge1xuICAgIGhhc1JpcHBsZSA9IHRhcmdldC5oYXNBdHRyaWJ1dGUoJ3JpcHBsZScpO1xuICB9XG5cbiAgY29uc3QgcmlwcGxlRWxlbWVudCA9IHV0aWwuZmluZENoaWxkKHRhcmdldCwgJ29ucy1yaXBwbGUnKTtcblxuICBpZiAoaGFzUmlwcGxlKSB7XG4gICAgaWYgKCFyaXBwbGVFbGVtZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb25zLXJpcHBsZScpO1xuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpLmZvckVhY2goa2V5ID0+IGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgYXR0cnNba2V5XSkpO1xuICAgICAgdGFyZ2V0Lmluc2VydEJlZm9yZShlbGVtZW50LCB0YXJnZXQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHJpcHBsZUVsZW1lbnQpIHtcbiAgICByaXBwbGVFbGVtZW50LnJlbW92ZSgpO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG51dGlsLmFuaW1hdGlvbk9wdGlvbnNQYXJzZSA9IGFuaW1hdGlvbk9wdGlvbnNQYXJzZTtcblxuLyoqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKi9cbnV0aWwuaXNJbnRlZ2VyID0gKHZhbHVlKSA9PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgaXNGaW5pdGUodmFsdWUpICYmXG4gICAgTWF0aC5mbG9vcih2YWx1ZSkgPT09IHZhbHVlO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtPYmplY3R9IERlZmVycmVkIHByb21pc2UuXG4gKi9cbnV0aWwuZGVmZXIgPSAoKSA9PiB7XG4gIGNvbnN0IGRlZmVycmVkID0ge307XG4gIGRlZmVycmVkLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZGVmZXJyZWQucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgZGVmZXJyZWQucmVqZWN0ID0gcmVqZWN0O1xuICB9KTtcbiAgcmV0dXJuIGRlZmVycmVkO1xufTtcblxuLyoqXG4gKiBTaG93IHdhcm5pbmdzIHdoZW4gdGhleSBhcmUgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0geyp9IGFyZ3VtZW50cyB0byBjb25zb2xlLndhcm5cbiAqL1xudXRpbC53YXJuID0gKC4uLmFyZ3MpID0+IHtcbiAgaWYgKCFpbnRlcm5hbC5jb25maWcud2FybmluZ3NEaXNhYmxlZCkge1xuICAgIGNvbnNvbGUud2FybihlcnJvclByZWZpeCwgLi4uYXJncyk7XG4gIH1cbn07XG5cbnV0aWwudGhyb3cgPSAobWVzc2FnZSkgPT4ge1xuICB0aHJvdyBuZXcgRXJyb3IoYCR7ZXJyb3JQcmVmaXh9ICR7bWVzc2FnZX1gKTtcbn07XG5cbnV0aWwudGhyb3dBYnN0cmFjdCA9ICgpID0+IHV0aWwudGhyb3coJ0Nhbm5vdCBpbnN0YW50aWF0ZSBhYnN0cmFjdCBjbGFzcycpO1xudXRpbC50aHJvd01lbWJlciA9ICgpID0+IHV0aWwudGhyb3coJ0NsYXNzIG1lbWJlciBtdXN0IGJlIGltcGxlbWVudGVkJyk7XG51dGlsLnRocm93UGFnZUxvYWRlciA9ICgpID0+IHV0aWwudGhyb3coJ0ZpcnN0IHBhcmFtZXRlciBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2YgUGFnZUxvYWRlcicpO1xudXRpbC50aHJvd0FuaW1hdG9yID0gKGVsKSA9PiB1dGlsLnRocm93KGBcIkFuaW1hdG9yXCIgcGFyYW0gbXVzdCBpbmhlcml0ICR7ZWx9QW5pbWF0b3JgKTtcblxuXG5jb25zdCBwcmV2ZW50ID0gZSA9PiBlLmNhbmNlbGFibGUgJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4vKipcbiAqIFByZXZlbnQgc2Nyb2xsaW5nIHdoaWxlIGRyYWdpbmcgaG9yaXpvbnRhbGx5IG9uIGlPUy5cbiAqXG4gKiBAcGFyYW0ge2dkfSBHZXN0dXJlRGV0ZWN0b3IgaW5zdGFuY2VcbiAqL1xudXRpbC5pb3NQcmV2ZW50U2Nyb2xsID0gZ2QgPT4ge1xuICBpZiAodXRpbC5nbG9iYWxzLmFjdHVhbE1vYmlsZU9TID09PSAnaW9zJykge1xuICAgIGNvbnN0IGNsZWFuID0gKGUpID0+IHtcbiAgICAgIGdkLm9mZigndG91Y2htb3ZlJywgcHJldmVudCk7XG4gICAgICBnZC5vZmYoJ2RyYWdlbmQnLCBjbGVhbik7XG4gICAgfTtcblxuICAgIGdkLm9uKCd0b3VjaG1vdmUnLCBwcmV2ZW50KTtcbiAgICBnZC5vbignZHJhZ2VuZCcsIGNsZWFuKTtcbiAgfVxufTtcblxuLyoqXG4gKiBQcmV2ZW50cyBzY3JvbGwgaW4gdW5kZXJseWluZyBwYWdlcyBvbiBpT1MuIFNlZSAjMjIyMCAjMjI3NCAjMTk0OVxuICpcbiAqIEBwYXJhbSB7ZWx9IEhUTUxFbGVtZW50IHRoYXQgcHJldmVudHMgdGhlIGV2ZW50c1xuICogQHBhcmFtIHthZGR9IEJvb2xlYW4gQWRkIG9yIHJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAqL1xudXRpbC5pb3NQYWdlU2Nyb2xsRml4ID0gKGFkZCkgPT4geyAvLyBGdWxsIGZpeCAtIE1heSBjYXVzZSBpc3N1ZXMgd2l0aCBVSVdlYlZpZXcncyBtb21lbnR1bSBzY3JvbGxcbiAgaWYgKHV0aWwuZ2xvYmFscy5hY3R1YWxNb2JpbGVPUyA9PT0gJ2lvcycpIHtcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ29ucy1pb3Mtc2Nyb2xsJywgYWRkKTsgLy8gQWxsb3dzIGN1c3RvbSBhbmQgbG9jYWxpemVkIGZpeGVzICgjMjI3NClcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ29ucy1pb3Mtc2Nyb2xsLWZpeCcsIGFkZCk7XG4gIH1cbn07XG5cbi8qKlxuICogRGlzdGFuY2UgYW5kIGRlbHRhVGltZSBmaWx0ZXIgc29tZSB3ZWlyZCBkcmFnc3RhcnQgZXZlbnRzIHRoYXQgYXJlIG5vdCBmaXJlZCBpbW1lZGlhdGVseS5cbiAqXG4gKiBAcGFyYW0ge2V2ZW50fVxuICovXG51dGlsLmlzVmFsaWRHZXN0dXJlID0gZXZlbnQgPT4gZXZlbnQuZ2VzdHVyZSAhPT0gdW5kZWZpbmVkICYmIChldmVudC5nZXN0dXJlLmRpc3RhbmNlIDw9IDE1IHx8IGV2ZW50Lmdlc3R1cmUuZGVsdGFUaW1lIDw9IDEwMCk7XG5cbnV0aWwuY2hlY2tNaXNzaW5nSW1wb3J0ID0gKC4uLmVsZW1lbnROYW1lcykgPT4ge1xuICBlbGVtZW50TmFtZXMuZm9yRWFjaChuYW1lID0+IHtcbiAgICBpZiAoIW9uc0VsZW1lbnRzW25hbWVdKSB7XG4gICAgICB1dGlsLnRocm93KGBPbnMke25hbWV9IGlzIHJlcXVpcmVkIGJ1dCB3YXMgbm90IGltcG9ydGVkIChDdXN0b20gRWxlbWVudHMpYCk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogRGVmaW5lcyBhIGJvb2xlYW4gcHJvcGVydHkgdGhhdCByZWZsZWN0cyBhbiBhdHRyaWJ1dGUgb2YgdGhlIHNhbWUgbmFtZSBmb3IgYVxuICogZ2l2ZW4gbGlzdCBvZiBhdHRyaWJ1dGVzLlxuICovXG51dGlsLmRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzID0gKG9iamVjdCwgYXR0cmlidXRlTGlzdCkgPT4ge1xuICBhdHRyaWJ1dGVMaXN0LmZvckVhY2goYXR0cmlidXRlTmFtZSA9PiB7XG4gICAgY29uc3QgcHJvcGVydHlOYW1lID0gdXRpbC5jYW1lbGl6ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LnByb3RvdHlwZSwgcHJvcGVydHlOYW1lLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH0sXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBEZWZpbmVzIGEgc3RyaW5nIHByb3BlcnR5IHRoYXQgcmVmbGVjdHMgYW4gYXR0cmlidXRlIG9mIHRoZSBzYW1lIG5hbWUgZm9yIGFcbiAqIGdpdmVuIGxpc3Qgb2YgYXR0cmlidXRlcy5cbiAqL1xudXRpbC5kZWZpbmVTdHJpbmdQcm9wZXJ0aWVzID0gKG9iamVjdCwgYXR0cmlidXRlTGlzdCkgPT4ge1xuICBhdHRyaWJ1dGVMaXN0LmZvckVhY2goYXR0cmlidXRlTmFtZSA9PiB7XG4gICAgY29uc3QgcHJvcGVydHlOYW1lID0gdXRpbC5jYW1lbGl6ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LnByb3RvdHlwZSwgcHJvcGVydHlOYW1lLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH0sXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfSk7XG59O1xuLyoqXG4gKiBNYWtlcyBhIHByb3BlcnR5IGZvciBhIGxpc3RlbmVyIGUuZy4gb25DbGljay5cbiAqXG4gKiBSZXR1cm5zIGBvbkNvbm5lY3RlZGAgZnVuY3Rpb24gd2hpY2ggc2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgZWxlbWVudCdzXG4gKiBjb25uZWN0ZWRDYWxsYmFjaywgYW5kIGBvbkRpc2Nvbm5lY3RlZGAgZnVuY3Rpb24gd2hpY2ggc2hvdWxkIGJlIGNhbGxlZCBpblxuICogdGhlIGVsZW1lbnQncyBkaXNjb25uZWN0ZWRDYWxsYmFjay5cbiAqL1xudXRpbC5kZWZpbmVMaXN0ZW5lclByb3BlcnR5ID0gKGVsZW1lbnQsIGV2ZW50TmFtZSkgPT4ge1xuICBjb25zdCBjYW1lbGl6ZWQgPSB1dGlsLmNhbWVsaXplKGV2ZW50TmFtZSk7XG4gIGNvbnN0IHByb3BlcnR5TmFtZSA9ICdvbicgKyBjYW1lbGl6ZWQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBjYW1lbGl6ZWQuc2xpY2UoMSk7XG5cbiAgbGV0IGhhbmRsZXI7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCBwcm9wZXJ0eU5hbWUsIHtcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gaGFuZGxlcjtcbiAgICB9LFxuICAgIHNldChuZXdIYW5kbGVyKSB7XG4gICAgICBpZiAoZWxlbWVudC5pc0Nvbm5lY3RlZCkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIG5ld0hhbmRsZXIpO1xuICAgICAgfVxuXG4gICAgICBoYW5kbGVyID0gbmV3SGFuZGxlcjtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG9uQ29ubmVjdGVkKCkge1xuICAgICAgaWYgKGVsZW1lbnRbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBlbGVtZW50W3Byb3BlcnR5TmFtZV0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkRpc2Nvbm5lY3RlZCgpIHtcbiAgICAgIGlmIChlbGVtZW50W3Byb3BlcnR5TmFtZV0pIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZWxlbWVudFtwcm9wZXJ0eU5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB1dGlsO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4vcGxhdGZvcm0uanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsLmpzJztcblxuY29uc3QgZXJyb3IgPSBtZXNzYWdlID0+IHV0aWwudGhyb3coYEluIFBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uOiAke21lc3NhZ2V9YCk7XG5cbmNvbnN0IHBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uID0ge1xuICBfdmFyaWFibGVzOiB7fSxcblxuICAvKipcbiAgICogRGVmaW5lIGEgdmFyaWFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHZhcmlhYmxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSB2YWx1ZSBWYWx1ZSBvZiB0aGUgdmFyaWFibGUuIENhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSBzdHJpbmcuXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gb3ZlcndyaXRlIElmIHRoaXMgdmFsdWUgaXMgZmFsc2UsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duIHdoZW4gdHJ5aW5nIHRvIGRlZmluZSBhIHZhcmlhYmxlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLlxuICAgKi9cbiAgZGVmaW5lVmFyaWFibGU6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBvdmVyd3JpdGU9ZmFsc2UpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJvcignVmFyaWFibGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignVmFyaWFibGUgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl92YXJpYWJsZXMsIG5hbWUpICYmICFvdmVyd3JpdGUpIHtcbiAgICAgIGVycm9yKGBcIiR7bmFtZX1cIiBpcyBhbHJlYWR5IGRlZmluZWRgKTtcbiAgICB9XG4gICAgdGhpcy5fdmFyaWFibGVzW25hbWVdID0gdmFsdWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCBhIHZhcmlhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSB2YXJpYWJsZS5cbiAgICogQHJldHVybiB7U3RyaW5nfEZ1bmN0aW9ufG51bGx9XG4gICAqL1xuICBnZXRWYXJpYWJsZTogZnVuY3Rpb24obmFtZSkge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3ZhcmlhYmxlcywgbmFtZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl92YXJpYWJsZXNbbmFtZV07XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHZhcmlhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSB2YXJhaWJsZS5cbiAgICovXG4gIHJlbW92ZVZhcmlhYmxlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuX3ZhcmlhYmxlc1tuYW1lXTtcbiAgfSxcblxuICAvKipcbiAgICogR2V0IGFsbCB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICovXG4gIGdldEFsbFZhcmlhYmxlczogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhcmlhYmxlcztcbiAgfSxcbiAgX3BhcnNlUGFydDogZnVuY3Rpb24ocGFydCkge1xuICAgIGxldCBjLFxuICAgICAgaW5JbnRlcnBvbGF0aW9uID0gZmFsc2UsXG4gICAgICBjdXJyZW50SW5kZXggPSAwO1xuXG4gICAgY29uc3QgdG9rZW5zID0gW107XG5cbiAgICBpZiAocGFydC5sZW5ndGggPT09IDApIHtcbiAgICAgIGVycm9yKCdVbmFibGUgdG8gcGFyc2UgZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjID0gcGFydC5jaGFyQXQoaSk7XG5cbiAgICAgIGlmIChjID09PSAnJCcgJiYgcGFydC5jaGFyQXQoaSArIDEpID09PSAneycpIHtcbiAgICAgICAgaWYgKGluSW50ZXJwb2xhdGlvbikge1xuICAgICAgICAgIGVycm9yKCdOZXN0ZWQgaW50ZXJwb2xhdGlvbiBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b2tlbiA9IHBhcnQuc3Vic3RyaW5nKGN1cnJlbnRJbmRleCwgaSk7XG4gICAgICAgIGlmICh0b2tlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2gocGFydC5zdWJzdHJpbmcoY3VycmVudEluZGV4LCBpKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50SW5kZXggPSBpO1xuICAgICAgICBpbkludGVycG9sYXRpb24gPSB0cnVlO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYyA9PT0gJ30nKSB7XG4gICAgICAgIGlmICghaW5JbnRlcnBvbGF0aW9uKSB7XG4gICAgICAgICAgZXJyb3IoJ30gbXVzdCBiZSBwcmVjZWVkZWQgYnkgJHsnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRva2VuID0gcGFydC5zdWJzdHJpbmcoY3VycmVudEluZGV4LCBpICsgMSk7XG4gICAgICAgIGlmICh0b2tlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdG9rZW5zLnB1c2gocGFydC5zdWJzdHJpbmcoY3VycmVudEluZGV4LCBpICsgMSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudEluZGV4ID0gaSArIDE7XG4gICAgICAgIGluSW50ZXJwb2xhdGlvbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpbkludGVycG9sYXRpb24pIHtcbiAgICAgIGVycm9yKCdVbnRlcm1pbmF0ZWQgaW50ZXJwb2xhdGlvbicpO1xuICAgIH1cblxuICAgIHRva2Vucy5wdXNoKHBhcnQuc3Vic3RyaW5nKGN1cnJlbnRJbmRleCwgcGFydC5sZW5ndGgpKTtcblxuICAgIHJldHVybiB0b2tlbnM7XG4gIH0sXG4gIF9yZXBsYWNlVG9rZW46IGZ1bmN0aW9uKHRva2VuKSB7XG4gICAgY29uc3QgcmUgPSAvXlxcJHsoLio/KX0kLyxcbiAgICAgIG1hdGNoID0gdG9rZW4ubWF0Y2gocmUpO1xuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBuYW1lID0gbWF0Y2hbMV0udHJpbSgpO1xuICAgICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLmdldFZhcmlhYmxlKG5hbWUpO1xuXG4gICAgICBpZiAodmFyaWFibGUgPT09IG51bGwpIHtcbiAgICAgICAgZXJyb3IoYFZhcmlhYmxlIFwiJHtuYW1lfVwiIGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFyaWFibGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB2YXJpYWJsZTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBydiA9IHZhcmlhYmxlKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBydiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBlcnJvcignTXVzdCByZXR1cm4gYSBzdHJpbmcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBydjtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gdG9rZW47XG4gICAgfVxuICB9LFxuICBfcmVwbGFjZVRva2VuczogZnVuY3Rpb24odG9rZW5zKSB7XG4gICAgcmV0dXJuIHRva2Vucy5tYXAodGhpcy5fcmVwbGFjZVRva2VuLmJpbmQodGhpcykpO1xuICB9LFxuICBfcGFyc2VFeHByZXNzaW9uOiBmdW5jdGlvbihleHByZXNzaW9uKSB7XG4gICAgcmV0dXJuIGV4cHJlc3Npb24uc3BsaXQoJywnKVxuICAgICAgLm1hcChcbiAgICAgICAgZnVuY3Rpb24ocGFydCkge1xuICAgICAgICAgIHJldHVybiBwYXJ0LnRyaW0oKTtcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgLm1hcCh0aGlzLl9wYXJzZVBhcnQuYmluZCh0aGlzKSlcbiAgICAgIC5tYXAodGhpcy5fcmVwbGFjZVRva2Vucy5iaW5kKHRoaXMpKVxuICAgICAgLm1hcCgocGFydCkgPT4gcGFydC5qb2luKCcnKSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlIGFuIGV4cHJlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBleHByZXNzaW9uIEFuIHBhZ2UgYXR0cmlidXRlIGV4cHJlc3Npb24uXG4gICAqIEByZXR1cm4ge0FycmF5fVxuICAgKi9cbiAgZXZhbHVhdGU6IGZ1bmN0aW9uKGV4cHJlc3Npb24pIHtcbiAgICBpZiAoIWV4cHJlc3Npb24pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb24pO1xuICB9XG59O1xuXG4vLyBEZWZpbmUgZGVmYXVsdCB2YXJpYWJsZXMuXG5wYWdlQXR0cmlidXRlRXhwcmVzc2lvbi5kZWZpbmVWYXJpYWJsZSgnbW9iaWxlT1MnLCBwbGF0Zm9ybS5nZXRNb2JpbGVPUygpKTtcbnBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uLmRlZmluZVZhcmlhYmxlKCdpT1NEZXZpY2UnLCBwbGF0Zm9ybS5nZXRJT1NEZXZpY2UoKSk7XG5wYWdlQXR0cmlidXRlRXhwcmVzc2lvbi5kZWZpbmVWYXJpYWJsZSgncnVudGltZScsICgpID0+IHtcbiAgcmV0dXJuIHBsYXRmb3JtLmlzV2ViVmlldygpID8gJ2NvcmRvdmEnIDogJ2Jyb3dzZXInO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi4vdXRpbC5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0uanMnO1xuaW1wb3J0IHBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uIGZyb20gJy4uL3BhZ2UtYXR0cmlidXRlLWV4cHJlc3Npb24uanMnO1xuXG5jb25zdCBpbnRlcm5hbCA9IHt9O1xuXG5pbnRlcm5hbC5jb25maWcgPSB7XG4gIGF1dG9TdGF0dXNCYXJGaWxsOiB0cnVlLFxuICBhbmltYXRpb25zRGlzYWJsZWQ6IGZhbHNlLFxuICB3YXJuaW5nc0Rpc2FibGVkOiBmYWxzZVxufTtcblxuaW50ZXJuYWwubnVsbEVsZW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbi8qKlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuaW50ZXJuYWwuaXNFbmFibGVkQXV0b1N0YXR1c0JhckZpbGwgPSAoKSA9PiB7XG4gIHJldHVybiAhIWludGVybmFsLmNvbmZpZy5hdXRvU3RhdHVzQmFyRmlsbDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtTdHJpbmd9IGh0bWxcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuaW50ZXJuYWwubm9ybWFsaXplUGFnZUhUTUwgPSBodG1sID0+ICgnJyArIGh0bWwpLnRyaW0oKTtcblxuaW50ZXJuYWwud2FpdERPTUNvbnRlbnRMb2FkZWQgPSBjYWxsYmFjayA9PiB7XG4gIGlmICh3aW5kb3cuZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8IHdpbmRvdy5kb2N1bWVudC5yZWFkeVN0YXRlID09ICd1bmluaXRpYWxpemVkJykge1xuICAgIGNvbnN0IHdyYXBwZWRDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHdyYXBwZWRDYWxsYmFjayk7XG4gICAgfTtcbiAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHdyYXBwZWRDYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbiAgfVxufTtcblxuaW50ZXJuYWwuYXV0b1N0YXR1c0JhckZpbGwgPSBhY3Rpb24gPT4ge1xuICBjb25zdCBvblJlYWR5ID0gKCkgPT4ge1xuICAgIGlmIChpbnRlcm5hbC5zaG91bGRGaWxsU3RhdHVzQmFyKCkpIHtcbiAgICAgIGFjdGlvbigpO1xuICAgIH1cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsIG9uUmVhZHkpO1xuICB9O1xuXG4gIGlmICh0eXBlb2YgZGV2aWNlID09PSAnb2JqZWN0Jykge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5Jywgb25SZWFkeSk7XG4gIH0gZWxzZSBpZiAoWydjb21wbGV0ZScsICdpbnRlcmFjdGl2ZSddLmluZGV4T2YoZG9jdW1lbnQucmVhZHlTdGF0ZSkgPT09IC0xKSB7XG4gICAgaW50ZXJuYWwud2FpdERPTUNvbnRlbnRMb2FkZWQob25SZWFkeSk7XG4gIH0gZWxzZSB7XG4gICAgb25SZWFkeSgpO1xuICB9XG59O1xuXG5pbnRlcm5hbC5zaG91bGRGaWxsU3RhdHVzQmFyID0gKCkgPT5cbiAgaW50ZXJuYWwuaXNFbmFibGVkQXV0b1N0YXR1c0JhckZpbGwoKSAmJiAocGxhdGZvcm0uaXNXZWJWaWV3KCkgJiYgKHBsYXRmb3JtLmlzSU9TN2Fib3ZlKCkgfHwgcGxhdGZvcm0uaXNJUGFkT1MoKSlcbiAgICAmJiAhcGxhdGZvcm0uaXNJUGhvbmVYKCkgfHwgZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yKCcub25zLXN0YXR1cy1iYXItbW9jay5pb3MnKSk7XG5cbmludGVybmFsLnRlbXBsYXRlU3RvcmUgPSB7XG4gIF9zdG9yYWdlOiB7fSxcblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICAgKiBAcmV0dXJuIHtTdHJpbmcvbnVsbH0gdGVtcGxhdGVcbiAgICovXG4gIGdldChrZXkpIHtcbiAgICByZXR1cm4gaW50ZXJuYWwudGVtcGxhdGVTdG9yZS5fc3RvcmFnZVtrZXldIHx8IG51bGw7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHRlbXBsYXRlXG4gICAqL1xuICBzZXQoa2V5LCB0ZW1wbGF0ZSkge1xuICAgIGludGVybmFsLnRlbXBsYXRlU3RvcmUuX3N0b3JhZ2Vba2V5XSA9IHRlbXBsYXRlO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICovXG5pbnRlcm5hbC5nZXRUZW1wbGF0ZUhUTUxBc3luYyA9IGZ1bmN0aW9uKHBhZ2UpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpbnRlcm5hbC53YWl0RE9NQ29udGVudExvYWRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBjYWNoZSA9IGludGVybmFsLnRlbXBsYXRlU3RvcmUuZ2V0KHBhZ2UpO1xuICAgICAgaWYgKGNhY2hlKSB7XG4gICAgICAgIGlmIChjYWNoZSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShjYWNoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gdHlwZW9mIGNhY2hlID09PSAnc3RyaW5nJyA/IGNhY2hlIDogY2FjaGVbMV07XG4gICAgICAgIHJldHVybiByZXNvbHZlKGludGVybmFsLm5vcm1hbGl6ZVBhZ2VIVE1MKGh0bWwpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9jYWwgPSB3aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFnZSk7XG4gICAgICBpZiAobG9jYWwpIHtcbiAgICAgICAgY29uc3QgaHRtbCA9IGxvY2FsLnRleHRDb250ZW50IHx8IGxvY2FsLmNvbnRlbnQ7XG4gICAgICAgIHJldHVybiByZXNvbHZlKGh0bWwpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgIHhoci5vcGVuKCdHRVQnLCBwYWdlLCB0cnVlKTtcbiAgICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgY29uc3QgaHRtbCA9IHhoci5yZXNwb25zZVRleHQ7XG4gICAgICAgIGlmICh4aHIuc3RhdHVzID49IDQwMCAmJiB4aHIuc3RhdHVzIDwgNjAwKSB7XG4gICAgICAgICAgcmVqZWN0KGh0bWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJlZnJlc2ggc2NyaXB0IHRhZ3NcbiAgICAgICAgICBjb25zdCBmcmFnbWVudCA9IHV0aWwuY3JlYXRlRnJhZ21lbnQoaHRtbCk7XG4gICAgICAgICAgdXRpbC5hcnJheUZyb20oZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICBzY3JpcHQudHlwZSA9IGVsLnR5cGUgfHwgJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICAgICAgICBzY3JpcHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZWwudGV4dCB8fCBlbC50ZXh0Q29udGVudCB8fCBlbC5pbm5lckhUTUwpKTtcbiAgICAgICAgICAgIGVsLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHNjcmlwdCwgZWwpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaW50ZXJuYWwudGVtcGxhdGVTdG9yZS5zZXQocGFnZSwgZnJhZ21lbnQpO1xuICAgICAgICAgIHJlc29sdmUoZnJhZ21lbnQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdXRpbC50aHJvdyhgUGFnZSB0ZW1wbGF0ZSBub3QgZm91bmQ6ICR7cGFnZX1gKTtcbiAgICAgIH07XG4gICAgICB4aHIuc2VuZChudWxsKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICovXG5pbnRlcm5hbC5nZXRQYWdlSFRNTEFzeW5jID0gZnVuY3Rpb24ocGFnZSkge1xuICBjb25zdCBwYWdlcyA9IHBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uLmV2YWx1YXRlKHBhZ2UpO1xuXG4gIGNvbnN0IGdldFBhZ2UgPSAocGFnZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgcGFnZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnTXVzdCBzcGVjaWZ5IGEgcGFnZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJuYWwuZ2V0VGVtcGxhdGVIVE1MQXN5bmMocGFnZSlcbiAgICAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikge1xuICAgICAgICBpZiAocGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXRQYWdlKHBhZ2VzLnNoaWZ0KCkpO1xuICAgICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIGdldFBhZ2UocGFnZXMuc2hpZnQoKSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBpbnRlcm5hbDtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4uL3V0aWwuanMnO1xuaW1wb3J0IGludGVybmFsIGZyb20gJy4uL2ludGVybmFsL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQW5pbWF0b3JGYWN0b3J5IHtcblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdHMuYW5pbWF0b3JzIFRoZSBkaWN0aW9uYXJ5IGZvciBhbmltYXRvciBjbGFzc2VzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wdHMuYmFzZUNsYXNzIFRoZSBiYXNlIGNsYXNzIG9mIGFuaW1hdG9yc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdHMuYmFzZUNsYXNzTmFtZV0gVGhlIG5hbWUgb2YgdGhlIGJhc2UgY2xhc3Mgb2YgYW5pbWF0b3JzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0cy5kZWZhdWx0QW5pbWF0aW9uXSBUaGUgZGVmYXVsdCBhbmltYXRpb24gbmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdHMuZGVmYXVsdEFuaW1hdGlvbk9wdGlvbnNdIFRoZSBkZWZhdWx0IGFuaW1hdGlvbiBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRzKSB7XG4gICAgdGhpcy5fYW5pbWF0b3JzID0gb3B0cy5hbmltYXRvcnM7XG4gICAgdGhpcy5fYmFzZUNsYXNzID0gb3B0cy5iYXNlQ2xhc3M7XG4gICAgdGhpcy5fYmFzZUNsYXNzTmFtZSA9IG9wdHMuYmFzZUNsYXNzTmFtZSB8fCBvcHRzLmJhc2VDbGFzcy5uYW1lO1xuICAgIHRoaXMuX2FuaW1hdGlvbiA9IG9wdHMuZGVmYXVsdEFuaW1hdGlvbiB8fCAnZGVmYXVsdCc7XG4gICAgdGhpcy5fYW5pbWF0aW9uT3B0aW9ucyA9IG9wdHMuZGVmYXVsdEFuaW1hdGlvbk9wdGlvbnMgfHwge307XG5cbiAgICBpZiAoIXRoaXMuX2FuaW1hdG9yc1t0aGlzLl9hbmltYXRpb25dKSB7XG4gICAgICB1dGlsLnRocm93KCdObyBzdWNoIGFuaW1hdGlvbjogJyArIHRoaXMuX2FuaW1hdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBqc29uU3RyaW5nXG4gICAqIEByZXR1cm4ge09iamVjdC9udWxsfVxuICAgKi9cbiAgc3RhdGljIHBhcnNlQW5pbWF0aW9uT3B0aW9uc1N0cmluZyhqc29uU3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YganNvblN0cmluZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdXRpbC5hbmltYXRpb25PcHRpb25zUGFyc2UoanNvblN0cmluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1wiYW5pbWF0aW9uLW9wdGlvbnNcIiBhdHRyaWJ1dGUgbXVzdCBiZSBhIEpTT04gb2JqZWN0IHN0cmluZzogJyArIGpzb25TdHJpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignXCJhbmltYXRpb24tb3B0aW9uc1wiIGF0dHJpYnV0ZSBtdXN0IGJlIGEgSlNPTiBvYmplY3Qgc3RyaW5nOiAnICsganNvblN0cmluZyk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqL1xuICBzZXRBbmltYXRpb25PcHRpb25zKG9wdGlvbnMpIHtcbiAgICB0aGlzLl9hbmltYXRpb25PcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXSBUaGUgYW5pbWF0aW9uIG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdIFRoZSBhbmltYXRpb24gb3B0aW9uc1xuICAgKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdEFuaW1hdG9yIFRoZSBkZWZhdWx0IGFuaW1hdG9yIGluc3RhbmNlXG4gICAqIEByZXR1cm4ge09iamVjdH0gQW4gYW5pbWF0b3IgaW5zdGFuY2VcbiAgICovXG4gIG5ld0FuaW1hdG9yKG9wdGlvbnMgPSB7fSwgZGVmYXVsdEFuaW1hdG9yKSB7XG5cbiAgICBsZXQgYW5pbWF0b3IgPSBudWxsO1xuXG4gICAgaWYgKG9wdGlvbnMuYW5pbWF0aW9uIGluc3RhbmNlb2YgdGhpcy5fYmFzZUNsYXNzKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5hbmltYXRpb247XG4gICAgfVxuXG4gICAgbGV0IEFuaW1hdG9yID0gbnVsbDtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5hbmltYXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBBbmltYXRvciA9IHRoaXMuX2FuaW1hdG9yc1tvcHRpb25zLmFuaW1hdGlvbl07XG4gICAgfVxuXG4gICAgaWYgKCFBbmltYXRvciAmJiBkZWZhdWx0QW5pbWF0b3IpIHtcbiAgICAgIGFuaW1hdG9yID0gZGVmYXVsdEFuaW1hdG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBBbmltYXRvciA9IEFuaW1hdG9yIHx8IHRoaXMuX2FuaW1hdG9yc1t0aGlzLl9hbmltYXRpb25dO1xuXG4gICAgICBjb25zdCBhbmltYXRpb25PcHRzID0gdXRpbC5leHRlbmQoXG4gICAgICAgIHt9LFxuICAgICAgICB0aGlzLl9hbmltYXRpb25PcHRpb25zLFxuICAgICAgICBvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnMgfHwge30sXG4gICAgICAgIGludGVybmFsLmNvbmZpZy5hbmltYXRpb25zRGlzYWJsZWQgPyB7ZHVyYXRpb246IDAsIGRlbGF5OiAwfSA6IHt9XG4gICAgICApO1xuXG4gICAgICBhbmltYXRvciA9IG5ldyBBbmltYXRvcihhbmltYXRpb25PcHRzKTtcblxuICAgICAgaWYgKHR5cGVvZiBhbmltYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhbmltYXRvciA9IG5ldyBhbmltYXRvcihhbmltYXRpb25PcHRzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCEoYW5pbWF0b3IgaW5zdGFuY2VvZiB0aGlzLl9iYXNlQ2xhc3MpKSB7XG4gICAgICB1dGlsLnRocm93KGBcImFuaW1hdG9yXCIgaXMgbm90IGFuIGluc3RhbmNlIG9mICR7dGhpcy5fYmFzZUNsYXNzTmFtZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYW5pbWF0b3I7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS5qcyc7XG5cbmNvbnN0IHV0aWwgPSB7XG4gIF9yZWFkeTogZmFsc2UsXG5cbiAgX2RvbUNvbnRlbnRMb2FkZWQ6IGZhbHNlLFxuXG4gIF9vbkRPTUNvbnRlbnRMb2FkZWQ6ICgpID0+IHtcbiAgICB1dGlsLl9kb21Db250ZW50TG9hZGVkID0gdHJ1ZTtcblxuICAgIGlmIChwbGF0Zm9ybS5pc1dlYlZpZXcoKSkge1xuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgKCkgPT4ge1xuICAgICAgICB1dGlsLl9yZWFkeSA9IHRydWU7XG4gICAgICB9LCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHV0aWwuX3JlYWR5ID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgYWRkQmFja0J1dHRvbkxpc3RlbmVyOiBmdW5jdGlvbihmbikge1xuICAgIGlmICghdGhpcy5fZG9tQ29udGVudExvYWRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIG1ldGhvZCBpcyBhdmFpbGFibGUgYWZ0ZXIgRE9NQ29udGVudExvYWRlZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZWFkeSkge1xuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JhY2tidXR0b24nLCBmbiwgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZGV2aWNlcmVhZHknLCBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JhY2tidXR0b24nLCBmbiwgZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIHJlbW92ZUJhY2tCdXR0b25MaXN0ZW5lcjogZnVuY3Rpb24oZm4pIHtcbiAgICBpZiAoIXRoaXMuX2RvbUNvbnRlbnRMb2FkZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBtZXRob2QgaXMgYXZhaWxhYmxlIGFmdGVyIERPTUNvbnRlbnRMb2FkZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcmVhZHkpIHtcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdiYWNrYnV0dG9uJywgZm4sIGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZXJlYWR5JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdiYWNrYnV0dG9uJywgZm4sIGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gdXRpbC5fb25ET01Db250ZW50TG9hZGVkKCksIGZhbHNlKTtcblxuY29uc3QgSGFuZGxlclJlcG9zaXRvcnkgPSB7XG4gIF9zdG9yZToge30sXG5cbiAgX2dlbklkOiAoKCkgPT4ge1xuICAgIGxldCBpID0gMDtcbiAgICByZXR1cm4gKCkgPT4gaSsrO1xuICB9KSgpLFxuXG4gIHNldDogZnVuY3Rpb24oZWxlbWVudCwgaGFuZGxlcikge1xuICAgIGlmIChlbGVtZW50LmRhdGFzZXQuZGV2aWNlQmFja0J1dHRvbkhhbmRsZXJJZCkge1xuICAgICAgdGhpcy5yZW1vdmUoZWxlbWVudCk7XG4gICAgfVxuICAgIGNvbnN0IGlkID0gZWxlbWVudC5kYXRhc2V0LmRldmljZUJhY2tCdXR0b25IYW5kbGVySWQgPSBIYW5kbGVyUmVwb3NpdG9yeS5fZ2VuSWQoKTtcbiAgICB0aGlzLl9zdG9yZVtpZF0gPSBoYW5kbGVyO1xuICB9LFxuXG4gIHJlbW92ZTogZnVuY3Rpb24oZWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50LmRhdGFzZXQuZGV2aWNlQmFja0J1dHRvbkhhbmRsZXJJZCkge1xuICAgICAgZGVsZXRlIHRoaXMuX3N0b3JlW2VsZW1lbnQuZGF0YXNldC5kZXZpY2VCYWNrQnV0dG9uSGFuZGxlcklkXTtcbiAgICAgIGRlbGV0ZSBlbGVtZW50LmRhdGFzZXQuZGV2aWNlQmFja0J1dHRvbkhhbmRsZXJJZDtcbiAgICB9XG4gIH0sXG5cbiAgZ2V0OiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50LmRhdGFzZXQuZGV2aWNlQmFja0J1dHRvbkhhbmRsZXJJZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IGVsZW1lbnQuZGF0YXNldC5kZXZpY2VCYWNrQnV0dG9uSGFuZGxlcklkO1xuXG4gICAgaWYgKCF0aGlzLl9zdG9yZVtpZF0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zdG9yZVtpZF07XG4gIH0sXG5cbiAgaGFzOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50LmRhdGFzZXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IGVsZW1lbnQuZGF0YXNldC5kZXZpY2VCYWNrQnV0dG9uSGFuZGxlcklkO1xuXG4gICAgcmV0dXJuICEhdGhpcy5fc3RvcmVbaWRdO1xuICB9XG59O1xuXG5jbGFzcyBEZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2JvdW5kQ2FsbGJhY2sgPSB0aGlzLl9jYWxsYmFjay5iaW5kKHRoaXMpO1xuICB9XG5cblxuICAvKipcbiAgICogRW5hYmxlIHRvIGhhbmRsZSAnYmFja2J1dHRvbicgZXZlbnRzLlxuICAgKi9cbiAgZW5hYmxlKCkge1xuICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XG4gICAgICB1dGlsLmFkZEJhY2tCdXR0b25MaXN0ZW5lcih0aGlzLl9ib3VuZENhbGxiYWNrKTtcbiAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgdG8gaGFuZGxlICdiYWNrYnV0dG9uJyBldmVudHMuXG4gICAqL1xuICBkaXNhYmxlKCkge1xuICAgIGlmICh0aGlzLl9pc0VuYWJsZWQpIHtcbiAgICAgIHV0aWwucmVtb3ZlQmFja0J1dHRvbkxpc3RlbmVyKHRoaXMuX2JvdW5kQ2FsbGJhY2spO1xuICAgICAgdGhpcy5faXNFbmFibGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpcmUgYSAnYmFja2J1dHRvbicgZXZlbnQgbWFudWFsbHkuXG4gICAqL1xuICBmaXJlRGV2aWNlQmFja0J1dHRvbkV2ZW50KCkge1xuICAgIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQuaW5pdEV2ZW50KCdiYWNrYnV0dG9uJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH1cblxuICBfY2FsbGJhY2soKSB7XG4gICAgdGhpcy5fZGlzcGF0Y2hEZXZpY2VCYWNrQnV0dG9uRXZlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBjcmVhdGVIYW5kbGVyKGVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnQnKTtcbiAgICB9XG5cbiAgICBpZiAoIShjYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsYmFjayBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIEZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlciA9IHtcbiAgICAgIF9jYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICBfZWxlbWVudDogZWxlbWVudCxcblxuICAgICAgZGlzYWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIEhhbmRsZXJSZXBvc2l0b3J5LnJlbW92ZShlbGVtZW50KTtcbiAgICAgIH0sXG5cbiAgICAgIHNldExpc3RlbmVyOiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgfSxcblxuICAgICAgZW5hYmxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgSGFuZGxlclJlcG9zaXRvcnkuc2V0KGVsZW1lbnQsIHRoaXMpO1xuICAgICAgfSxcblxuICAgICAgaXNFbmFibGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEhhbmRsZXJSZXBvc2l0b3J5LmdldChlbGVtZW50KSA9PT0gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgICAgICBIYW5kbGVyUmVwb3NpdG9yeS5yZW1vdmUoZWxlbWVudCk7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrID0gdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGhhbmRsZXIuZW5hYmxlKCk7XG5cbiAgICByZXR1cm4gaGFuZGxlcjtcbiAgfVxuXG4gIF9kaXNwYXRjaERldmljZUJhY2tCdXR0b25FdmVudCgpIHtcbiAgICBjb25zdCB0cmVlID0gdGhpcy5fY2FwdHVyZVRyZWUoKTtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9maW5kSGFuZGxlckxlYWZFbGVtZW50KHRyZWUpO1xuXG4gICAgbGV0IGhhbmRsZXIgPSBIYW5kbGVyUmVwb3NpdG9yeS5nZXQoZWxlbWVudCk7XG4gICAgaGFuZGxlci5fY2FsbGJhY2soY3JlYXRlRXZlbnQoZWxlbWVudCkpO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlRXZlbnQoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX2VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGNhbGxQYXJlbnRIYW5kbGVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlO1xuXG4gICAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgaGFuZGxlciA9IEhhbmRsZXJSZXBvc2l0b3J5LmdldChwYXJlbnQpO1xuICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIuX2NhbGxiYWNrKGNyZWF0ZUV2ZW50KHBhcmVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqL1xuICBfY2FwdHVyZVRyZWUoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVRyZWUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVUcmVlKGVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHRyZWUgPSB7XG4gICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGNoaWxkcmVuOiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBhcnJheU9mKGVsZW1lbnQuY2hpbGRyZW4pLm1hcChmdW5jdGlvbihjaGlsZEVsZW1lbnQpIHtcblxuICAgICAgICAgIGlmIChjaGlsZEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnIHx8IGNoaWxkRWxlbWVudC5faXNTaG93biA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhSGFuZGxlclJlcG9zaXRvcnkuaGFzKGNoaWxkRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGVUcmVlKGNoaWxkRWxlbWVudCk7XG5cbiAgICAgICAgICBpZiAocmVzdWx0LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhSGFuZGxlclJlcG9zaXRvcnkuaGFzKHJlc3VsdC5lbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBbcmVzdWx0XTtcbiAgICAgICAgfSkpXG4gICAgICB9O1xuXG4gICAgICBpZiAoIUhhbmRsZXJSZXBvc2l0b3J5Lmhhcyh0cmVlLmVsZW1lbnQpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJlZS5jaGlsZHJlbi5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgY29uc3Qgc3ViVHJlZSA9IHRyZWUuY2hpbGRyZW5baV07XG4gICAgICAgICAgaWYgKEhhbmRsZXJSZXBvc2l0b3J5LmhhcyhzdWJUcmVlLmVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gc3ViVHJlZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRyZWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXJyYXlPZih0YXJnZXQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGFyZ2V0W2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0cmVlXG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICAgKi9cbiAgX2ZpbmRIYW5kbGVyTGVhZkVsZW1lbnQodHJlZSkge1xuICAgIHJldHVybiBmaW5kKHRyZWUpO1xuXG4gICAgZnVuY3Rpb24gZmluZChub2RlKSB7XG4gICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG5vZGUuZWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBmaW5kKG5vZGUuY2hpbGRyZW5bMF0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbi5tYXAoZnVuY3Rpb24oY2hpbGROb2RlKSB7XG4gICAgICAgIHJldHVybiBjaGlsZE5vZGUuZWxlbWVudDtcbiAgICAgIH0pLnJlZHVjZShmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICAgICAgICBpZiAoIWxlZnQpIHtcbiAgICAgICAgICByZXR1cm4gcmlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsZWZ0WiA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGxlZnQsICcnKS56SW5kZXgsIDEwKTtcbiAgICAgICAgY29uc3QgcmlnaHRaID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUocmlnaHQsICcnKS56SW5kZXgsIDEwKTtcblxuICAgICAgICBpZiAoIWlzTmFOKGxlZnRaKSAmJiAhaXNOYU4ocmlnaHRaKSkge1xuICAgICAgICAgIHJldHVybiBsZWZ0WiA+IHJpZ2h0WiA/IGxlZnQgOiByaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwdHVyaW5nIGJhY2tidXR0b24taGFuZGxlciBpcyBmYWlsdXJlLicpO1xuICAgICAgfSwgbnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBEZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlcigpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cbmltcG9ydCBpbnRlcm5hbCBmcm9tICcuL2ludGVybmFsLmpzJztcbmltcG9ydCBBbmltYXRvckZhY3RvcnkgZnJvbSAnLi9hbmltYXRvci1mYWN0b3J5LmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBkZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlciBmcm9tICcuL2RldmljZS1iYWNrLWJ1dHRvbi1kaXNwYXRjaGVyLmpzJztcblxuaW50ZXJuYWwuQW5pbWF0b3JGYWN0b3J5ID0gQW5pbWF0b3JGYWN0b3J5O1xuaW50ZXJuYWwuTW9kaWZpZXJVdGlsID0gTW9kaWZpZXJVdGlsO1xuaW50ZXJuYWwuZGJiRGlzcGF0Y2hlciA9IGRldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyO1xuXG5leHBvcnQgZGVmYXVsdCBpbnRlcm5hbDtcblxuIiwiaW1wb3J0ICcuL29ucy9wbGF0Zm9ybS5qcyc7IC8vIFRoaXMgZmlsZSBtdXN0IGJlIGxvYWRlZCBiZWZvcmUgQ3VzdG9tIEVsZW1lbnRzIHBvbHlmaWxscy5cbmltcG9ydCAnLi9wb2x5ZmlsbHMvaW5kZXguanMnO1xuaW1wb3J0ICcuL3ZlbmRvci9pbmRleC5qcyc7XG5pbXBvcnQgJy4vb25zL21pY3JvZXZlbnQuanMnO1xuaW1wb3J0IGludGVybmFsIGZyb20gJy4vb25zL2ludGVybmFsL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0dXAob25zKSB7XG4gIGludGVybmFsLndhaXRET01Db250ZW50TG9hZGVkKGZ1bmN0aW9uKCkge1xuICAgIHJlZ2lzdGVyKCdzY3JpcHRbdHlwZT1cInRleHQvdGVtcGxhdGVcIl0nKTtcbiAgICByZWdpc3Rlcignc2NyaXB0W3R5cGU9XCJ0ZXh0L25nLXRlbXBsYXRlXCJdJyk7XG4gICAgcmVnaXN0ZXIoJ3RlbXBsYXRlJyk7XG5cbiAgICBmdW5jdGlvbiByZWdpc3RlcihxdWVyeSkge1xuICAgICAgY29uc3QgdGVtcGxhdGVzID0gd2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaW50ZXJuYWwudGVtcGxhdGVTdG9yZS5zZXQodGVtcGxhdGVzW2ldLmdldEF0dHJpYnV0ZSgnaWQnKSwgdGVtcGxhdGVzW2ldLnRleHRDb250ZW50IHx8IHRlbXBsYXRlc1tpXS5jb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGlmICh3aW5kb3cuX29uc0xvYWRlZCkge1xuICAgIG9ucy5fdXRpbC53YXJuKCdPbnNlbiBVSSBpcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuJyk7XG4gIH1cbiAgd2luZG93Ll9vbnNMb2FkZWQgPSB0cnVlO1xuXG4gIG9ucy5yZWFkeShmdW5jdGlvbigpIHtcbiAgICBvbnMuZW5hYmxlRGV2aWNlQmFja0J1dHRvbkhhbmRsZXIoKTtcbiAgICBvbnMuX2RlZmF1bHREZXZpY2VCYWNrQnV0dG9uSGFuZGxlciA9IG9ucy5faW50ZXJuYWwuZGJiRGlzcGF0Y2hlci5jcmVhdGVIYW5kbGVyKHdpbmRvdy5kb2N1bWVudC5ib2R5LCAoKSA9PiB7XG4gICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobmF2aWdhdG9yLCAnYXBwJykpIHtcbiAgICAgICAgbmF2aWdhdG9yLmFwcC5leGl0QXBwKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBjbG9zZSB0aGUgYXBwLiBJcyBcXCdjb3Jkb3ZhLmpzXFwnIGluY2x1ZGVkP1xcbkVycm9yOiBcXCd3aW5kb3cubmF2aWdhdG9yLmFwcFxcJyBpcyB1bmRlZmluZWQuJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYm9keS5fZ2VzdHVyZURldGVjdG9yID0gbmV3IG9ucy5HZXN0dXJlRGV0ZWN0b3IoZG9jdW1lbnQuYm9keSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gU2ltdWxhdGUgRGV2aWNlIEJhY2sgQnV0dG9uIG9uIEVTQyBwcmVzc1xuICAgIGlmICghb25zLnBsYXRmb3JtLmlzV2ViVmlldygpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMjcpIHtcbiAgICAgICAgICBvbnMuZmlyZURldmljZUJhY2tCdXR0b25FdmVudCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBzZXR1cCBsb2FkaW5nIHBsYWNlaG9sZGVyXG4gICAgb25zLl9zZXR1cExvYWRpbmdQbGFjZUhvbGRlcnMoKTtcbiAgfSk7XG5cbiAgLy8gdmlld3BvcnQuanNcbiAgVmlld3BvcnQuc2V0dXAoKTtcbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVzZS1iZWZvcmUtZGVmaW5lICovXG5cbi8qKlxuICogTWluaW1hbCBhbmltYXRpb24gbGlicmFyeSBmb3IgbWFuYWdpbmcgY3NzIHRyYW5zaXRpb24gb24gbW9iaWxlIGJyb3dzZXJzLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBUSU1FT1VUX1JBVElPID0gMS40O1xuXG52YXIgdXRpbCA9IHtcbn07XG5cbi8vIGNhcGl0YWxpemUgc3RyaW5nXG51dGlsLmNhcGl0YWxpemUgPSBmdW5jdGlvbihzdHIpIHtcbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5wcm9wZXJ0eVxuICogQHBhcmFtIHtGbG9hdH0gcGFyYW1zLmR1cmF0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnRpbWluZ1xuICovXG51dGlsLmJ1aWxkVHJhbnNpdGlvblZhbHVlID0gZnVuY3Rpb24ocGFyYW1zKSB7XG4gIHBhcmFtcy5wcm9wZXJ0eSA9IHBhcmFtcy5wcm9wZXJ0eSB8fCAnYWxsJztcbiAgcGFyYW1zLmR1cmF0aW9uID0gcGFyYW1zLmR1cmF0aW9uIHx8IDAuNDtcbiAgcGFyYW1zLnRpbWluZyA9IHBhcmFtcy50aW1pbmcgfHwgJ2xpbmVhcic7XG5cbiAgdmFyIHByb3BzID0gcGFyYW1zLnByb3BlcnR5LnNwbGl0KC8gKy8pO1xuXG4gIHJldHVybiBwcm9wcy5tYXAoZnVuY3Rpb24ocHJvcCkge1xuICAgIHJldHVybiBwcm9wICsgJyAnICsgcGFyYW1zLmR1cmF0aW9uICsgJ3MgJyArIHBhcmFtcy50aW1pbmc7XG4gIH0pLmpvaW4oJywgJyk7XG59O1xuXG4vKipcbiAqIEFkZCBhbiBldmVudCBoYW5kbGVyIG9uIFwidHJhbnNpdGlvbmVuZFwiIGV2ZW50LlxuICovXG51dGlsLm9uY2VPblRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbihlbGVtZW50LCBjYWxsYmFjaykge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7fTtcbiAgfVxuXG4gIHZhciByZW1vdmVMaXN0ZW5lcnMgPSBmdW5jdGlvbigpIHtcbiAgICB1dGlsLl90cmFuc2l0aW9uRW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmbiwgZmFsc2UpO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciBmbiA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgaWYgKGVsZW1lbnQgPT0gZXZlbnQudGFyZ2V0KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHJlbW92ZUxpc3RlbmVycygpO1xuXG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfTtcblxuICB1dGlsLl90cmFuc2l0aW9uRW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZm4sIGZhbHNlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlbW92ZUxpc3RlbmVycztcbn07XG5cbnV0aWwuX3RyYW5zaXRpb25FbmRFdmVudHMgPSAoZnVuY3Rpb24oKSB7XG5cbiAgaWYgKCdvbnRyYW5zaXRpb25lbmQnIGluIHdpbmRvdykge1xuICAgIHJldHVybiBbJ3RyYW5zaXRpb25lbmQnXTtcbiAgfVxuXG4gIGlmICgnb253ZWJraXR0cmFuc2l0aW9uZW5kJyBpbiB3aW5kb3cpIHtcbiAgICByZXR1cm4gWyd3ZWJraXRUcmFuc2l0aW9uRW5kJ107XG4gIH1cblxuICBpZiAodXRpbC52ZW5kb3JQcmVmaXggPT09ICd3ZWJraXQnIHx8IHV0aWwudmVuZG9yUHJlZml4ID09PSAnbycgfHwgdXRpbC52ZW5kb3JQcmVmaXggPT09ICdtb3onIHx8IHV0aWwudmVuZG9yUHJlZml4ID09PSAnbXMnKSB7XG4gICAgcmV0dXJuIFt1dGlsLnZlbmRvclByZWZpeCArICdUcmFuc2l0aW9uRW5kJywgJ3RyYW5zaXRpb25lbmQnXTtcbiAgfVxuXG4gIHJldHVybiBbXTtcbn0pKCk7XG5cbnV0aWwuX2Nzc1Byb3BlcnR5RGljdCA9IChmdW5jdGlvbigpIHtcbiAgdmFyIHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJycpO1xuICB2YXIgZGljdCA9IHt9O1xuICB2YXIgYSA9ICdBJy5jaGFyQ29kZUF0KDApO1xuICB2YXIgeiA9ICd6Jy5jaGFyQ29kZUF0KDApO1xuXG4gIHZhciB1cHBlciA9IGZ1bmN0aW9uKHMpIHtcbiAgICByZXR1cm4gcy5zdWJzdHIoMSkudG9VcHBlckNhc2UoKTtcbiAgfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuXG4gICAgdmFyIGtleSA9IHN0eWxlc1tpXVxuICAgIC5yZXBsYWNlKC9eWy1dKy8sICcnKVxuICAgIC5yZXBsYWNlKC9bLV1bYS16XS9nLCB1cHBlcilcbiAgICAucmVwbGFjZSgvXm1vei8sICdNb3onKTtcblxuICAgIGlmIChhIDw9IGtleS5jaGFyQ29kZUF0KDApICYmIHogPj0ga2V5LmNoYXJDb2RlQXQoMCkpIHtcbiAgICAgIGlmIChrZXkgIT09ICdjc3NUZXh0JyAmJiBrZXkgIT09ICdwYXJlbnRUZXh0Jykge1xuICAgICAgICBkaWN0W2tleV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaWN0O1xufSkoKTtcblxudXRpbC5oYXNDc3NQcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUgaW4gdXRpbC5fY3NzUHJvcGVydHlEaWN0O1xufTtcblxuLyoqXG4gKiBWZW5kb3IgcHJlZml4IGZvciBjc3MgcHJvcGVydHkuXG4gKi9cbnV0aWwudmVuZG9yUHJlZml4ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnJyksXG4gICAgcHJlID0gKEFycmF5LnByb3RvdHlwZS5zbGljZVxuICAgICAgLmNhbGwoc3R5bGVzKVxuICAgICAgLmpvaW4oJycpXG4gICAgICAubWF0Y2goLy0obW96fHdlYmtpdHxtcyktLykgfHwgKHN0eWxlcy5PTGluayA9PT0gJycgJiYgWycnLCAnbyddKVxuICAgIClbMV07XG4gICAgcmV0dXJuIHByZTtcbn0pKCk7XG5cbnV0aWwuZm9yY2VMYXlvdXRBdE9uY2UgPSBmdW5jdGlvbihlbGVtZW50cywgY2FsbGJhY2spIHtcbiAgdGhpcy5iYXRjaEltbWVkaWF0ZShmdW5jdGlvbigpIHtcbiAgICBlbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgIC8vIGZvcmNlIGxheW91dFxuICAgICAgZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgfSk7XG4gICAgY2FsbGJhY2soKTtcbiAgfSk7XG59O1xuXG51dGlsLmJhdGNoSW1tZWRpYXRlID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgY2FsbGJhY2tzID0gW107XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgaWYgKGNhbGxiYWNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHNldEltbWVkaWF0ZShmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNvbmNyZWF0ZUNhbGxiYWNrcyA9IGNhbGxiYWNrcy5zbGljZSgwKTtcbiAgICAgICAgY2FsbGJhY2tzID0gW107XG4gICAgICAgIGNvbmNyZWF0ZUNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gIH07XG59KSgpO1xuXG51dGlsLmJhdGNoQW5pbWF0aW9uRnJhbWUgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciBjYWxsYmFja3MgPSBbXTtcblxuICB2YXIgcmFmID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgd2luZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIDEwMDAgLyA2MCk7XG4gIH07XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgaWYgKGNhbGxiYWNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJhZihmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNvbmNyZWF0ZUNhbGxiYWNrcyA9IGNhbGxiYWNrcy5zbGljZSgwKTtcbiAgICAgICAgY2FsbGJhY2tzID0gW107XG4gICAgICAgIGNvbmNyZWF0ZUNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gIH07XG59KSgpO1xuXG51dGlsLnRyYW5zaXRpb25Qcm9wZXJ0eU5hbWUgPSAoZnVuY3Rpb24oKSB7XG4gIGlmICh1dGlsLmhhc0Nzc1Byb3BlcnR5KCd0cmFuc2l0aW9uRHVyYXRpb24nKSkge1xuICAgIHJldHVybiAndHJhbnNpdGlvbic7XG4gIH1cblxuICBpZiAodXRpbC5oYXNDc3NQcm9wZXJ0eSh1dGlsLnZlbmRvclByZWZpeCArICdUcmFuc2l0aW9uRHVyYXRpb24nKSkge1xuICAgIHJldHVybiB1dGlsLnZlbmRvclByZWZpeCArICdUcmFuc2l0aW9uJztcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGF0ZScpO1xufSkoKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xudmFyIEFuaW1pdCA9IGZ1bmN0aW9uKGVsZW1lbnQsIGRlZmF1bHRzKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBbmltaXQpKSB7XG4gICAgcmV0dXJuIG5ldyBBbmltaXQoZWxlbWVudCwgZGVmYXVsdHMpO1xuICB9XG5cbiAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuZWxlbWVudHMgPSBbZWxlbWVudF07XG4gIH0gZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVsZW1lbnQpID09PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgdGhpcy5lbGVtZW50cyA9IGVsZW1lbnQ7XG5cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkgb3IgYW4gaW5zdGFuY2Ugb2YgSFRNTEVsZW1lbnQuJyk7XG4gIH1cblxuICB0aGlzLmRlZmF1bHRzID0gZGVmYXVsdHM7XG4gIHRoaXMudHJhbnNpdGlvblF1ZXVlID0gW107XG4gIHRoaXMubGFzdFN0eWxlQXR0cmlidXRlRGljdCA9IFtdO1xufTtcblxuQW5pbWl0LnByb3RvdHlwZSA9IHtcblxuICAvKipcbiAgICogQHByb3BlcnR5IHtBcnJheX1cbiAgICovXG4gIHRyYW5zaXRpb25RdWV1ZTogdW5kZWZpbmVkLFxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkge0FycmF5fVxuICAgKi9cbiAgZWxlbWVudHM6IHVuZGVmaW5lZCxcblxuICAvKipcbiAgICogQHByb3BlcnR5IHtPYmplY3R9XG4gICAqL1xuICBkZWZhdWx0czogdW5kZWZpbmVkLFxuXG4gIC8qKlxuICAgKiBTdGFydCBhbmltYXRpb24gc2VxdWVuY2Ugd2l0aCBwYXNzZWQgYW5pbWF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHBsYXk6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy50cmFuc2l0aW9uUXVldWUucHVzaChmdW5jdGlvbihkb25lKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBNb3N0IG9mIHRoZSBhbmltYXRpb25zIGZvbGxvdyB0aGlzIGRlZmF1bHQgcHJvY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHtmcm9tfSBjc3Mgb3Igb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBjc3NcbiAgICogQHBhcmFtIHt0b30gY3NzIG9yIG9wdGlvbnMgb2JqZWN0IGNvbnRhaW5pbmcgY3NzXG4gICAqIEBwYXJhbSB7ZGVsYXl9IGRlbGF5IHRvIHdhaXRcbiAgICovXG4gIGRlZmF1bHQ6IGZ1bmN0aW9uKGZyb20sIHRvLCBkZWxheSkge1xuICAgIGZ1bmN0aW9uIHN0ZXAocGFyYW1zLCBkdXJhdGlvbiwgdGltaW5nKSB7XG4gICAgICBpZiAocGFyYW1zLmR1cmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZHVyYXRpb24gPSBwYXJhbXMuZHVyYXRpb247XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnRpbWluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRpbWluZyA9IHBhcmFtcy50aW1pbmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNzczogcGFyYW1zLmNzcyB8fCBwYXJhbXMsXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgdGltaW5nOiB0aW1pbmdcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2F2ZVN0eWxlKClcbiAgICAgIC5xdWV1ZShzdGVwKGZyb20sIDAsIHRoaXMuZGVmYXVsdHMudGltaW5nKSlcbiAgICAgIC53YWl0KGRlbGF5ID09PSB1bmRlZmluZWQgPyB0aGlzLmRlZmF1bHRzLmRlbGF5IDogZGVsYXkpXG4gICAgICAucXVldWUoc3RlcCh0bywgdGhpcy5kZWZhdWx0cy5kdXJhdGlvbiwgdGhpcy5kZWZhdWx0cy50aW1pbmcpKVxuICAgICAgLnJlc3RvcmVTdHlsZSgpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBRdWV1ZSB0cmFuc2l0aW9uIGFuaW1hdGlvbnMgb3Igb3RoZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIGUuZy4gYW5pbWl0KGVsdCkucXVldWUoe2NvbG9yOiAncmVkJ30pXG4gICAqIGUuZy4gYW5pbWl0KGVsdCkucXVldWUoe2NvbG9yOiAncmVkJ30sIHtkdXJhdGlvbjogMC40fSlcbiAgICogZS5nLiBhbmltaXQoZWx0KS5xdWV1ZSh7Y3NzOiB7Y29sb3I6ICdyZWQnfSwgZHVyYXRpb246IDAuMn0pXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fEFuaW1pdC5UcmFuc2l0aW9ufEZ1bmN0aW9ufSB0cmFuc2l0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICovXG4gIHF1ZXVlOiBmdW5jdGlvbih0cmFuc2l0aW9uLCBvcHRpb25zKSB7XG4gICAgdmFyIHF1ZXVlID0gdGhpcy50cmFuc2l0aW9uUXVldWU7XG5cbiAgICBpZiAodHJhbnNpdGlvbiAmJiBvcHRpb25zKSB7XG4gICAgICBvcHRpb25zLmNzcyA9IHRyYW5zaXRpb247XG4gICAgICB0cmFuc2l0aW9uID0gbmV3IEFuaW1pdC5UcmFuc2l0aW9uKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmICghKHRyYW5zaXRpb24gaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCB0cmFuc2l0aW9uIGluc3RhbmNlb2YgQW5pbWl0LlRyYW5zaXRpb24pKSB7XG4gICAgICBpZiAodHJhbnNpdGlvbi5jc3MpIHtcbiAgICAgICAgdHJhbnNpdGlvbiA9IG5ldyBBbmltaXQuVHJhbnNpdGlvbih0cmFuc2l0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zaXRpb24gPSBuZXcgQW5pbWl0LlRyYW5zaXRpb24oe1xuICAgICAgICAgIGNzczogdHJhbnNpdGlvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHJhbnNpdGlvbiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICBxdWV1ZS5wdXNoKHRyYW5zaXRpb24pO1xuICAgIH0gZWxzZSBpZiAodHJhbnNpdGlvbiBpbnN0YW5jZW9mIEFuaW1pdC5UcmFuc2l0aW9uKSB7XG4gICAgICBxdWV1ZS5wdXNoKHRyYW5zaXRpb24uYnVpbGQoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKipcbiAgICogUXVldWUgdHJhbnNpdGlvbiBhbmltYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0Zsb2F0fSBzZWNvbmRzXG4gICAqL1xuICB3YWl0OiBmdW5jdGlvbihzZWNvbmRzKSB7XG4gICAgaWYgKHNlY29uZHMgPiAwKSB7XG4gICAgICB0aGlzLnRyYW5zaXRpb25RdWV1ZS5wdXNoKGZ1bmN0aW9uKGRvbmUpIHtcbiAgICAgICAgc2V0VGltZW91dChkb25lLCAxMDAwICogc2Vjb25kcyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICBzYXZlU3R5bGU6IGZ1bmN0aW9uKCkge1xuXG4gICAgdGhpcy50cmFuc2l0aW9uUXVldWUucHVzaChmdW5jdGlvbihkb25lKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpIHtcbiAgICAgICAgdmFyIGNzcyA9IHRoaXMubGFzdFN0eWxlQXR0cmlidXRlRGljdFtpbmRleF0gPSB7fTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnQuc3R5bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjc3NbZWxlbWVudC5zdHlsZVtpXV0gPSBlbGVtZW50LnN0eWxlW2VsZW1lbnQuc3R5bGVbaV1dO1xuICAgICAgICB9XG4gICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgZG9uZSgpO1xuICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKipcbiAgICogUmVzdG9yZSBlbGVtZW50J3Mgc3R5bGUuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtGbG9hdH0gW29wdGlvbnMuZHVyYXRpb25dXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aW1pbmddXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50cmFuc2l0aW9uXVxuICAgKi9cbiAgcmVzdG9yZVN0eWxlOiBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgaWYgKG9wdGlvbnMudHJhbnNpdGlvbiAmJiAhb3B0aW9ucy5kdXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIm9wdGlvbnMuZHVyYXRpb25cIiBpcyByZXF1aXJlZCB3aGVuIFwib3B0aW9ucy50cmFuc2l0aW9uXCIgaXMgZW5hYmxlZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgdHJhbnNpdGlvbk5hbWUgPSB1dGlsLnRyYW5zaXRpb25Qcm9wZXJ0eU5hbWU7XG5cbiAgICBpZiAob3B0aW9ucy50cmFuc2l0aW9uIHx8IChvcHRpb25zLmR1cmF0aW9uICYmIG9wdGlvbnMuZHVyYXRpb24gPiAwKSkge1xuICAgICAgdmFyIHRyYW5zaXRpb25WYWx1ZSA9IG9wdGlvbnMudHJhbnNpdGlvbiB8fCAoJ2FsbCAnICsgb3B0aW9ucy5kdXJhdGlvbiArICdzICcgKyAob3B0aW9ucy50aW1pbmcgfHwgJ2xpbmVhcicpKTtcblxuICAgICAgdGhpcy50cmFuc2l0aW9uUXVldWUucHVzaChmdW5jdGlvbihkb25lKSB7XG4gICAgICAgIHZhciBlbGVtZW50cyA9IHRoaXMuZWxlbWVudHM7XG4gICAgICAgIHZhciB0aW1lb3V0SWQ7XG5cbiAgICAgICAgdmFyIGNsZWFyVHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2l0aW9uTmFtZV0gPSAnJztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBhZGQgXCJ0cmFuc2l0aW9uZW5kXCIgZXZlbnQgaGFuZGxlclxuICAgICAgICB2YXIgcmVtb3ZlTGlzdGVuZXJzID0gdXRpbC5vbmNlT25UcmFuc2l0aW9uRW5kKGVsZW1lbnRzWzBdLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICBjbGVhclRyYW5zaXRpb24oKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGZvciBmYWlsIHNhZmUuXG4gICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgICAgICAgY2xlYXJUcmFuc2l0aW9uKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9LCBvcHRpb25zLmR1cmF0aW9uICogMTAwMCAqIFRJTUVPVVRfUkFUSU8pO1xuXG4gICAgICAgIC8vIHRyYW5zaXRpb24gYW5kIHN0eWxlIHNldHRpbmdzXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpIHtcblxuICAgICAgICAgIHZhciBjc3MgPSBzZWxmLmxhc3RTdHlsZUF0dHJpYnV0ZURpY3RbaW5kZXhdO1xuXG4gICAgICAgICAgaWYgKCFjc3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVzdG9yZVN0eWxlKCk6IFRoZSBzdHlsZSBpcyBub3Qgc2F2ZWQuIEludm9rZSBzYXZlU3R5bGUoKSBiZWZvcmUuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5sYXN0U3R5bGVBdHRyaWJ1dGVEaWN0W2luZGV4XSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgIHZhciBuYW1lO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBlbGVtZW50LnN0eWxlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBuYW1lID0gZWxlbWVudC5zdHlsZVtpXTtcbiAgICAgICAgICAgIGlmIChjc3NbbmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBjc3NbbmFtZV0gPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlbGVtZW50LnN0eWxlW3RyYW5zaXRpb25OYW1lXSA9IHRyYW5zaXRpb25WYWx1ZTtcblxuICAgICAgICAgIE9iamVjdC5rZXlzKGNzcykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09IHRyYW5zaXRpb25OYW1lKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IGNzc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2l0aW9uTmFtZV0gPSB0cmFuc2l0aW9uVmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhbnNpdGlvblF1ZXVlLnB1c2goZnVuY3Rpb24oZG9uZSkge1xuICAgICAgICByZXNldCgpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcblxuICAgIGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgLy8gQ2xlYXIgdHJhbnNpdGlvbiBhbmltYXRpb24gc2V0dGluZ3MuXG4gICAgICBzZWxmLmVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZVt0cmFuc2l0aW9uTmFtZV0gPSAnbm9uZSc7XG5cbiAgICAgICAgdmFyIGNzcyA9IHNlbGYubGFzdFN0eWxlQXR0cmlidXRlRGljdFtpbmRleF07XG5cbiAgICAgICAgaWYgKCFjc3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jlc3RvcmVTdHlsZSgpOiBUaGUgc3R5bGUgaXMgbm90IHNhdmVkLiBJbnZva2Ugc2F2ZVN0eWxlKCkgYmVmb3JlLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5sYXN0U3R5bGVBdHRyaWJ1dGVEaWN0W2luZGV4XSA9IHVuZGVmaW5lZDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbmFtZSA9ICcnOyBpIDwgZWxlbWVudC5zdHlsZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIG5hbWUgPSBlbGVtZW50LnN0eWxlW2ldO1xuICAgICAgICAgIGlmICh0eXBlb2YgY3NzW2VsZW1lbnQuc3R5bGVbaV1dID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY3NzW2VsZW1lbnQuc3R5bGVbaV1dID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmtleXMoY3NzKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IGNzc1trZXldO1xuICAgICAgICB9KTtcblxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBTdGFydCBhbmltYXRpb24gc2VxdWVuY2UuXG4gICAqL1xuICBzdGFydEFuaW1hdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fZGVxdWV1ZVRyYW5zaXRpb24oKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIF9kZXF1ZXVlVHJhbnNpdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgdmFyIHRyYW5zaXRpb24gPSB0aGlzLnRyYW5zaXRpb25RdWV1ZS5zaGlmdCgpO1xuICAgIGlmICh0aGlzLl9jdXJyZW50VHJhbnNpdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDdXJyZW50IHRyYW5zaXRpb24gZXhpc3RzLicpO1xuICAgIH1cbiAgICB0aGlzLl9jdXJyZW50VHJhbnNpdGlvbiA9IHRyYW5zaXRpb247XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBjYWxsZWQgPSBmYWxzZTtcblxuICAgIHZhciBkb25lID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICBzZWxmLl9jdXJyZW50VHJhbnNpdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgc2VsZi5fZGVxdWV1ZVRyYW5zaXRpb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdGF0ZTogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgdHdpY2UuJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICB0cmFuc2l0aW9uLmNhbGwodGhpcywgZG9uZSk7XG4gICAgfVxuICB9XG5cbn07XG5cbi8qKlxuICogQHBhcmFtIHtBbmltaXR9IGFyZ3VtZW50c1xuICovXG5BbmltaXQucnVuQWxsID0gZnVuY3Rpb24oLyogYXJndW1lbnRzLi4uICovKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgYXJndW1lbnRzW2ldLnBsYXkoKTtcbiAgfVxufTtcblxuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge0Zsb2F0fSBbb3B0aW9ucy5kdXJhdGlvbl1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5wcm9wZXJ0eV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aW1pbmddXG4gKi9cbkFuaW1pdC5UcmFuc2l0aW9uID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB0aGlzLm9wdGlvbnMuZHVyYXRpb24gPSB0aGlzLm9wdGlvbnMuZHVyYXRpb24gfHwgMDtcbiAgdGhpcy5vcHRpb25zLnRpbWluZyA9IHRoaXMub3B0aW9ucy50aW1pbmcgfHwgJ2xpbmVhcic7XG4gIHRoaXMub3B0aW9ucy5jc3MgPSB0aGlzLm9wdGlvbnMuY3NzIHx8IHt9O1xuICB0aGlzLm9wdGlvbnMucHJvcGVydHkgPSB0aGlzLm9wdGlvbnMucHJvcGVydHkgfHwgJ2FsbCc7XG59O1xuXG5BbmltaXQuVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7RnVuY3Rpb259XG4gICAqL1xuICBidWlsZDogZnVuY3Rpb24oKSB7XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5vcHRpb25zLmNzcykubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMuY3NzIGlzIHJlcXVpcmVkLicpO1xuICAgIH1cblxuICAgIHZhciBjc3MgPSBjcmVhdGVBY3R1YWxDc3NQcm9wcyh0aGlzLm9wdGlvbnMuY3NzKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZHVyYXRpb24gPiAwKSB7XG4gICAgICB2YXIgdHJhbnNpdGlvblZhbHVlID0gdXRpbC5idWlsZFRyYW5zaXRpb25WYWx1ZSh0aGlzLm9wdGlvbnMpO1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGVsZW1lbnRzID0gdGhpcy5lbGVtZW50cztcbiAgICAgICAgdmFyIHRpbWVvdXQgPSBzZWxmLm9wdGlvbnMuZHVyYXRpb24gKiAxMDAwICogVElNRU9VVF9SQVRJTztcbiAgICAgICAgdmFyIHRpbWVvdXRJZDtcblxuICAgICAgICB2YXIgcmVtb3ZlTGlzdGVuZXJzID0gdXRpbC5vbmNlT25UcmFuc2l0aW9uRW5kKGVsZW1lbnRzWzBdLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJlbW92ZUxpc3RlbmVycygpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgIGVsZW1lbnQuc3R5bGVbdXRpbC50cmFuc2l0aW9uUHJvcGVydHlOYW1lXSA9IHRyYW5zaXRpb25WYWx1ZTtcblxuICAgICAgICAgIE9iamVjdC5rZXlzKGNzcykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlW25hbWVdID0gY3NzW25hbWVdO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmR1cmF0aW9uIDw9IDApIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICB2YXIgZWxlbWVudHMgPSB0aGlzLmVsZW1lbnRzO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlbWVudCkge1xuICAgICAgICAgIGVsZW1lbnQuc3R5bGVbdXRpbC50cmFuc2l0aW9uUHJvcGVydHlOYW1lXSA9ICcnO1xuXG4gICAgICAgICAgT2JqZWN0LmtleXMoY3NzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGVbbmFtZV0gPSBjc3NbbmFtZV07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdXRpbC5mb3JjZUxheW91dEF0T25jZShlbGVtZW50cywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB1dGlsLmJhdGNoQW5pbWF0aW9uRnJhbWUoY2FsbGJhY2spO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHV0aWwuYmF0Y2hBbmltYXRpb25GcmFtZShjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlQWN0dWFsQ3NzUHJvcHMoY3NzKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ge307XG5cbiAgICAgIE9iamVjdC5rZXlzKGNzcykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGNzc1tuYW1lXTtcblxuICAgICAgICBpZiAodXRpbC5oYXNDc3NQcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwcmVmaXhlZCA9IHV0aWwudmVuZG9yUHJlZml4ICsgdXRpbC5jYXBpdGFsaXplKG5hbWUpO1xuICAgICAgICBpZiAodXRpbC5oYXNDc3NQcm9wZXJ0eShwcmVmaXhlZCkpIHtcbiAgICAgICAgICByZXN1bHRbcHJlZml4ZWRdID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W3ByZWZpeGVkXSA9IHZhbHVlO1xuICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQW5pbWl0O1xuXG4iLCIvKlxuICogR2VzdHVyZSBkZXRlY3RvciBsaWJyYXJ5IHRoYXQgZm9ya2VkIGZyb20gZ2l0aHViLmNvbS9FaWdodE1lZGlhL2hhbW1lci5qcy5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlsIGZyb20gJy4vdXRpbC5qcyc7XG5cbnZhciBFdmVudCwgVXRpbHMsIERldGVjdGlvbiwgUG9pbnRlckV2ZW50O1xuXG4vKipcbiAqIEBvYmplY3Qgb25zLkdlc3R1cmVEZXRlY3RvclxuICogQGNhdGVnb3J5IGdlc3R1cmVcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dVXRpbGl0eSBjbGFzcyBmb3IgZ2VzdHVyZSBkZXRlY3Rpb24uWy9lbl1cbiAqICAgW2phXeOCuOOCp+OCueODgeODo+OCkuaknOefpeOBmeOCi+OBn+OCgeOBruODpuODvOODhuOCo+ODquODhuOCo+OCr+ODqeOCueOBp+OBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAbWV0aG9kIGNvbnN0cnVjdG9yXG4gKiBAc2lnbmF0dXJlIGNvbnN0cnVjdG9yKGVsZW1lbnRbLCBvcHRpb25zXSlcbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1DcmVhdGUgYSBuZXcgR2VzdHVyZURldGVjdG9yIGluc3RhbmNlLlsvZW5dXG4gKiAgW2phXUdlc3R1cmVEZXRlY3RvcuOBruOCpOODs+OCueOCv+ODs+OCueOCkueUn+aIkOOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gKiAgIFtqYV3jgrjjgqfjgrnjg4Hjg6PjgpLmpJznn6XjgZnjgotET03opoHntKDjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogICBbZW5dT3B0aW9ucyBvYmplY3QuWy9lbl1cbiAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcmV0dXJuIHtvbnMuR2VzdHVyZURldGVjdG9yLkluc3RhbmNlfVxuICovXG52YXIgR2VzdHVyZURldGVjdG9yID0gZnVuY3Rpb24gR2VzdHVyZURldGVjdG9yKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBHZXN0dXJlRGV0ZWN0b3IuSW5zdGFuY2UoZWxlbWVudCwgb3B0aW9ucyB8fCB7fSk7XG59O1xuXG5cbi8qKlxuICogZGVmYXVsdCBzZXR0aW5ncy5cbiAqIG1vcmUgc2V0dGluZ3MgYXJlIGRlZmluZWQgcGVyIGdlc3R1cmUgYXQgYC9nZXN0dXJlc2AuIEVhY2ggZ2VzdHVyZSBjYW4gYmUgZGlzYWJsZWQvZW5hYmxlZFxuICogYnkgc2V0dGluZyBpdCdzIG5hbWUgKGxpa2UgYHN3aXBlYCkgdG8gZmFsc2UuXG4gKiBZb3UgY2FuIHNldCB0aGUgZGVmYXVsdHMgZm9yIGFsbCBpbnN0YW5jZXMgYnkgY2hhbmdpbmcgdGhpcyBvYmplY3QgYmVmb3JlIGNyZWF0aW5nIGFuIGluc3RhbmNlLlxuICogQGV4YW1wbGVcbiAqIGBgYGBcbiAqICBHZXN0dXJlRGV0ZWN0b3IuZGVmYXVsdHMuZHJhZyA9IGZhbHNlO1xuICogIEdlc3R1cmVEZXRlY3Rvci5kZWZhdWx0cy5iZWhhdmlvci50b3VjaEFjdGlvbiA9ICdwYW4teSc7XG4gKiAgZGVsZXRlIEdlc3R1cmVEZXRlY3Rvci5kZWZhdWx0cy5iZWhhdmlvci51c2VyU2VsZWN0O1xuICogYGBgYFxuICogQHByb3BlcnR5IGRlZmF1bHRzXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5HZXN0dXJlRGV0ZWN0b3IuZGVmYXVsdHMgPSB7XG4gIGJlaGF2aW9yOiB7XG4gICAgLy8gdXNlclNlbGVjdDogJ25vbmUnLCAvLyBBbHNvIGRpc2FibGVzIHNlbGVjdGlvbiBpbiBgaW5wdXRgIGNoaWxkcmVuXG4gICAgdG91Y2hBY3Rpb246ICdwYW4teScsXG4gICAgdG91Y2hDYWxsb3V0OiAnbm9uZScsXG4gICAgY29udGVudFpvb21pbmc6ICdub25lJyxcbiAgICB1c2VyRHJhZzogJ25vbmUnLFxuICAgIHRhcEhpZ2hsaWdodENvbG9yOiAncmdiYSgwLDAsMCwwKSdcbiAgfVxufTtcblxuLyoqXG4gKiBHZXN0dXJlRGV0ZWN0b3IgZG9jdW1lbnQgd2hlcmUgdGhlIGJhc2UgZXZlbnRzIGFyZSBhZGRlZCBhdFxuICogQHByb3BlcnR5IERPQ1VNRU5UXG4gKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gKiBAZGVmYXVsdCB3aW5kb3cuZG9jdW1lbnRcbiAqL1xuR2VzdHVyZURldGVjdG9yLkRPQ1VNRU5UID0gZG9jdW1lbnQ7XG5cbi8qKlxuICogZGV0ZWN0IHN1cHBvcnQgZm9yIHBvaW50ZXIgZXZlbnRzXG4gKiBAcHJvcGVydHkgSEFTX1BPSU5URVJFVkVOVFNcbiAqIEB0eXBlIHtCb29sZWFufVxuICovXG5HZXN0dXJlRGV0ZWN0b3IuSEFTX1BPSU5URVJFVkVOVFMgPSBuYXZpZ2F0b3IucG9pbnRlckVuYWJsZWQgfHwgbmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQ7XG5cbi8qKlxuICogZGV0ZWN0IHN1cHBvcnQgZm9yIHRvdWNoIGV2ZW50c1xuICogQHByb3BlcnR5IEhBU19UT1VDSEVWRU5UU1xuICogQHR5cGUge0Jvb2xlYW59XG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5IQVNfVE9VQ0hFVkVOVFMgPSAoJ29udG91Y2hzdGFydCcgaW4gd2luZG93KTtcblxuLyoqXG4gKiBkZXRlY3QgbW9iaWxlIGJyb3dzZXJzXG4gKiBAcHJvcGVydHkgSVNfTU9CSUxFXG4gKiBAdHlwZSB7Qm9vbGVhbn1cbiAqL1xuR2VzdHVyZURldGVjdG9yLklTX01PQklMRSA9IC9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWR8c2lsay9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbi8qKlxuICogZGV0ZWN0IGlmIHdlIHdhbnQgdG8gc3VwcG9ydCBtb3VzZWV2ZW50cyBhdCBhbGxcbiAqIEBwcm9wZXJ0eSBOT19NT1VTRUVWRU5UU1xuICogQHR5cGUge0Jvb2xlYW59XG4gKi9cbkdlc3R1cmVEZXRlY3Rvci5OT19NT1VTRUVWRU5UUyA9IChHZXN0dXJlRGV0ZWN0b3IuSEFTX1RPVUNIRVZFTlRTICYmIEdlc3R1cmVEZXRlY3Rvci5JU19NT0JJTEUpIHx8IEdlc3R1cmVEZXRlY3Rvci5IQVNfUE9JTlRFUkVWRU5UUztcblxuLyoqXG4gKiBpbnRlcnZhbCBpbiB3aGljaCBHZXN0dXJlRGV0ZWN0b3IgcmVjYWxjdWxhdGVzIGN1cnJlbnQgdmVsb2NpdHkvZGlyZWN0aW9uL2FuZ2xlIGluIG1zXG4gKiBAcHJvcGVydHkgQ0FMQ1VMQVRFX0lOVEVSVkFMXG4gKiBAdHlwZSB7TnVtYmVyfVxuICogQGRlZmF1bHQgMjVcbiAqL1xuR2VzdHVyZURldGVjdG9yLkNBTENVTEFURV9JTlRFUlZBTCA9IDI1O1xuXG4vKipcbiAqIGV2ZW50dHlwZXMgcGVyIHRvdWNoZXZlbnQgKHN0YXJ0LCBtb3ZlLCBlbmQpIGFyZSBmaWxsZWQgYnkgYEV2ZW50LmRldGVybWluZUV2ZW50VHlwZXNgIG9uIGBzZXR1cGBcbiAqIHRoZSBvYmplY3QgY29udGFpbnMgdGhlIERPTSBldmVudCBuYW1lcyBwZXIgdHlwZSAoYEVWRU5UX1NUQVJUYCwgYEVWRU5UX01PVkVgLCBgRVZFTlRfRU5EYClcbiAqIEBwcm9wZXJ0eSBFVkVOVF9UWVBFU1xuICogQHByaXZhdGVcbiAqIEB3cml0ZU9uY2VcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbnZhciBFVkVOVF9UWVBFUyA9IHt9O1xuXG4vKipcbiAqIGRpcmVjdGlvbiBzdHJpbmdzLCBmb3Igc2FmZSBjb21wYXJpc29uc1xuICogQHByb3BlcnR5IERJUkVDVElPTl9ET1dOfExFRlR8VVB8UklHSFRcbiAqIEBmaW5hbFxuICogQHR5cGUge1N0cmluZ31cbiAqIEBkZWZhdWx0ICdkb3duJyAnbGVmdCcgJ3VwJyAncmlnaHQnXG4gKi9cbnZhciBESVJFQ1RJT05fRE9XTiA9IEdlc3R1cmVEZXRlY3Rvci5ESVJFQ1RJT05fRE9XTiA9ICdkb3duJztcbnZhciBESVJFQ1RJT05fTEVGVCA9IEdlc3R1cmVEZXRlY3Rvci5ESVJFQ1RJT05fTEVGVCA9ICdsZWZ0JztcbnZhciBESVJFQ1RJT05fVVAgPSBHZXN0dXJlRGV0ZWN0b3IuRElSRUNUSU9OX1VQID0gJ3VwJztcbnZhciBESVJFQ1RJT05fUklHSFQgPSBHZXN0dXJlRGV0ZWN0b3IuRElSRUNUSU9OX1JJR0hUID0gJ3JpZ2h0JztcblxuLyoqXG4gKiBwb2ludGVydHlwZSBzdHJpbmdzLCBmb3Igc2FmZSBjb21wYXJpc29uc1xuICogQHByb3BlcnR5IFBPSU5URVJfTU9VU0V8VE9VQ0h8UEVOXG4gKiBAZmluYWxcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVmYXVsdCAnbW91c2UnICd0b3VjaCcgJ3BlbidcbiAqL1xudmFyIFBPSU5URVJfTU9VU0UgPSBHZXN0dXJlRGV0ZWN0b3IuUE9JTlRFUl9NT1VTRSA9ICdtb3VzZSc7XG52YXIgUE9JTlRFUl9UT1VDSCA9IEdlc3R1cmVEZXRlY3Rvci5QT0lOVEVSX1RPVUNIID0gJ3RvdWNoJztcbnZhciBQT0lOVEVSX1BFTiA9IEdlc3R1cmVEZXRlY3Rvci5QT0lOVEVSX1BFTiA9ICdwZW4nO1xuXG4vKipcbiAqIGV2ZW50dHlwZXNcbiAqIEBwcm9wZXJ0eSBFVkVOVF9TVEFSVHxNT1ZFfEVORHxSRUxFQVNFfFRPVUNIXG4gKiBAZmluYWxcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKiBAZGVmYXVsdCAnc3RhcnQnICdjaGFuZ2UnICdtb3ZlJyAnZW5kJyAncmVsZWFzZScgJ3RvdWNoJ1xuICovXG52YXIgRVZFTlRfU1RBUlQgPSBHZXN0dXJlRGV0ZWN0b3IuRVZFTlRfU1RBUlQgPSAnc3RhcnQnO1xudmFyIEVWRU5UX01PVkUgPSBHZXN0dXJlRGV0ZWN0b3IuRVZFTlRfTU9WRSA9ICdtb3ZlJztcbnZhciBFVkVOVF9FTkQgPSBHZXN0dXJlRGV0ZWN0b3IuRVZFTlRfRU5EID0gJ2VuZCc7XG52YXIgRVZFTlRfUkVMRUFTRSA9IEdlc3R1cmVEZXRlY3Rvci5FVkVOVF9SRUxFQVNFID0gJ3JlbGVhc2UnO1xudmFyIEVWRU5UX1RPVUNIID0gR2VzdHVyZURldGVjdG9yLkVWRU5UX1RPVUNIID0gJ3RvdWNoJztcblxuLyoqXG4gKiBpZiB0aGUgd2luZG93IGV2ZW50cyBhcmUgc2V0Li4uXG4gKiBAcHJvcGVydHkgUkVBRFlcbiAqIEB3cml0ZU9uY2VcbiAqIEB0eXBlIHtCb29sZWFufVxuICogQGRlZmF1bHQgZmFsc2VcbiAqL1xuR2VzdHVyZURldGVjdG9yLlJFQURZID0gZmFsc2U7XG5cbi8qKlxuICogcGx1Z2lucyBuYW1lc3BhY2VcbiAqIEBwcm9wZXJ0eSBwbHVnaW5zXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5HZXN0dXJlRGV0ZWN0b3IucGx1Z2lucyA9IEdlc3R1cmVEZXRlY3Rvci5wbHVnaW5zIHx8IHt9O1xuXG4vKipcbiAqIGdlc3R1cmVzIG5hbWVzcGFjZVxuICogc2VlIGAvZ2VzdHVyZXNgIGZvciB0aGUgZGVmaW5pdGlvbnNcbiAqIEBwcm9wZXJ0eSBnZXN0dXJlc1xuICogQHR5cGUge09iamVjdH1cbiAqL1xuR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzID0gR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzIHx8IHt9O1xuXG4vKipcbiAqIHNldHVwIGV2ZW50cyB0byBkZXRlY3QgZ2VzdHVyZXMgb24gdGhlIGRvY3VtZW50XG4gKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGNyZWF0aW5nIGFuIG5ldyBpbnN0YW5jZVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gc2V0dXAob3B0cykge1xuICBpZiAoR2VzdHVyZURldGVjdG9yLlJFQURZKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gZmluZCB3aGF0IGV2ZW50dHlwZXMgd2UgYWRkIGxpc3RlbmVycyB0b1xuICBFdmVudC5kZXRlcm1pbmVFdmVudFR5cGVzKCk7XG5cbiAgLy8gUmVnaXN0ZXIgYWxsIGdlc3R1cmVzIGluc2lkZSBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXNcbiAgVXRpbHMuZWFjaChHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMsIGZ1bmN0aW9uKGdlc3R1cmUpIHtcbiAgICBEZXRlY3Rpb24ucmVnaXN0ZXIoZ2VzdHVyZSk7XG4gIH0pO1xuXG4gIC8vIEFkZCB0b3VjaCBldmVudHMgb24gdGhlIGRvY3VtZW50XG4gIEV2ZW50Lm9uVG91Y2goR2VzdHVyZURldGVjdG9yLkRPQ1VNRU5ULCBFVkVOVF9NT1ZFLCBEZXRlY3Rpb24uZGV0ZWN0LCBvcHRzKTtcbiAgRXZlbnQub25Ub3VjaChHZXN0dXJlRGV0ZWN0b3IuRE9DVU1FTlQsIEVWRU5UX0VORCwgRGV0ZWN0aW9uLmRldGVjdCwgb3B0cyk7XG5cbiAgLy8gR2VzdHVyZURldGVjdG9yIGlzIHJlYWR5Li4uIVxuICBHZXN0dXJlRGV0ZWN0b3IuUkVBRFkgPSB0cnVlO1xufVxuXG4vKipcbiAqIEBtb2R1bGUgR2VzdHVyZURldGVjdG9yXG4gKlxuICogQGNsYXNzIFV0aWxzXG4gKiBAc3RhdGljXG4gKi9cblV0aWxzID0gR2VzdHVyZURldGVjdG9yLnV0aWxzID0ge1xuICAvKipcbiAgICogZXh0ZW5kIG1ldGhvZCwgY291bGQgYWxzbyBiZSB1c2VkIGZvciBjbG9uaW5nIHdoZW4gYGRlc3RgIGlzIGFuIGVtcHR5IG9iamVjdC5cbiAgICogY2hhbmdlcyB0aGUgZGVzdCBvYmplY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IGRlc3RcbiAgICogQHBhcmFtIHtPYmplY3R9IHNyY1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFttZXJnZT1mYWxzZV0gIGRvIGEgbWVyZ2VcbiAgICogQHJldHVybiB7T2JqZWN0fSBkZXN0XG4gICAqL1xuICBleHRlbmQ6IGZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMsIG1lcmdlKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzcmMsIGtleSkgJiYgKGRlc3Rba2V5XSA9PT0gdW5kZWZpbmVkIHx8ICFtZXJnZSkpIHtcbiAgICAgICAgZGVzdFtrZXldID0gc3JjW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xuICB9LFxuXG4gIC8qKlxuICAgKiBzaW1wbGUgYWRkRXZlbnRMaXN0ZW5lciB3cmFwcGVyXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKi9cbiAgb246IGZ1bmN0aW9uIG9uKGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIsIG9wdCkge1xuICAgIHV0aWwuYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBvcHQsIHRydWUpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBzaW1wbGUgcmVtb3ZlRXZlbnRMaXN0ZW5lciB3cmFwcGVyXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKi9cbiAgb2ZmOiBmdW5jdGlvbiBvZmYoZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgb3B0KSB7XG4gICAgdXRpbC5yZW1vdmVFdmVudExpc3RlbmVyKGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIsIG9wdCwgdHJ1ZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGZvckVhY2ggb3ZlciBhcnJheXMgYW5kIG9iamVjdHNcbiAgICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9ialxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRvclxuICAgKiBAcGFyYW0ge2FueX0gaXRlcmF0b3IuaXRlbVxuICAgKiBAcGFyYW0ge051bWJlcn0gaXRlcmF0b3IuaW5kZXhcbiAgICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IGl0ZXJhdG9yLm9iaiB0aGUgc291cmNlIG9iamVjdFxuICAgKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCB2YWx1ZSB0byB1c2UgYXMgYHRoaXNgIGluIHRoZSBpdGVyYXRvclxuICAgKi9cbiAgZWFjaDogZnVuY3Rpb24gZWFjaChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gICAgdmFyIGksIGxlbjtcblxuICAgIC8vIG5hdGl2ZSBmb3JFYWNoIG9uIGFycmF5c1xuICAgIGlmICgnZm9yRWFjaCcgaW4gb2JqKSB7XG4gICAgICBvYmouZm9yRWFjaChpdGVyYXRvciwgY29udGV4dCk7XG4gICAgICAvLyBhcnJheXNcbiAgICB9IGVsc2UgaWYgKG9iai5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChpID0gMCwgbGVuID0gb2JqLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtpXSwgaSwgb2JqKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG9iamVjdHNcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChpIGluIG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkgJiZcbiAgICAgICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtpXSwgaSwgb2JqKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIGZpbmQgaWYgYSBzdHJpbmcgY29udGFpbnMgdGhlIHN0cmluZyB1c2luZyBpbmRleE9mXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzcmNcbiAgICogQHBhcmFtIHtTdHJpbmd9IGZpbmRcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gZm91bmRcbiAgICovXG4gIGluU3RyOiBmdW5jdGlvbiBpblN0cihzcmMsIGZpbmQpIHtcbiAgICByZXR1cm4gc3JjLmluZGV4T2YoZmluZCkgPiAtMTtcbiAgfSxcblxuICAvKipcbiAgICogZmluZCBpZiBhIGFycmF5IGNvbnRhaW5zIHRoZSBvYmplY3QgdXNpbmcgaW5kZXhPZiBvciBhIHNpbXBsZSBwb2x5ZmlsbFxuICAgKiBAcGFyYW0ge1N0cmluZ30gc3JjXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBmaW5kXG4gICAqIEByZXR1cm4ge0Jvb2xlYW58TnVtYmVyfSBmYWxzZSB3aGVuIG5vdCBmb3VuZCwgb3IgdGhlIGluZGV4XG4gICAqL1xuICBpbkFycmF5OiBmdW5jdGlvbiBpbkFycmF5KHNyYywgZmluZCwgZGVlcCkge1xuICAgIGlmIChkZWVwKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3JjLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7IC8vIEFycmF5LmZpbmRJbmRleFxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZmluZCkuZXZlcnkoZnVuY3Rpb24oa2V5KSB7IHJldHVybiBzcmNbaV1ba2V5XSA9PT0gZmluZFtrZXldOyB9KSkge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgaWYgKHNyYy5pbmRleE9mKSB7XG4gICAgICByZXR1cm4gc3JjLmluZGV4T2YoZmluZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzcmMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKHNyY1tpXSA9PT0gZmluZCkge1xuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBjb252ZXJ0IGFuIGFycmF5LWxpa2Ugb2JqZWN0IChgYXJndW1lbnRzYCwgYHRvdWNobGlzdGApIHRvIGFuIGFycmF5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqL1xuICB0b0FycmF5OiBmdW5jdGlvbiB0b0FycmF5KG9iaikge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvYmosIDApO1xuICB9LFxuXG4gIC8qKlxuICAgKiBmaW5kIGlmIGEgbm9kZSBpcyBpbiB0aGUgZ2l2ZW4gcGFyZW50XG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGVcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcGFyZW50XG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IGZvdW5kXG4gICAqL1xuICBoYXNQYXJlbnQ6IGZ1bmN0aW9uIGhhc1BhcmVudChub2RlLCBwYXJlbnQpIHtcbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgaWYgKG5vZGUgPT0gcGFyZW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIGNlbnRlciBvZiBhbGwgdGhlIHRvdWNoZXNcbiAgICogQHBhcmFtIHtBcnJheX0gdG91Y2hlc1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IGNlbnRlciBjb250YWlucyBgcGFnZVhgLCBgcGFnZVlgLCBgY2xpZW50WGAgYW5kIGBjbGllbnRZYCBwcm9wZXJ0aWVzXG4gICAqL1xuICBnZXRDZW50ZXI6IGZ1bmN0aW9uIGdldENlbnRlcih0b3VjaGVzKSB7XG4gICAgdmFyIHBhZ2VYID0gW10sXG4gICAgICAgIHBhZ2VZID0gW10sXG4gICAgICAgIGNsaWVudFggPSBbXSxcbiAgICAgICAgY2xpZW50WSA9IFtdLFxuICAgICAgICBtaW4gPSBNYXRoLm1pbixcbiAgICAgICAgbWF4ID0gTWF0aC5tYXg7XG5cbiAgICAvLyBubyBuZWVkIHRvIGxvb3Agd2hlbiBvbmx5IG9uZSB0b3VjaFxuICAgIGlmICh0b3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFnZVg6IHRvdWNoZXNbMF0ucGFnZVgsXG4gICAgICAgIHBhZ2VZOiB0b3VjaGVzWzBdLnBhZ2VZLFxuICAgICAgICBjbGllbnRYOiB0b3VjaGVzWzBdLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6IHRvdWNoZXNbMF0uY2xpZW50WVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBVdGlscy5lYWNoKHRvdWNoZXMsIGZ1bmN0aW9uKHRvdWNoKSB7XG4gICAgICBwYWdlWC5wdXNoKHRvdWNoLnBhZ2VYKTtcbiAgICAgIHBhZ2VZLnB1c2godG91Y2gucGFnZVkpO1xuICAgICAgY2xpZW50WC5wdXNoKHRvdWNoLmNsaWVudFgpO1xuICAgICAgY2xpZW50WS5wdXNoKHRvdWNoLmNsaWVudFkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2VYOiAobWluLmFwcGx5KE1hdGgsIHBhZ2VYKSArIG1heC5hcHBseShNYXRoLCBwYWdlWCkpIC8gMixcbiAgICAgIHBhZ2VZOiAobWluLmFwcGx5KE1hdGgsIHBhZ2VZKSArIG1heC5hcHBseShNYXRoLCBwYWdlWSkpIC8gMixcbiAgICAgIGNsaWVudFg6IChtaW4uYXBwbHkoTWF0aCwgY2xpZW50WCkgKyBtYXguYXBwbHkoTWF0aCwgY2xpZW50WCkpIC8gMixcbiAgICAgIGNsaWVudFk6IChtaW4uYXBwbHkoTWF0aCwgY2xpZW50WSkgKyBtYXguYXBwbHkoTWF0aCwgY2xpZW50WSkpIC8gMlxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNhbGN1bGF0ZSB0aGUgdmVsb2NpdHkgYmV0d2VlbiB0d28gcG9pbnRzLiB1bml0IGlzIGluIHB4IHBlciBtcy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhVGltZVxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsdGFYXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVlcbiAgICogQHJldHVybiB7T2JqZWN0fSB2ZWxvY2l0eSBgeGAgYW5kIGB5YFxuICAgKi9cbiAgZ2V0VmVsb2NpdHk6IGZ1bmN0aW9uIGdldFZlbG9jaXR5KGRlbHRhVGltZSwgZGVsdGFYLCBkZWx0YVkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogTWF0aC5hYnMoZGVsdGFYIC8gZGVsdGFUaW1lKSB8fCAwLFxuICAgICAgeTogTWF0aC5hYnMoZGVsdGFZIC8gZGVsdGFUaW1lKSB8fCAwXG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBhbmdsZSBiZXR3ZWVuIHR3byBjb29yZGluYXRlc1xuICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaDFcbiAgICogQHBhcmFtIHtUb3VjaH0gdG91Y2gyXG4gICAqIEByZXR1cm4ge051bWJlcn0gYW5nbGVcbiAgICovXG4gIGdldEFuZ2xlOiBmdW5jdGlvbiBnZXRBbmdsZSh0b3VjaDEsIHRvdWNoMikge1xuICAgIHZhciB4ID0gdG91Y2gyLmNsaWVudFggLSB0b3VjaDEuY2xpZW50WCxcbiAgICAgICAgeSA9IHRvdWNoMi5jbGllbnRZIC0gdG91Y2gxLmNsaWVudFk7XG5cbiAgICByZXR1cm4gTWF0aC5hdGFuMih5LCB4KSAqIDE4MCAvIE1hdGguUEk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGRvIGEgc21hbGwgY29tcGFyaXNvbiB0byBnZXQgdGhlIGRpcmVjdGlvbiBiZXR3ZWVuIHR3byB0b3VjaGVzLlxuICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaDFcbiAgICogQHBhcmFtIHtUb3VjaH0gdG91Y2gyXG4gICAqIEByZXR1cm4ge1N0cmluZ30gZGlyZWN0aW9uIG1hdGNoZXMgYERJUkVDVElPTl9MRUZUfFJJR0hUfFVQfERPV05gXG4gICAqL1xuICBnZXREaXJlY3Rpb246IGZ1bmN0aW9uIGdldERpcmVjdGlvbih0b3VjaDEsIHRvdWNoMikge1xuICAgIHZhciB4ID0gTWF0aC5hYnModG91Y2gxLmNsaWVudFggLSB0b3VjaDIuY2xpZW50WCksXG4gICAgICAgIHkgPSBNYXRoLmFicyh0b3VjaDEuY2xpZW50WSAtIHRvdWNoMi5jbGllbnRZKTtcblxuICAgIGlmICh4ID49IHkpIHtcbiAgICAgIHJldHVybiB0b3VjaDEuY2xpZW50WCAtIHRvdWNoMi5jbGllbnRYID4gMCA/IERJUkVDVElPTl9MRUZUIDogRElSRUNUSU9OX1JJR0hUO1xuICAgIH1cbiAgICByZXR1cm4gdG91Y2gxLmNsaWVudFkgLSB0b3VjaDIuY2xpZW50WSA+IDAgPyBESVJFQ1RJT05fVVAgOiBESVJFQ1RJT05fRE9XTjtcbiAgfSxcblxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byB0b3VjaGVzXG4gICAqIEBwYXJhbSB7VG91Y2h9dG91Y2gxXG4gICAqIEBwYXJhbSB7VG91Y2h9IHRvdWNoMlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IGRpc3RhbmNlXG4gICAqL1xuICBnZXREaXN0YW5jZTogZnVuY3Rpb24gZ2V0RGlzdGFuY2UodG91Y2gxLCB0b3VjaDIpIHtcbiAgICB2YXIgeCA9IHRvdWNoMi5jbGllbnRYIC0gdG91Y2gxLmNsaWVudFgsXG4gICAgICAgIHkgPSB0b3VjaDIuY2xpZW50WSAtIHRvdWNoMS5jbGllbnRZO1xuXG4gICAgcmV0dXJuIE1hdGguc3FydCgoeCAqIHgpICsgKHkgKiB5KSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNhbGN1bGF0ZSB0aGUgc2NhbGUgZmFjdG9yIGJldHdlZW4gdHdvIHRvdWNoTGlzdHNcbiAgICogbm8gc2NhbGUgaXMgMSwgYW5kIGdvZXMgZG93biB0byAwIHdoZW4gcGluY2hlZCB0b2dldGhlciwgYW5kIGJpZ2dlciB3aGVuIHBpbmNoZWQgb3V0XG4gICAqIEBwYXJhbSB7QXJyYXl9IHN0YXJ0IGFycmF5IG9mIHRvdWNoZXNcbiAgICogQHBhcmFtIHtBcnJheX0gZW5kIGFycmF5IG9mIHRvdWNoZXNcbiAgICogQHJldHVybiB7TnVtYmVyfSBzY2FsZVxuICAgKi9cbiAgZ2V0U2NhbGU6IGZ1bmN0aW9uIGdldFNjYWxlKHN0YXJ0LCBlbmQpIHtcbiAgICAvLyBuZWVkIHR3byBmaW5nZXJzLi4uXG4gICAgaWYgKHN0YXJ0Lmxlbmd0aCA+PSAyICYmIGVuZC5sZW5ndGggPj0gMikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RGlzdGFuY2UoZW5kWzBdLCBlbmRbMV0pIC8gdGhpcy5nZXREaXN0YW5jZShzdGFydFswXSwgc3RhcnRbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gMTtcbiAgfSxcblxuICAvKipcbiAgICogY2FsY3VsYXRlIHRoZSByb3RhdGlvbiBkZWdyZWVzIGJldHdlZW4gdHdvIHRvdWNoTGlzdHNcbiAgICogQHBhcmFtIHtBcnJheX0gc3RhcnQgYXJyYXkgb2YgdG91Y2hlc1xuICAgKiBAcGFyYW0ge0FycmF5fSBlbmQgYXJyYXkgb2YgdG91Y2hlc1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHJvdGF0aW9uXG4gICAqL1xuICBnZXRSb3RhdGlvbjogZnVuY3Rpb24gZ2V0Um90YXRpb24oc3RhcnQsIGVuZCkge1xuICAgIC8vIG5lZWQgdHdvIGZpbmdlcnNcbiAgICBpZiAoc3RhcnQubGVuZ3RoID49IDIgJiYgZW5kLmxlbmd0aCA+PSAyKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRBbmdsZShlbmRbMV0sIGVuZFswXSkgLSB0aGlzLmdldEFuZ2xlKHN0YXJ0WzFdLCBzdGFydFswXSk7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9LFxuXG4gIC8qKlxuICAgKiBmaW5kIG91dCBpZiB0aGUgZGlyZWN0aW9uIGlzIHZlcnRpY2FsICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gZGlyZWN0aW9uIG1hdGNoZXMgYERJUkVDVElPTl9VUHxET1dOYFxuICAgKiBAcmV0dXJuIHtCb29sZWFufSBpc192ZXJ0aWNhbFxuICAgKi9cbiAgaXNWZXJ0aWNhbDogZnVuY3Rpb24gaXNWZXJ0aWNhbChkaXJlY3Rpb24pIHtcbiAgICByZXR1cm4gZGlyZWN0aW9uID09IERJUkVDVElPTl9VUCB8fCBkaXJlY3Rpb24gPT0gRElSRUNUSU9OX0RPV047XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNldCBjc3MgcHJvcGVydGllcyB3aXRoIHRoZWlyIHByZWZpeGVzXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3RvZ2dsZT10cnVlXVxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgc2V0UHJlZml4ZWRDc3M6IGZ1bmN0aW9uIHNldFByZWZpeGVkQ3NzKGVsZW1lbnQsIHByb3AsIHZhbHVlLCB0b2dnbGUpIHtcbiAgICB2YXIgcHJlZml4ZXMgPSBbJycsICdXZWJraXQnLCAnTW96JywgJ08nLCAnbXMnXTtcbiAgICBwcm9wID0gVXRpbHMudG9DYW1lbENhc2UocHJvcCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcCA9IHByb3A7XG4gICAgICAvLyBwcmVmaXhlc1xuICAgICAgaWYgKHByZWZpeGVzW2ldKSB7XG4gICAgICAgIHAgPSBwcmVmaXhlc1tpXSArIHAuc2xpY2UoMCwgMSkudG9VcHBlckNhc2UoKSArIHAuc2xpY2UoMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHRlc3QgdGhlIHN0eWxlXG4gICAgICBpZiAocCBpbiBlbGVtZW50LnN0eWxlKSB7XG4gICAgICAgIGVsZW1lbnQuc3R5bGVbcF0gPSAodG9nZ2xlID09PSBudWxsIHx8IHRvZ2dsZSkgJiYgdmFsdWUgfHwgJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogdG9nZ2xlIGJyb3dzZXIgZGVmYXVsdCBiZWhhdmlvciBieSBzZXR0aW5nIGNzcyBwcm9wZXJ0aWVzLlxuICAgKiBgdXNlclNlbGVjdD0nbm9uZSdgIGFsc28gc2V0cyBgZWxlbWVudC5vbnNlbGVjdHN0YXJ0YCB0byBmYWxzZVxuICAgKiBgdXNlckRyYWc9J25vbmUnYCBhbHNvIHNldHMgYGVsZW1lbnQub25kcmFnc3RhcnRgIHRvIGZhbHNlXG4gICAqXG4gICAqIEBwYXJhbSB7SHRtbEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3RvZ2dsZT10cnVlXVxuICAgKi9cbiAgdG9nZ2xlQmVoYXZpb3I6IGZ1bmN0aW9uIHRvZ2dsZUJlaGF2aW9yKGVsZW1lbnQsIHByb3BzLCB0b2dnbGUpIHtcbiAgICBpZiAoIXByb3BzIHx8ICFlbGVtZW50IHx8ICFlbGVtZW50LnN0eWxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc2V0IHRoZSBjc3MgcHJvcGVydGllc1xuICAgIFV0aWxzLmVhY2gocHJvcHMsIGZ1bmN0aW9uKHZhbHVlLCBwcm9wKSB7XG4gICAgICBVdGlscy5zZXRQcmVmaXhlZENzcyhlbGVtZW50LCBwcm9wLCB2YWx1ZSwgdG9nZ2xlKTtcbiAgICB9KTtcblxuICAgIHZhciBmYWxzZUZuID0gdG9nZ2xlICYmIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBhbHNvIHRoZSBkaXNhYmxlIG9uc2VsZWN0c3RhcnRcbiAgICBpZiAocHJvcHMudXNlclNlbGVjdCA9PSAnbm9uZScpIHtcbiAgICAgIGVsZW1lbnQub25zZWxlY3RzdGFydCA9IGZhbHNlRm47XG4gICAgfVxuICAgIC8vIGFuZCBkaXNhYmxlIG9uZHJhZ3N0YXJ0XG4gICAgaWYgKHByb3BzLnVzZXJEcmFnID09ICdub25lJykge1xuICAgICAgZWxlbWVudC5vbmRyYWdzdGFydCA9IGZhbHNlRm47XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBjb252ZXJ0IGEgc3RyaW5nIHdpdGggdW5kZXJzY29yZXMgdG8gY2FtZWxDYXNlXG4gICAqIHNvIHByZXZlbnRfZGVmYXVsdCBiZWNvbWVzIHByZXZlbnREZWZhdWx0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAgICogQHJldHVybiB7U3RyaW5nfSBjYW1lbENhc2VTdHJcbiAgICovXG4gIHRvQ2FtZWxDYXNlOiBmdW5jdGlvbiB0b0NhbWVsQ2FzZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1tfLV0oW2Etel0pL2csIGZ1bmN0aW9uKHMpIHtcbiAgICAgIHJldHVybiBzWzFdLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBAbW9kdWxlIEdlc3R1cmVEZXRlY3RvclxuICovXG4vKipcbiAqIEBjbGFzcyBFdmVudFxuICogQHN0YXRpY1xuICovXG5FdmVudCA9IEdlc3R1cmVEZXRlY3Rvci5ldmVudCA9IHtcbiAgLyoqXG4gICAqIHdoZW4gdG91Y2ggZXZlbnRzIGhhdmUgYmVlbiBmaXJlZCwgdGhpcyBpcyB0cnVlXG4gICAqIHRoaXMgaXMgdXNlZCB0byBzdG9wIG1vdXNlIGV2ZW50c1xuICAgKiBAcHJvcGVydHkgcHJldmVudF9tb3VzZWV2ZW50c1xuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICovXG4gIHByZXZlbnRNb3VzZUV2ZW50czogZmFsc2UsXG5cbiAgLyoqXG4gICAqIGlmIEVWRU5UX1NUQVJUIGhhcyBiZWVuIGZpcmVkXG4gICAqIEBwcm9wZXJ0eSBzdGFydGVkXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgc3RhcnRlZDogZmFsc2UsXG5cbiAgLyoqXG4gICAqIHdoZW4gdGhlIG1vdXNlIGlzIGhvbGQgZG93biwgdGhpcyBpcyB0cnVlXG4gICAqIEBwcm9wZXJ0eSBzaG91bGRfZGV0ZWN0XG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKi9cbiAgc2hvdWxkRGV0ZWN0OiBmYWxzZSxcblxuICAvKipcbiAgICogc2ltcGxlIGV2ZW50IGJpbmRlciB3aXRoIGEgaG9vayBhbmQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgdHlwZXNcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0XVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaG9va11cbiAgICogQHBhcmFtIHtPYmplY3R9IGhvb2sudHlwZVxuICAgKi9cbiAgb246IGZ1bmN0aW9uIG9uKGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIsIG9wdCwgaG9vaykge1xuICAgIHZhciB0eXBlcyA9IHR5cGUuc3BsaXQoJyAnKTtcbiAgICBVdGlscy5lYWNoKHR5cGVzLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICBVdGlscy5vbihlbGVtZW50LCB0eXBlLCBoYW5kbGVyLCBvcHQpO1xuICAgICAgaG9vayAmJiBob29rKHR5cGUpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBzaW1wbGUgZXZlbnQgdW5iaW5kZXIgd2l0aCBhIGhvb2sgYW5kIHN1cHBvcnQgZm9yIG11bHRpcGxlIHR5cGVzXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdF1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2hvb2tdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBob29rLnR5cGVcbiAgICovXG4gIG9mZjogZnVuY3Rpb24gb2ZmKGVsZW1lbnQsIHR5cGUsIGhhbmRsZXIsIG9wdCwgaG9vaykge1xuICAgIHZhciB0eXBlcyA9IHR5cGUuc3BsaXQoJyAnKTtcbiAgICBVdGlscy5lYWNoKHR5cGVzLCBmdW5jdGlvbih0eXBlKSB7XG4gICAgICBVdGlscy5vZmYoZWxlbWVudCwgdHlwZSwgaGFuZGxlciwgb3B0KTtcbiAgICAgIGhvb2sgJiYgaG9vayh0eXBlKTtcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICogdGhlIGNvcmUgdG91Y2ggZXZlbnQgaGFuZGxlci5cbiAgICogdGhpcyBmaW5kcyBvdXQgaWYgd2Ugc2hvdWxkIHRvIGRldGVjdCBnZXN0dXJlc1xuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGUgbWF0Y2hlcyBgRVZFTlRfU1RBUlR8TU9WRXxFTkRgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICogQHJldHVybiBvblRvdWNoSGFuZGxlciB7RnVuY3Rpb259IHRoZSBjb3JlIGV2ZW50IGhhbmRsZXJcbiAgICovXG4gIG9uVG91Y2g6IGZ1bmN0aW9uIG9uVG91Y2goZWxlbWVudCwgZXZlbnRUeXBlLCBoYW5kbGVyLCBvcHQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgb25Ub3VjaEhhbmRsZXIgPSBmdW5jdGlvbiBvblRvdWNoSGFuZGxlcihldikge1xuICAgICAgdmFyIHNyY1R5cGUgPSBldi50eXBlLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgaXNQb2ludGVyID0gR2VzdHVyZURldGVjdG9yLkhBU19QT0lOVEVSRVZFTlRTLFxuICAgICAgICAgIGlzTW91c2UgPSBVdGlscy5pblN0cihzcmNUeXBlLCAnbW91c2UnKSxcbiAgICAgICAgICB0cmlnZ2VyVHlwZTtcblxuICAgICAgLy8gaWYgd2UgYXJlIGluIGEgbW91c2VldmVudCwgYnV0IHRoZXJlIGhhcyBiZWVuIGEgdG91Y2hldmVudCB0cmlnZ2VyZWQgaW4gdGhpcyBzZXNzaW9uXG4gICAgICAvLyB3ZSB3YW50IHRvIGRvIG5vdGhpbmcuIHNpbXBseSBicmVhayBvdXQgb2YgdGhlIGV2ZW50LlxuICAgICAgaWYgKGlzTW91c2UgJiYgc2VsZi5wcmV2ZW50TW91c2VFdmVudHMpIHtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIG1vdXNlYnV0dG9uIG11c3QgYmUgZG93blxuICAgICAgfSBlbHNlIGlmIChpc01vdXNlICYmIGV2ZW50VHlwZSA9PSBFVkVOVF9TVEFSVCAmJiBldi5idXR0b24gPT09IDApIHtcbiAgICAgICAgc2VsZi5wcmV2ZW50TW91c2VFdmVudHMgPSBmYWxzZTtcbiAgICAgICAgc2VsZi5zaG91bGREZXRlY3QgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChpc1BvaW50ZXIgJiYgZXZlbnRUeXBlID09IEVWRU5UX1NUQVJUKSB7XG4gICAgICAgIHNlbGYuc2hvdWxkRGV0ZWN0ID0gKGV2LmJ1dHRvbnMgPT09IDEgfHwgUG9pbnRlckV2ZW50Lm1hdGNoVHlwZShQT0lOVEVSX1RPVUNILCBldikpO1xuICAgICAgICAvLyBqdXN0IGEgdmFsaWQgc3RhcnQgZXZlbnQsIGJ1dCBubyBtb3VzZVxuICAgICAgfSBlbHNlIGlmICghaXNNb3VzZSAmJiBldmVudFR5cGUgPT0gRVZFTlRfU1RBUlQpIHtcbiAgICAgICAgc2VsZi5wcmV2ZW50TW91c2VFdmVudHMgPSB0cnVlO1xuICAgICAgICBzZWxmLnNob3VsZERldGVjdCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHVwZGF0ZSB0aGUgcG9pbnRlciBldmVudCBiZWZvcmUgZW50ZXJpbmcgdGhlIGRldGVjdGlvblxuICAgICAgaWYgKGlzUG9pbnRlciAmJiBldmVudFR5cGUgIT0gRVZFTlRfRU5EKSB7XG4gICAgICAgIFBvaW50ZXJFdmVudC51cGRhdGVQb2ludGVyKGV2ZW50VHlwZSwgZXYpO1xuICAgICAgfVxuXG4gICAgICAvLyB3ZSBhcmUgaW4gYSB0b3VjaC9kb3duIHN0YXRlLCBzbyBhbGxvd2VkIGRldGVjdGlvbiBvZiBnZXN0dXJlc1xuICAgICAgaWYgKHNlbGYuc2hvdWxkRGV0ZWN0KSB7XG4gICAgICAgIHRyaWdnZXJUeXBlID0gc2VsZi5kb0RldGVjdC5jYWxsKHNlbGYsIGV2LCBldmVudFR5cGUsIGVsZW1lbnQsIGhhbmRsZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyAuLi5hbmQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgZGV0ZWN0aW9uXG4gICAgICAvLyBzbyByZXNldCBldmVyeXRoaW5nIHRvIHN0YXJ0IGVhY2ggZGV0ZWN0aW9uIHRvdGFsbHkgZnJlc2hcbiAgICAgIGlmICh0cmlnZ2VyVHlwZSA9PSBFVkVOVF9FTkQpIHtcbiAgICAgICAgc2VsZi5wcmV2ZW50TW91c2VFdmVudHMgPSBmYWxzZTtcbiAgICAgICAgc2VsZi5zaG91bGREZXRlY3QgPSBmYWxzZTtcbiAgICAgICAgUG9pbnRlckV2ZW50LnJlc2V0KCk7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgcG9pbnRlcmV2ZW50IG9iamVjdCBhZnRlciB0aGUgZGV0ZWN0aW9uXG4gICAgICB9XG5cbiAgICAgIGlmIChpc1BvaW50ZXIgJiYgZXZlbnRUeXBlID09IEVWRU5UX0VORCkge1xuICAgICAgICBQb2ludGVyRXZlbnQudXBkYXRlUG9pbnRlcihldmVudFR5cGUsIGV2KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5vbihlbGVtZW50LCBFVkVOVF9UWVBFU1tldmVudFR5cGVdLCBvblRvdWNoSGFuZGxlciwgb3B0KTtcbiAgICByZXR1cm4gb25Ub3VjaEhhbmRsZXI7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHRoZSBjb3JlIGRldGVjdGlvbiBtZXRob2RcbiAgICogdGhpcyBmaW5kcyBvdXQgd2hhdCBHZXN0dXJlRGV0ZWN0b3ItdG91Y2gtZXZlbnRzIHRvIHRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGUgbWF0Y2hlcyBgRVZFTlRfU1RBUlR8TU9WRXxFTkRgXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlclxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IHRyaWdnZXJUeXBlIG1hdGNoZXMgYEVWRU5UX1NUQVJUfE1PVkV8RU5EYFxuICAgKi9cbiAgZG9EZXRlY3Q6IGZ1bmN0aW9uIGRvRGV0ZWN0KGV2LCBldmVudFR5cGUsIGVsZW1lbnQsIGhhbmRsZXIpIHtcbiAgICB2YXIgdG91Y2hMaXN0ID0gdGhpcy5nZXRUb3VjaExpc3QoZXYsIGV2ZW50VHlwZSk7XG4gICAgdmFyIHRvdWNoTGlzdExlbmd0aCA9IHRvdWNoTGlzdC5sZW5ndGg7XG4gICAgdmFyIHRyaWdnZXJUeXBlID0gZXZlbnRUeXBlO1xuICAgIHZhciB0cmlnZ2VyQ2hhbmdlID0gdG91Y2hMaXN0LnRyaWdnZXI7IC8vIHVzZWQgYnkgZmFrZU11bHRpdG91Y2ggcGx1Z2luXG4gICAgdmFyIGNoYW5nZWRMZW5ndGggPSB0b3VjaExpc3RMZW5ndGg7XG5cbiAgICAvLyBhdCBlYWNoIHRvdWNoc3RhcnQtbGlrZSBldmVudCB3ZSB3YW50IGFsc28gd2FudCB0byB0cmlnZ2VyIGEgVE9VQ0ggZXZlbnQuLi5cbiAgICBpZiAoZXZlbnRUeXBlID09IEVWRU5UX1NUQVJUKSB7XG4gICAgICB0cmlnZ2VyQ2hhbmdlID0gRVZFTlRfVE9VQ0g7XG4gICAgICAvLyAuLi50aGUgc2FtZSBmb3IgYSB0b3VjaGVuZC1saWtlIGV2ZW50XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT0gRVZFTlRfRU5EKSB7XG4gICAgICB0cmlnZ2VyQ2hhbmdlID0gRVZFTlRfUkVMRUFTRTtcblxuICAgICAgLy8ga2VlcCB0cmFjayBvZiBob3cgbWFueSB0b3VjaGVzIGhhdmUgYmVlbiByZW1vdmVkXG4gICAgICBjaGFuZ2VkTGVuZ3RoID0gdG91Y2hMaXN0Lmxlbmd0aCAtICgoZXYuY2hhbmdlZFRvdWNoZXMpID8gZXYuY2hhbmdlZFRvdWNoZXMubGVuZ3RoIDogMSk7XG4gICAgfVxuXG4gICAgLy8gYWZ0ZXIgdGhlcmUgYXJlIHN0aWxsIHRvdWNoZXMgb24gdGhlIHNjcmVlbixcbiAgICAvLyB3ZSBqdXN0IHdhbnQgdG8gdHJpZ2dlciBhIE1PVkUgZXZlbnQuIHNvIGNoYW5nZSB0aGUgU1RBUlQgb3IgRU5EIHRvIGEgTU9WRVxuICAgIC8vIGJ1dCBvbmx5IGFmdGVyIGRldGVjdGlvbiBoYXMgYmVlbiBzdGFydGVkLCB0aGUgZmlyc3QgdGltZSB3ZSBhY3R1YWxseSB3YW50IGEgU1RBUlRcbiAgICBpZiAoY2hhbmdlZExlbmd0aCA+IDAgJiYgdGhpcy5zdGFydGVkKSB7XG4gICAgICB0cmlnZ2VyVHlwZSA9IEVWRU5UX01PVkU7XG4gICAgfVxuXG4gICAgLy8gZGV0ZWN0aW9uIGhhcyBiZWVuIHN0YXJ0ZWQsIHdlIGtlZXAgdHJhY2sgb2YgdGhpcywgc2VlIGFib3ZlXG4gICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcblxuICAgIC8vIGdlbmVyYXRlIHNvbWUgZXZlbnQgZGF0YSwgc29tZSBiYXNpYyBpbmZvcm1hdGlvblxuICAgIHZhciBldkRhdGEgPSB0aGlzLmNvbGxlY3RFdmVudERhdGEoZWxlbWVudCwgdHJpZ2dlclR5cGUsIHRvdWNoTGlzdCwgZXYpO1xuXG4gICAgLy8gdHJpZ2dlciB0aGUgdHJpZ2dlclR5cGUgZXZlbnQgYmVmb3JlIHRoZSBjaGFuZ2UgKFRPVUNILCBSRUxFQVNFKSBldmVudHNcbiAgICAvLyBidXQgdGhlIEVORCBldmVudCBzaG91bGQgYmUgYXQgbGFzdFxuICAgIGlmIChldmVudFR5cGUgIT0gRVZFTlRfRU5EKSB7XG4gICAgICBoYW5kbGVyLmNhbGwoRGV0ZWN0aW9uLCBldkRhdGEpO1xuICAgIH1cblxuICAgIC8vIHRyaWdnZXIgYSBjaGFuZ2UgKFRPVUNILCBSRUxFQVNFKSBldmVudCwgdGhpcyBtZWFucyB0aGUgbGVuZ3RoIG9mIHRoZSB0b3VjaGVzIGNoYW5nZWRcbiAgICBpZiAodHJpZ2dlckNoYW5nZSkge1xuICAgICAgZXZEYXRhLmNoYW5nZWRMZW5ndGggPSBjaGFuZ2VkTGVuZ3RoO1xuICAgICAgZXZEYXRhLmV2ZW50VHlwZSA9IHRyaWdnZXJDaGFuZ2U7XG5cbiAgICAgIGhhbmRsZXIuY2FsbChEZXRlY3Rpb24sIGV2RGF0YSk7XG5cbiAgICAgIGV2RGF0YS5ldmVudFR5cGUgPSB0cmlnZ2VyVHlwZTtcbiAgICAgIGRlbGV0ZSBldkRhdGEuY2hhbmdlZExlbmd0aDtcbiAgICB9XG5cbiAgICAvLyB0cmlnZ2VyIHRoZSBFTkQgZXZlbnRcbiAgICBpZiAodHJpZ2dlclR5cGUgPT0gRVZFTlRfRU5EKSB7XG4gICAgICBoYW5kbGVyLmNhbGwoRGV0ZWN0aW9uLCBldkRhdGEpO1xuXG4gICAgICAvLyAuLi5hbmQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgZGV0ZWN0aW9uXG4gICAgICAvLyBzbyByZXNldCBldmVyeXRoaW5nIHRvIHN0YXJ0IGVhY2ggZGV0ZWN0aW9uIHRvdGFsbHkgZnJlc2hcbiAgICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cmlnZ2VyVHlwZTtcbiAgfSxcblxuICAvKipcbiAgICogd2UgaGF2ZSBkaWZmZXJlbnQgZXZlbnRzIGZvciBlYWNoIGRldmljZS9icm93c2VyXG4gICAqIGRldGVybWluZSB3aGF0IHdlIG5lZWQgYW5kIHNldCB0aGVtIGluIHRoZSBFVkVOVF9UWVBFUyBjb25zdGFudFxuICAgKiB0aGUgYG9uVG91Y2hgIG1ldGhvZCBpcyBiaW5kIHRvIHRoZXNlIHByb3BlcnRpZXMuXG4gICAqIEByZXR1cm4ge09iamVjdH0gZXZlbnRzXG4gICAqL1xuICBkZXRlcm1pbmVFdmVudFR5cGVzOiBmdW5jdGlvbiBkZXRlcm1pbmVFdmVudFR5cGVzKCkge1xuICAgIHZhciB0eXBlcztcbiAgICBpZiAoR2VzdHVyZURldGVjdG9yLkhBU19QT0lOVEVSRVZFTlRTKSB7XG4gICAgICBpZiAod2luZG93LlBvaW50ZXJFdmVudCkge1xuICAgICAgICB0eXBlcyA9IFtcbiAgICAgICAgICAncG9pbnRlcmRvd24nLFxuICAgICAgICAgICdwb2ludGVybW92ZScsXG4gICAgICAgICAgJ3BvaW50ZXJ1cCBwb2ludGVyY2FuY2VsIGxvc3Rwb2ludGVyY2FwdHVyZSdcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGVzID0gW1xuICAgICAgICAgICdNU1BvaW50ZXJEb3duJyxcbiAgICAgICAgICAnTVNQb2ludGVyTW92ZScsXG4gICAgICAgICAgJ01TUG9pbnRlclVwIE1TUG9pbnRlckNhbmNlbCBNU0xvc3RQb2ludGVyQ2FwdHVyZSdcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEdlc3R1cmVEZXRlY3Rvci5OT19NT1VTRUVWRU5UUykge1xuICAgICAgdHlwZXMgPSBbXG4gICAgICAgICd0b3VjaHN0YXJ0JyxcbiAgICAgICAgJ3RvdWNobW92ZScsXG4gICAgICAgICd0b3VjaGVuZCB0b3VjaGNhbmNlbCdcbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGVzID0gW1xuICAgICAgICAndG91Y2hzdGFydCBtb3VzZWRvd24nLFxuICAgICAgICAndG91Y2htb3ZlIG1vdXNlbW92ZScsXG4gICAgICAgICd0b3VjaGVuZCB0b3VjaGNhbmNlbCBtb3VzZXVwJ1xuICAgICAgXTtcbiAgICB9XG5cbiAgICBFVkVOVF9UWVBFU1tFVkVOVF9TVEFSVF0gPSB0eXBlc1swXTtcbiAgICBFVkVOVF9UWVBFU1tFVkVOVF9NT1ZFXSA9IHR5cGVzWzFdO1xuICAgIEVWRU5UX1RZUEVTW0VWRU5UX0VORF0gPSB0eXBlc1syXTtcbiAgICByZXR1cm4gRVZFTlRfVFlQRVM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNyZWF0ZSB0b3VjaExpc3QgZGVwZW5kaW5nIG9uIHRoZSBldmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50VHlwZVxuICAgKiBAcmV0dXJuIHtBcnJheX0gdG91Y2hlc1xuICAgKi9cbiAgZ2V0VG91Y2hMaXN0OiBmdW5jdGlvbiBnZXRUb3VjaExpc3QoZXYsIGV2ZW50VHlwZSkge1xuICAgIC8vIGdldCB0aGUgZmFrZSBwb2ludGVyRXZlbnQgdG91Y2hsaXN0XG4gICAgaWYgKEdlc3R1cmVEZXRlY3Rvci5IQVNfUE9JTlRFUkVWRU5UUykge1xuICAgICAgcmV0dXJuIFBvaW50ZXJFdmVudC5nZXRUb3VjaExpc3QoKTtcbiAgICB9XG5cbiAgICAvLyBnZXQgdGhlIHRvdWNobGlzdFxuICAgIGlmIChldi50b3VjaGVzKSB7XG4gICAgICBpZiAoZXZlbnRUeXBlID09IEVWRU5UX01PVkUpIHtcbiAgICAgICAgcmV0dXJuIGV2LnRvdWNoZXM7XG4gICAgICB9XG5cbiAgICAgIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICAgICAgdmFyIGNvbmNhdCA9IFtdLmNvbmNhdChVdGlscy50b0FycmF5KGV2LnRvdWNoZXMpLCBVdGlscy50b0FycmF5KGV2LmNoYW5nZWRUb3VjaGVzKSk7XG4gICAgICB2YXIgdG91Y2hMaXN0ID0gW107XG5cbiAgICAgIFV0aWxzLmVhY2goY29uY2F0LCBmdW5jdGlvbih0b3VjaCkge1xuICAgICAgICBpZiAoVXRpbHMuaW5BcnJheShpZGVudGlmaWVycywgdG91Y2guaWRlbnRpZmllcikgPT09IC0xKSB7XG4gICAgICAgICAgdG91Y2hMaXN0LnB1c2godG91Y2gpO1xuICAgICAgICB9XG4gICAgICAgIGlkZW50aWZpZXJzLnB1c2godG91Y2guaWRlbnRpZmllcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRvdWNoTGlzdDtcbiAgICB9XG5cbiAgICAvLyBtYWtlIGZha2UgdG91Y2hMaXN0IGZyb20gbW91c2UgcG9zaXRpb25cbiAgICBldi5pZGVudGlmaWVyID0gMTtcbiAgICByZXR1cm4gW2V2XTtcbiAgfSxcblxuICAvKipcbiAgICogY29sbGVjdCBiYXNpYyBldmVudCBkYXRhXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50VHlwZSBtYXRjaGVzIGBFVkVOVF9TVEFSVHxNT1ZFfEVORGBcbiAgICogQHBhcmFtIHtBcnJheX0gdG91Y2hlc1xuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICogQHJldHVybiB7T2JqZWN0fSBldlxuICAgKi9cbiAgY29sbGVjdEV2ZW50RGF0YTogZnVuY3Rpb24gY29sbGVjdEV2ZW50RGF0YShlbGVtZW50LCBldmVudFR5cGUsIHRvdWNoZXMsIGV2KSB7XG4gICAgLy8gZmluZCBvdXQgcG9pbnRlclR5cGVcbiAgICB2YXIgcG9pbnRlclR5cGUgPSBQT0lOVEVSX1RPVUNIO1xuICAgIGlmIChVdGlscy5pblN0cihldi50eXBlLCAnbW91c2UnKSB8fCBQb2ludGVyRXZlbnQubWF0Y2hUeXBlKFBPSU5URVJfTU9VU0UsIGV2KSkge1xuICAgICAgcG9pbnRlclR5cGUgPSBQT0lOVEVSX01PVVNFO1xuICAgIH0gZWxzZSBpZiAoUG9pbnRlckV2ZW50Lm1hdGNoVHlwZShQT0lOVEVSX1BFTiwgZXYpKSB7XG4gICAgICBwb2ludGVyVHlwZSA9IFBPSU5URVJfUEVOO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjZW50ZXI6IFV0aWxzLmdldENlbnRlcih0b3VjaGVzKSxcbiAgICAgIHRpbWVTdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIHRhcmdldDogZXYudGFyZ2V0LFxuICAgICAgdG91Y2hlczogdG91Y2hlcyxcbiAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlLFxuICAgICAgcG9pbnRlclR5cGU6IHBvaW50ZXJUeXBlLFxuICAgICAgc3JjRXZlbnQ6IGV2LFxuXG4gICAgICAvKipcbiAgICAgICAqIHByZXZlbnQgdGhlIGJyb3dzZXIgZGVmYXVsdCBhY3Rpb25zXG4gICAgICAgKiBtb3N0bHkgdXNlZCB0byBkaXNhYmxlIHNjcm9sbGluZyBvZiB0aGUgYnJvd3NlclxuICAgICAgICovXG4gICAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzcmNFdmVudCA9IHRoaXMuc3JjRXZlbnQ7XG4gICAgICAgIHNyY0V2ZW50LnByZXZlbnRNYW5pcHVsYXRpb24gJiYgc3JjRXZlbnQucHJldmVudE1hbmlwdWxhdGlvbigpO1xuICAgICAgICBzcmNFdmVudC5wcmV2ZW50RGVmYXVsdCAmJiBzcmNFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBzdG9wIGJ1YmJsaW5nIHRoZSBldmVudCB1cCB0byBpdHMgcGFyZW50c1xuICAgICAgICovXG4gICAgICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnNyY0V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBpbW1lZGlhdGVseSBzdG9wIGdlc3R1cmUgZGV0ZWN0aW9uXG4gICAgICAgKiBtaWdodCBiZSB1c2VmdWwgYWZ0ZXIgYSBzd2lwZSB3YXMgZGV0ZWN0ZWRcbiAgICAgICAqIEByZXR1cm4geyp9XG4gICAgICAgKi9cbiAgICAgIHN0b3BEZXRlY3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gRGV0ZWN0aW9uLnN0b3BEZXRlY3QoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuXG5cbi8qKlxuICogQG1vZHVsZSBHZXN0dXJlRGV0ZWN0b3JcbiAqXG4gKiBAY2xhc3MgUG9pbnRlckV2ZW50XG4gKiBAc3RhdGljXG4gKi9cblBvaW50ZXJFdmVudCA9IEdlc3R1cmVEZXRlY3Rvci5Qb2ludGVyRXZlbnQgPSB7XG4gIC8qKlxuICAgKiBob2xkcyBhbGwgcG9pbnRlcnMsIGJ5IGBpZGVudGlmaWVyYFxuICAgKiBAcHJvcGVydHkgcG9pbnRlcnNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHBvaW50ZXJzOiB7fSxcblxuICAvKipcbiAgICogZ2V0IHRoZSBwb2ludGVycyBhcyBhbiBhcnJheVxuICAgKiBAcmV0dXJuIHtBcnJheX0gdG91Y2hsaXN0XG4gICAqL1xuICBnZXRUb3VjaExpc3Q6IGZ1bmN0aW9uIGdldFRvdWNoTGlzdCgpIHtcbiAgICB2YXIgdG91Y2hsaXN0ID0gW107XG4gICAgLy8gd2UgY2FuIHVzZSBmb3JFYWNoIHNpbmNlIHBvaW50ZXJFdmVudHMgb25seSBpcyBpbiBJRTEwXG4gICAgVXRpbHMuZWFjaCh0aGlzLnBvaW50ZXJzLCBmdW5jdGlvbihwb2ludGVyKSB7XG4gICAgICB0b3VjaGxpc3QucHVzaChwb2ludGVyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdG91Y2hsaXN0O1xuICB9LFxuXG4gIC8qKlxuICAgKiB1cGRhdGUgdGhlIHBvc2l0aW9uIG9mIGEgcG9pbnRlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRUeXBlIG1hdGNoZXMgYEVWRU5UX1NUQVJUfE1PVkV8RU5EYFxuICAgKiBAcGFyYW0ge09iamVjdH0gcG9pbnRlckV2ZW50XG4gICAqL1xuICB1cGRhdGVQb2ludGVyOiBmdW5jdGlvbiB1cGRhdGVQb2ludGVyKGV2ZW50VHlwZSwgcG9pbnRlckV2ZW50KSB7XG4gICAgaWYgKGV2ZW50VHlwZSA9PSBFVkVOVF9FTkQgfHwgKGV2ZW50VHlwZSAhPSBFVkVOVF9FTkQgJiYgcG9pbnRlckV2ZW50LmJ1dHRvbnMgIT09IDEpKSB7XG4gICAgICBkZWxldGUgdGhpcy5wb2ludGVyc1twb2ludGVyRXZlbnQucG9pbnRlcklkXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9pbnRlckV2ZW50LmlkZW50aWZpZXIgPSBwb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgdGhpcy5wb2ludGVyc1twb2ludGVyRXZlbnQucG9pbnRlcklkXSA9IHBvaW50ZXJFdmVudDtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIGNoZWNrIGlmIGV2IG1hdGNoZXMgcG9pbnRlcnR5cGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBvaW50ZXJUeXBlIG1hdGNoZXMgYFBPSU5URVJfTU9VU0V8VE9VQ0h8UEVOYFxuICAgKiBAcGFyYW0ge1BvaW50ZXJFdmVudH0gZXZcbiAgICovXG4gIG1hdGNoVHlwZTogZnVuY3Rpb24gbWF0Y2hUeXBlKHBvaW50ZXJUeXBlLCBldikge1xuICAgIGlmICghZXYucG9pbnRlclR5cGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcHQgPSBldi5wb2ludGVyVHlwZSxcbiAgICAgICAgdHlwZXMgPSB7fTtcblxuICAgIHR5cGVzW1BPSU5URVJfTU9VU0VdID0gKHB0ID09PSAoZXYuTVNQT0lOVEVSX1RZUEVfTU9VU0UgfHwgUE9JTlRFUl9NT1VTRSkpO1xuICAgIHR5cGVzW1BPSU5URVJfVE9VQ0hdID0gKHB0ID09PSAoZXYuTVNQT0lOVEVSX1RZUEVfVE9VQ0ggfHwgUE9JTlRFUl9UT1VDSCkpO1xuICAgIHR5cGVzW1BPSU5URVJfUEVOXSA9IChwdCA9PT0gKGV2Lk1TUE9JTlRFUl9UWVBFX1BFTiB8fCBQT0lOVEVSX1BFTikpO1xuICAgIHJldHVybiB0eXBlc1twb2ludGVyVHlwZV07XG4gIH0sXG5cbiAgLyoqXG4gICAqIHJlc2V0IHRoZSBzdG9yZWQgcG9pbnRlcnNcbiAgICovXG4gIHJlc2V0OiBmdW5jdGlvbiByZXNldExpc3QoKSB7XG4gICAgdGhpcy5wb2ludGVycyA9IHt9O1xuICB9XG59O1xuXG5cbi8qKlxuICogQG1vZHVsZSBHZXN0dXJlRGV0ZWN0b3JcbiAqXG4gKiBAY2xhc3MgRGV0ZWN0aW9uXG4gKiBAc3RhdGljXG4gKi9cbkRldGVjdGlvbiA9IEdlc3R1cmVEZXRlY3Rvci5kZXRlY3Rpb24gPSB7XG4gIC8vIGNvbnRhaW5zIGFsbCByZWdpc3RlcmVkIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcyBpbiB0aGUgY29ycmVjdCBvcmRlclxuICBnZXN0dXJlczogW10sXG5cbiAgLy8gZGF0YSBvZiB0aGUgY3VycmVudCBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZSBkZXRlY3Rpb24gc2Vzc2lvblxuICBjdXJyZW50OiBudWxsLFxuXG4gIC8vIHRoZSBwcmV2aW91cyBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZSBzZXNzaW9uIGRhdGFcbiAgLy8gaXMgYSBmdWxsIGNsb25lIG9mIHRoZSBwcmV2aW91cyBnZXN0dXJlLmN1cnJlbnQgb2JqZWN0XG4gIHByZXZpb3VzOiBudWxsLFxuXG4gIC8vIHdoZW4gdGhpcyBiZWNvbWVzIHRydWUsIG5vIGdlc3R1cmVzIGFyZSBmaXJlZFxuICBzdG9wcGVkOiBmYWxzZSxcblxuICAvKipcbiAgICogc3RhcnQgR2VzdHVyZURldGVjdG9yLmdlc3R1cmUgZGV0ZWN0aW9uXG4gICAqIEBwYXJhbSB7R2VzdHVyZURldGVjdG9yLkluc3RhbmNlfSBpbnN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudERhdGFcbiAgICovXG4gIHN0YXJ0RGV0ZWN0OiBmdW5jdGlvbiBzdGFydERldGVjdChpbnN0LCBldmVudERhdGEpIHtcbiAgICAvLyBhbHJlYWR5IGJ1c3kgd2l0aCBhIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIGRldGVjdGlvbiBvbiBhbiBlbGVtZW50XG4gICAgaWYgKHRoaXMuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcHBlZCA9IGZhbHNlO1xuXG4gICAgLy8gaG9sZHMgY3VycmVudCBzZXNzaW9uXG4gICAgdGhpcy5jdXJyZW50ID0ge1xuICAgICAgaW5zdDogaW5zdCwgLy8gcmVmZXJlbmNlIHRvIEdlc3R1cmVEZXRlY3Rvckluc3RhbmNlIHdlJ3JlIHdvcmtpbmcgZm9yXG4gICAgICBzdGFydEV2ZW50OiBVdGlscy5leHRlbmQoe30sIGV2ZW50RGF0YSksIC8vIHN0YXJ0IGV2ZW50RGF0YSBmb3IgZGlzdGFuY2VzLCB0aW1pbmcgZXRjXG4gICAgICBsYXN0RXZlbnQ6IGZhbHNlLCAvLyBsYXN0IGV2ZW50RGF0YVxuICAgICAgbGFzdENhbGNFdmVudDogZmFsc2UsIC8vIGxhc3QgZXZlbnREYXRhIGZvciBjYWxjdWxhdGlvbnMuXG4gICAgICBmdXR1cmVDYWxjRXZlbnQ6IGZhbHNlLCAvLyBsYXN0IGV2ZW50RGF0YSBmb3IgY2FsY3VsYXRpb25zLlxuICAgICAgbGFzdENhbGNEYXRhOiB7fSwgLy8gbGFzdCBsYXN0Q2FsY0RhdGFcbiAgICAgIG5hbWU6ICcnIC8vIGN1cnJlbnQgZ2VzdHVyZSB3ZSdyZSBpbi9kZXRlY3RlZCwgY2FuIGJlICd0YXAnLCAnaG9sZCcgZXRjXG4gICAgfTtcblxuICAgIHRoaXMuZGV0ZWN0KGV2ZW50RGF0YSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIGRldGVjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnREYXRhXG4gICAqIEByZXR1cm4ge2FueX1cbiAgICovXG4gIGRldGVjdDogZnVuY3Rpb24gZGV0ZWN0KGV2ZW50RGF0YSkge1xuICAgIGlmICghdGhpcy5jdXJyZW50IHx8IHRoaXMuc3RvcHBlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGV4dGVuZCBldmVudCBkYXRhIHdpdGggY2FsY3VsYXRpb25zIGFib3V0IHNjYWxlLCBkaXN0YW5jZSBldGNcbiAgICBldmVudERhdGEgPSB0aGlzLmV4dGVuZEV2ZW50RGF0YShldmVudERhdGEpO1xuXG4gICAgLy8gR2VzdHVyZURldGVjdG9yIGluc3RhbmNlIGFuZCBpbnN0YW5jZSBvcHRpb25zXG4gICAgdmFyIGluc3QgPSB0aGlzLmN1cnJlbnQuaW5zdCxcbiAgICAgICAgaW5zdE9wdGlvbnMgPSBpbnN0Lm9wdGlvbnM7XG5cbiAgICAvLyBjYWxsIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIGhhbmRsZXJzXG4gICAgVXRpbHMuZWFjaCh0aGlzLmdlc3R1cmVzLCBmdW5jdGlvbiB0cmlnZ2VyR2VzdHVyZShnZXN0dXJlKSB7XG4gICAgICAvLyBvbmx5IHdoZW4gdGhlIGluc3RhbmNlIG9wdGlvbnMgaGF2ZSBlbmFibGVkIHRoaXMgZ2VzdHVyZVxuICAgICAgaWYgKCF0aGlzLnN0b3BwZWQgJiYgaW5zdC5lbmFibGVkICYmIGluc3RPcHRpb25zW2dlc3R1cmUubmFtZV0pIHtcbiAgICAgICAgZ2VzdHVyZS5oYW5kbGVyLmNhbGwoZ2VzdHVyZSwgZXZlbnREYXRhLCBpbnN0KTtcbiAgICAgIH1cbiAgICB9LCB0aGlzKTtcblxuICAgIC8vIHN0b3JlIGFzIHByZXZpb3VzIGV2ZW50IGV2ZW50XG4gICAgaWYgKHRoaXMuY3VycmVudCkge1xuICAgICAgdGhpcy5jdXJyZW50Lmxhc3RFdmVudCA9IGV2ZW50RGF0YTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnREYXRhLmV2ZW50VHlwZSA9PSBFVkVOVF9FTkQpIHtcbiAgICAgIHRoaXMuc3RvcERldGVjdCgpO1xuICAgIH1cblxuICAgIHJldHVybiBldmVudERhdGE7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgfSxcblxuICAvKipcbiAgICogY2xlYXIgdGhlIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlIHZhcnNcbiAgICogdGhpcyBpcyBjYWxsZWQgb24gZW5kRGV0ZWN0LCBidXQgY2FuIGFsc28gYmUgdXNlZCB3aGVuIGEgZmluYWwgR2VzdHVyZURldGVjdG9yLmdlc3R1cmUgaGFzIGJlZW4gZGV0ZWN0ZWRcbiAgICogdG8gc3RvcCBvdGhlciBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMgZnJvbSBiZWluZyBmaXJlZFxuICAgKi9cbiAgc3RvcERldGVjdDogZnVuY3Rpb24gc3RvcERldGVjdCgpIHtcbiAgICAvLyBjbG9uZSBjdXJyZW50IGRhdGEgdG8gdGhlIHN0b3JlIGFzIHRoZSBwcmV2aW91cyBnZXN0dXJlXG4gICAgLy8gdXNlZCBmb3IgdGhlIGRvdWJsZSB0YXAgZ2VzdHVyZSwgc2luY2UgdGhpcyBpcyBhbiBvdGhlciBnZXN0dXJlIGRldGVjdCBzZXNzaW9uXG4gICAgdGhpcy5wcmV2aW91cyA9IFV0aWxzLmV4dGVuZCh7fSwgdGhpcy5jdXJyZW50KTtcblxuICAgIC8vIHJlc2V0IHRoZSBjdXJyZW50XG4gICAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBjYWxjdWxhdGUgdmVsb2NpdHksIGFuZ2xlIGFuZCBkaXJlY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjZW50ZXJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhVGltZVxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsdGFYXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVlcbiAgICovXG4gIGdldENhbGN1bGF0ZWREYXRhOiBmdW5jdGlvbiBnZXRDYWxjdWxhdGVkRGF0YShldiwgY2VudGVyLCBkZWx0YVRpbWUsIGRlbHRhWCwgZGVsdGFZKSB7XG4gICAgdmFyIGN1ciA9IHRoaXMuY3VycmVudCxcbiAgICAgICAgcmVjYWxjID0gZmFsc2UsXG4gICAgICAgIGNhbGNFdiA9IGN1ci5sYXN0Q2FsY0V2ZW50LFxuICAgICAgICBjYWxjRGF0YSA9IGN1ci5sYXN0Q2FsY0RhdGE7XG5cbiAgICBpZiAoY2FsY0V2ICYmIGV2LnRpbWVTdGFtcCAtIGNhbGNFdi50aW1lU3RhbXAgPiBHZXN0dXJlRGV0ZWN0b3IuQ0FMQ1VMQVRFX0lOVEVSVkFMKSB7XG4gICAgICBjZW50ZXIgPSBjYWxjRXYuY2VudGVyO1xuICAgICAgZGVsdGFUaW1lID0gZXYudGltZVN0YW1wIC0gY2FsY0V2LnRpbWVTdGFtcDtcbiAgICAgIGRlbHRhWCA9IGV2LmNlbnRlci5jbGllbnRYIC0gY2FsY0V2LmNlbnRlci5jbGllbnRYO1xuICAgICAgZGVsdGFZID0gZXYuY2VudGVyLmNsaWVudFkgLSBjYWxjRXYuY2VudGVyLmNsaWVudFk7XG4gICAgICByZWNhbGMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChldi5ldmVudFR5cGUgPT0gRVZFTlRfVE9VQ0ggfHwgZXYuZXZlbnRUeXBlID09IEVWRU5UX1JFTEVBU0UpIHtcbiAgICAgIGN1ci5mdXR1cmVDYWxjRXZlbnQgPSBldjtcbiAgICB9XG5cbiAgICBpZiAoIWN1ci5sYXN0Q2FsY0V2ZW50IHx8IHJlY2FsYykge1xuICAgICAgY2FsY0RhdGEudmVsb2NpdHkgPSBVdGlscy5nZXRWZWxvY2l0eShkZWx0YVRpbWUsIGRlbHRhWCwgZGVsdGFZKTtcbiAgICAgIGNhbGNEYXRhLmFuZ2xlID0gVXRpbHMuZ2V0QW5nbGUoY2VudGVyLCBldi5jZW50ZXIpO1xuICAgICAgY2FsY0RhdGEuZGlyZWN0aW9uID0gVXRpbHMuZ2V0RGlyZWN0aW9uKGNlbnRlciwgZXYuY2VudGVyKTtcblxuICAgICAgY3VyLmxhc3RDYWxjRXZlbnQgPSBjdXIuZnV0dXJlQ2FsY0V2ZW50IHx8IGV2O1xuICAgICAgY3VyLmZ1dHVyZUNhbGNFdmVudCA9IGV2O1xuICAgIH1cblxuICAgIGV2LnZlbG9jaXR5WCA9IGNhbGNEYXRhLnZlbG9jaXR5Lng7XG4gICAgZXYudmVsb2NpdHlZID0gY2FsY0RhdGEudmVsb2NpdHkueTtcbiAgICBldi5pbnRlcmltQW5nbGUgPSBjYWxjRGF0YS5hbmdsZTtcbiAgICBldi5pbnRlcmltRGlyZWN0aW9uID0gY2FsY0RhdGEuZGlyZWN0aW9uO1xuICB9LFxuXG4gIC8qKlxuICAgKiBleHRlbmQgZXZlbnREYXRhIGZvciBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXNcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqIEByZXR1cm4ge09iamVjdH0gZXZcbiAgICovXG4gIGV4dGVuZEV2ZW50RGF0YTogZnVuY3Rpb24gZXh0ZW5kRXZlbnREYXRhKGV2KSB7XG4gICAgdmFyIGN1ciA9IHRoaXMuY3VycmVudCxcbiAgICAgICAgc3RhcnRFdiA9IGN1ci5zdGFydEV2ZW50LFxuICAgICAgICBsYXN0RXYgPSBjdXIubGFzdEV2ZW50IHx8IHN0YXJ0RXY7XG5cbiAgICAvLyB1cGRhdGUgdGhlIHN0YXJ0IHRvdWNobGlzdCB0byBjYWxjdWxhdGUgdGhlIHNjYWxlL3JvdGF0aW9uXG4gICAgaWYgKGV2LmV2ZW50VHlwZSA9PSBFVkVOVF9UT1VDSCB8fCBldi5ldmVudFR5cGUgPT0gRVZFTlRfUkVMRUFTRSkge1xuICAgICAgc3RhcnRFdi50b3VjaGVzID0gW107XG4gICAgICBVdGlscy5lYWNoKGV2LnRvdWNoZXMsIGZ1bmN0aW9uKHRvdWNoKSB7XG4gICAgICAgIHN0YXJ0RXYudG91Y2hlcy5wdXNoKHtcbiAgICAgICAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgICAgICAgIGNsaWVudFk6IHRvdWNoLmNsaWVudFlcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgZGVsdGFUaW1lID0gZXYudGltZVN0YW1wIC0gc3RhcnRFdi50aW1lU3RhbXAsXG4gICAgICAgIGRlbHRhWCA9IGV2LmNlbnRlci5jbGllbnRYIC0gc3RhcnRFdi5jZW50ZXIuY2xpZW50WCxcbiAgICAgICAgZGVsdGFZID0gZXYuY2VudGVyLmNsaWVudFkgLSBzdGFydEV2LmNlbnRlci5jbGllbnRZO1xuXG4gICAgdGhpcy5nZXRDYWxjdWxhdGVkRGF0YShldiwgbGFzdEV2LmNlbnRlciwgZGVsdGFUaW1lLCBkZWx0YVgsIGRlbHRhWSk7XG5cbiAgICBVdGlscy5leHRlbmQoZXYsIHtcbiAgICAgIHN0YXJ0RXZlbnQ6IHN0YXJ0RXYsXG5cbiAgICAgIGRlbHRhVGltZTogZGVsdGFUaW1lLFxuICAgICAgZGVsdGFYOiBkZWx0YVgsXG4gICAgICBkZWx0YVk6IGRlbHRhWSxcblxuICAgICAgZGlzdGFuY2U6IFV0aWxzLmdldERpc3RhbmNlKHN0YXJ0RXYuY2VudGVyLCBldi5jZW50ZXIpLFxuICAgICAgYW5nbGU6IFV0aWxzLmdldEFuZ2xlKHN0YXJ0RXYuY2VudGVyLCBldi5jZW50ZXIpLFxuICAgICAgZGlyZWN0aW9uOiBVdGlscy5nZXREaXJlY3Rpb24oc3RhcnRFdi5jZW50ZXIsIGV2LmNlbnRlciksXG4gICAgICBzY2FsZTogVXRpbHMuZ2V0U2NhbGUoc3RhcnRFdi50b3VjaGVzLCBldi50b3VjaGVzKSxcbiAgICAgIHJvdGF0aW9uOiBVdGlscy5nZXRSb3RhdGlvbihzdGFydEV2LnRvdWNoZXMsIGV2LnRvdWNoZXMpXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXY7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHJlZ2lzdGVyIG5ldyBnZXN0dXJlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBnZXN0dXJlIG9iamVjdCwgc2VlIGBnZXN0dXJlcy9gIGZvciBkb2N1bWVudGF0aW9uXG4gICAqIEByZXR1cm4ge0FycmF5fSBnZXN0dXJlc1xuICAgKi9cbiAgcmVnaXN0ZXI6IGZ1bmN0aW9uIHJlZ2lzdGVyKGdlc3R1cmUpIHtcbiAgICAvLyBhZGQgYW4gZW5hYmxlIGdlc3R1cmUgb3B0aW9ucyBpZiB0aGVyZSBpcyBubyBnaXZlblxuICAgIHZhciBvcHRpb25zID0gZ2VzdHVyZS5kZWZhdWx0cyB8fCB7fTtcbiAgICBpZiAob3B0aW9uc1tnZXN0dXJlLm5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG9wdGlvbnNbZ2VzdHVyZS5uYW1lXSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gZXh0ZW5kIEdlc3R1cmVEZXRlY3RvciBkZWZhdWx0IG9wdGlvbnMgd2l0aCB0aGUgR2VzdHVyZURldGVjdG9yLmdlc3R1cmUgb3B0aW9uc1xuICAgIFV0aWxzLmV4dGVuZChHZXN0dXJlRGV0ZWN0b3IuZGVmYXVsdHMsIG9wdGlvbnMsIHRydWUpO1xuXG4gICAgLy8gc2V0IGl0cyBpbmRleFxuICAgIGdlc3R1cmUuaW5kZXggPSBnZXN0dXJlLmluZGV4IHx8IDEwMDA7XG5cbiAgICAvLyBhZGQgR2VzdHVyZURldGVjdG9yLmdlc3R1cmUgdG8gdGhlIGxpc3RcbiAgICB0aGlzLmdlc3R1cmVzLnB1c2goZ2VzdHVyZSk7XG5cbiAgICAvLyBzb3J0IHRoZSBsaXN0IGJ5IGluZGV4XG4gICAgdGhpcy5nZXN0dXJlcy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgIGlmIChhLmluZGV4IDwgYi5pbmRleCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICBpZiAoYS5pbmRleCA+IGIuaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmdlc3R1cmVzO1xuICB9XG59O1xuXG5cbi8qKlxuICogQG1vZHVsZSBHZXN0dXJlRGV0ZWN0b3JcbiAqL1xuXG4vKipcbiAqIGNyZWF0ZSBuZXcgR2VzdHVyZURldGVjdG9yIGluc3RhbmNlXG4gKiBhbGwgbWV0aG9kcyBzaG91bGQgcmV0dXJuIHRoZSBpbnN0YW5jZSBpdHNlbGYsIHNvIGl0IGlzIGNoYWluYWJsZS5cbiAqXG4gKiBAY2xhc3MgSW5zdGFuY2VcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBvcHRpb25zIGFyZSBtZXJnZWQgd2l0aCBgR2VzdHVyZURldGVjdG9yLmRlZmF1bHRzYFxuICogQHJldHVybiB7R2VzdHVyZURldGVjdG9yLkluc3RhbmNlfVxuICovXG5HZXN0dXJlRGV0ZWN0b3IuSW5zdGFuY2UgPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGxpc3RlbmVyT3B0aW9ucyA9IChvcHRpb25zICYmIG9wdGlvbnMucGFzc2l2ZSkgPyB7IHBhc3NpdmU6IHRydWUgfSA6IHVuZGVmaW5lZDtcblxuICAvLyBzZXR1cCBHZXN0dXJlRGV0ZWN0b3JKUyB3aW5kb3cgZXZlbnRzIGFuZCByZWdpc3RlciBhbGwgZ2VzdHVyZXNcbiAgLy8gdGhpcyBhbHNvIHNldHMgdXAgdGhlIGRlZmF1bHQgb3B0aW9uc1xuICBzZXR1cChsaXN0ZW5lck9wdGlvbnMpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZWxlbWVudFxuICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAqL1xuICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZW5hYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuICAvKipcbiAgICogb3B0aW9ucywgbWVyZ2VkIHdpdGggdGhlIGRlZmF1bHRzXG4gICAqIG9wdGlvbnMgd2l0aCBhbiBfIGFyZSBjb252ZXJ0ZWQgdG8gY2FtZWxDYXNlXG4gICAqIEBwcm9wZXJ0eSBvcHRpb25zXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBVdGlscy5lYWNoKG9wdGlvbnMsIGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgZGVsZXRlIG9wdGlvbnNbbmFtZV07XG4gICAgb3B0aW9uc1tVdGlscy50b0NhbWVsQ2FzZShuYW1lKV0gPSB2YWx1ZTtcbiAgfSk7XG5cbiAgdGhpcy5vcHRpb25zID0gVXRpbHMuZXh0ZW5kKFV0aWxzLmV4dGVuZCh7fSwgR2VzdHVyZURldGVjdG9yLmRlZmF1bHRzKSwgb3B0aW9ucyB8fCB7fSk7XG4gIHRoaXMub3B0aW9ucy5saXN0ZW5lck9wdGlvbnMgPSBsaXN0ZW5lck9wdGlvbnM7XG5cbiAgLy8gYWRkIHNvbWUgY3NzIHRvIHRoZSBlbGVtZW50IHRvIHByZXZlbnQgdGhlIGJyb3dzZXIgZnJvbSBkb2luZyBpdHMgbmF0aXZlIGJlaGF2aW9yXG4gIGlmICh0aGlzLm9wdGlvbnMuYmVoYXZpb3IpIHtcbiAgICBVdGlscy50b2dnbGVCZWhhdmlvcih0aGlzLmVsZW1lbnQsIHRoaXMub3B0aW9ucy5iZWhhdmlvciwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogZXZlbnQgc3RhcnQgaGFuZGxlciBvbiB0aGUgZWxlbWVudCB0byBzdGFydCB0aGUgZGV0ZWN0aW9uXG4gICAqIEBwcm9wZXJ0eSBldmVudFN0YXJ0SGFuZGxlclxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgdGhpcy5ldmVudFN0YXJ0SGFuZGxlciA9IEV2ZW50Lm9uVG91Y2goZWxlbWVudCwgRVZFTlRfU1RBUlQsIGZ1bmN0aW9uKGV2KSB7XG4gICAgaWYgKHNlbGYuZW5hYmxlZCAmJiBldi5ldmVudFR5cGUgPT0gRVZFTlRfU1RBUlQpIHtcbiAgICAgIERldGVjdGlvbi5zdGFydERldGVjdChzZWxmLCBldik7XG4gICAgfSBlbHNlIGlmIChldi5ldmVudFR5cGUgPT0gRVZFTlRfVE9VQ0gpIHtcbiAgICAgIERldGVjdGlvbi5kZXRlY3QoZXYpO1xuICAgIH1cbiAgfSwgbGlzdGVuZXJPcHRpb25zKTtcblxuICAvKipcbiAgICoga2VlcCBhIGxpc3Qgb2YgdXNlciBldmVudCBoYW5kbGVycyB3aGljaCBuZWVkcyB0byBiZSByZW1vdmVkIHdoZW4gY2FsbGluZyAnZGlzcG9zZSdcbiAgICogQHByb3BlcnR5IGV2ZW50SGFuZGxlcnNcbiAgICogQHR5cGUge0FycmF5fVxuICAgKi9cbiAgdGhpcy5ldmVudEhhbmRsZXJzID0gW107XG59O1xuXG5HZXN0dXJlRGV0ZWN0b3IuSW5zdGFuY2UucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogQG1ldGhvZCBvblxuICAgKiBAc2lnbmF0dXJlIG9uKGdlc3R1cmVzLCBoYW5kbGVyKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1BZGRzIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGEgZ2VzdHVyZS4gQXZhaWxhYmxlIGdlc3R1cmVzIGFyZTogZHJhZywgZHJhZ2xlZnQsIGRyYWdyaWdodCwgZHJhZ3VwLCBkcmFnZG93biwgaG9sZCwgcmVsZWFzZSwgc3dpcGUsIHN3aXBlbGVmdCwgc3dpcGVyaWdodCwgc3dpcGV1cCwgc3dpcGVkb3duLCB0YXAsIGRvdWJsZXRhcCwgdG91Y2gsIHRyYW5zZm9ybSwgcGluY2gsIHBpbmNoaW4sIHBpbmNob3V0IGFuZCByb3RhdGUuIFsvZW5dXG4gICAqICBbamFd44K444Kn44K544OB44Oj44Gr5a++44GZ44KL44Kk44OZ44Oz44OI44OP44Oz44OJ44Op44KS6L+95Yqg44GX44G+44GZ44CC5oyH5a6a44Gn44GN44KL44K444Kn44K544OB44Oj5ZCN44Gv44CBZHJhZyBkcmFnbGVmdCBkcmFncmlnaHQgZHJhZ3VwIGRyYWdkb3duIGhvbGQgcmVsZWFzZSBzd2lwZSBzd2lwZWxlZnQgc3dpcGVyaWdodCBzd2lwZXVwIHN3aXBlZG93biB0YXAgZG91YmxldGFwIHRvdWNoIHRyYW5zZm9ybSBwaW5jaCBwaW5jaGluIHBpbmNob3V0IHJvdGF0ZSDjgafjgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZ2VzdHVyZXNcbiAgICogICBbZW5dQSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBnZXN0dXJlcy5bL2VuXVxuICAgKiAgIFtqYV3mpJznn6XjgZnjgovjgrjjgqfjgrnjg4Hjg6PlkI3jgpLmjIflrprjgZfjgb7jgZnjgILjgrnjg5rjg7zjgrnjgafopIfmlbDmjIflrprjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqICAgW2VuXUFuIGV2ZW50IGhhbmRsaW5nIGZ1bmN0aW9uLlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOODj+ODs+ODieODqeOBqOOBquOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBvbjogZnVuY3Rpb24gb25FdmVudChnZXN0dXJlcywgaGFuZGxlciwgb3B0KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgRXZlbnQub24oc2VsZi5lbGVtZW50LCBnZXN0dXJlcywgaGFuZGxlciwgdXRpbC5leHRlbmQoe30sIHNlbGYub3B0aW9ucy5saXN0ZW5lck9wdGlvbnMsIG9wdCksIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgIHNlbGYuZXZlbnRIYW5kbGVycy5wdXNoKHsgZ2VzdHVyZTogdHlwZSwgaGFuZGxlcjogaGFuZGxlciB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZjtcbiAgfSxcblxuICAvKipcbiAgICogQG1ldGhvZCBvZmZcbiAgICogQHNpZ25hdHVyZSBvZmYoZ2VzdHVyZXMsIGhhbmRsZXIpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVJlbW92ZSBhbiBldmVudCBsaXN0ZW5lci5bL2VuXVxuICAgKiAgW2phXeOCpOODmeODs+ODiOODquOCueODiuODvOOCkuWJiumZpOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBnZXN0dXJlc1xuICAgKiAgIFtlbl1BIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGdlc3R1cmVzLlsvZW5dXG4gICAqICAgW2phXeOCuOOCp+OCueODgeODo+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAguOCueODmuODvOOCueOBp+ikh+aVsOaMh+WumuOBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAgICogICBbZW5dQW4gZXZlbnQgaGFuZGxpbmcgZnVuY3Rpb24uWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44OP44Oz44OJ44Op44Go44Gq44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIG9mZjogZnVuY3Rpb24gb2ZmRXZlbnQoZ2VzdHVyZXMsIGhhbmRsZXIsIG9wdCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIEV2ZW50Lm9mZihzZWxmLmVsZW1lbnQsIGdlc3R1cmVzLCBoYW5kbGVyLCB1dGlsLmV4dGVuZCh7fSwgc2VsZi5vcHRpb25zLmxpc3RlbmVyT3B0aW9ucywgb3B0KSwgZnVuY3Rpb24odHlwZSkge1xuICAgICAgdmFyIGluZGV4ID0gVXRpbHMuaW5BcnJheShzZWxmLmV2ZW50SGFuZGxlcnMsIHsgZ2VzdHVyZTogdHlwZSwgaGFuZGxlcjogaGFuZGxlciB9LCB0cnVlKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHNlbGYuZXZlbnRIYW5kbGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzZWxmO1xuICB9LFxuXG4gIC8qKlxuICAgKiB0cmlnZ2VyIGdlc3R1cmUgZXZlbnRcbiAgICogQG1ldGhvZCB0cmlnZ2VyXG4gICAqIEBzaWduYXR1cmUgdHJpZ2dlcihnZXN0dXJlLCBldmVudERhdGEpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBnZXN0dXJlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbZXZlbnREYXRhXVxuICAgKi9cbiAgdHJpZ2dlcjogZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGdlc3R1cmUsIGV2ZW50RGF0YSkge1xuICAgIC8vIG9wdGlvbmFsXG4gICAgaWYgKCFldmVudERhdGEpIHtcbiAgICAgIGV2ZW50RGF0YSA9IHt9O1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBET00gZXZlbnRcbiAgICB2YXIgZXZlbnQgPSBHZXN0dXJlRGV0ZWN0b3IuRE9DVU1FTlQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZlbnQuaW5pdEV2ZW50KGdlc3R1cmUsIHRydWUsIHRydWUpO1xuICAgIGV2ZW50Lmdlc3R1cmUgPSBldmVudERhdGE7XG5cbiAgICAvLyB0cmlnZ2VyIG9uIHRoZSB0YXJnZXQgaWYgaXQgaXMgaW4gdGhlIGluc3RhbmNlIGVsZW1lbnQsXG4gICAgLy8gdGhpcyBpcyBmb3IgZXZlbnQgZGVsZWdhdGlvbiB0cmlja3NcbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuZWxlbWVudDtcbiAgICBpZiAoVXRpbHMuaGFzUGFyZW50KGV2ZW50RGF0YS50YXJnZXQsIGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50ID0gZXZlbnREYXRhLnRhcmdldDtcbiAgICB9XG5cbiAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGVuYWJsZVxuICAgKiBAc2lnbmF0dXJlIGVuYWJsZShzdGF0ZSlcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dRW5hYmxlIG9yIGRpc2FibGUgZ2VzdHVyZSBkZXRlY3Rpb24uWy9lbl1cbiAgICogIFtqYV3jgrjjgqfjgrnjg4Hjg6PmpJznn6XjgpLmnInlirnljJYv54Sh5Yq55YyW44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBzdGF0ZVxuICAgKiAgIFtlbl1TcGVjaWZ5IGlmIGl0IHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3mnInlirnjgavjgZnjgovjgYvjganjgYbjgYvjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgZW5hYmxlOiBmdW5jdGlvbiBlbmFibGUoc3RhdGUpIHtcbiAgICB0aGlzLmVuYWJsZWQgPSBzdGF0ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcblxuICAvKipcbiAgICogQG1ldGhvZCBkaXNwb3NlXG4gICAqIEBzaWduYXR1cmUgZGlzcG9zZSgpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVJlbW92ZSBhbmQgZGVzdHJveSBhbGwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoaXMgaW5zdGFuY2UuWy9lbl1cbiAgICogIFtqYV3jgZPjga7jgqTjg7Pjgrnjgr/jg7Pjgrnjgafjga7jgrjjgqfjgrnjg4Hjg6Pjga7mpJznn6XjgoTjgIHjgqTjg5njg7Pjg4jjg4/jg7Pjg4njg6njgpLlhajjgabop6PpmaTjgZfjgablu4Pmo4TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgZGlzcG9zZTogZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICB2YXIgaSwgZWg7XG5cbiAgICAvLyB1bmRvIGFsbCBjaGFuZ2VzIG1hZGUgYnkgc3RvcF9icm93c2VyX2JlaGF2aW9yXG4gICAgVXRpbHMudG9nZ2xlQmVoYXZpb3IodGhpcy5lbGVtZW50LCB0aGlzLm9wdGlvbnMuYmVoYXZpb3IsIGZhbHNlKTtcblxuICAgIC8vIHVuYmluZCBhbGwgY3VzdG9tIGV2ZW50IGhhbmRsZXJzXG4gICAgZm9yIChpID0gLTE7IChlaCA9IHRoaXMuZXZlbnRIYW5kbGVyc1srK2ldKTspIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25kLWFzc2lnblxuICAgICAgVXRpbHMub2ZmKHRoaXMuZWxlbWVudCwgZWguZ2VzdHVyZSwgZWguaGFuZGxlcik7XG4gICAgfVxuXG4gICAgdGhpcy5ldmVudEhhbmRsZXJzID0gW107XG5cbiAgICAvLyB1bmJpbmQgdGhlIHN0YXJ0IGV2ZW50IGxpc3RlbmVyXG4gICAgRXZlbnQub2ZmKHRoaXMuZWxlbWVudCwgRVZFTlRfVFlQRVNbRVZFTlRfU1RBUlRdLCB0aGlzLmV2ZW50U3RhcnRIYW5kbGVyKTtcblxuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5cbi8qKlxuICogQG1vZHVsZSBnZXN0dXJlc1xuICovXG4vKipcbiAqIE1vdmUgd2l0aCB4IGZpbmdlcnMgKGRlZmF1bHQgMSkgYXJvdW5kIG9uIHRoZSBwYWdlLlxuICogUHJldmVudGluZyB0aGUgZGVmYXVsdCBicm93c2VyIGJlaGF2aW9yIGlzIGEgZ29vZCB3YXkgdG8gaW1wcm92ZSBmZWVsIGFuZCB3b3JraW5nLlxuICogYGBgYFxuICogIEdlc3R1cmVEZXRlY3RvcnRpbWUub24oXCJkcmFnXCIsIGZ1bmN0aW9uKGV2KSB7XG4gKiAgICBjb25zb2xlLmxvZyhldik7XG4gKiAgICBldi5nZXN0dXJlLnByZXZlbnREZWZhdWx0KCk7XG4gKiAgfSk7XG4gKiBgYGBgXG4gKlxuICogQGNsYXNzIERyYWdcbiAqIEBzdGF0aWNcbiAqL1xuLyoqXG4gKiBAZXZlbnQgZHJhZ1xuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKi9cbi8qKlxuICogQGV2ZW50IGRyYWdzdGFydFxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKi9cbi8qKlxuICogQGV2ZW50IGRyYWdlbmRcbiAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICovXG4vKipcbiAqIEBldmVudCBkcmFwbGVmdFxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKi9cbi8qKlxuICogQGV2ZW50IGRyYWdyaWdodFxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKi9cbi8qKlxuICogQGV2ZW50IGRyYWd1cFxuICogQHBhcmFtIHtPYmplY3R9IGV2XG4gKi9cbi8qKlxuICogQGV2ZW50IGRyYWdkb3duXG4gKiBAcGFyYW0ge09iamVjdH0gZXZcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKi9cbihmdW5jdGlvbihuYW1lKSB7XG4gIHZhciB0cmlnZ2VyZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBkcmFnR2VzdHVyZShldiwgaW5zdCkge1xuICAgIHZhciBjdXIgPSBEZXRlY3Rpb24uY3VycmVudDtcblxuICAgIC8vIG1heCB0b3VjaGVzXG4gICAgaWYgKGluc3Qub3B0aW9ucy5kcmFnTWF4VG91Y2hlcyA+IDAgJiZcbiAgICAgIGV2LnRvdWNoZXMubGVuZ3RoID4gaW5zdC5vcHRpb25zLmRyYWdNYXhUb3VjaGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChldi5ldmVudFR5cGUpIHtcbiAgICBjYXNlIEVWRU5UX1NUQVJUOlxuICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgRVZFTlRfTU9WRTpcbiAgICAgIC8vIHdoZW4gdGhlIGRpc3RhbmNlIHdlIG1vdmVkIGlzIHRvbyBzbWFsbCB3ZSBza2lwIHRoaXMgZ2VzdHVyZVxuICAgICAgLy8gb3Igd2UgY2FuIGJlIGFscmVhZHkgaW4gZHJhZ2dpbmdcbiAgICAgIGlmIChldi5kaXN0YW5jZSA8IGluc3Qub3B0aW9ucy5kcmFnTWluRGlzdGFuY2UgJiZcbiAgICAgICAgY3VyLm5hbWUgIT0gbmFtZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBzdGFydENlbnRlciA9IGN1ci5zdGFydEV2ZW50LmNlbnRlcjtcblxuICAgICAgLy8gd2UgYXJlIGRyYWdnaW5nIVxuICAgICAgaWYgKGN1ci5uYW1lICE9IG5hbWUpIHtcbiAgICAgICAgY3VyLm5hbWUgPSBuYW1lO1xuICAgICAgICBpZiAoaW5zdC5vcHRpb25zLmRyYWdEaXN0YW5jZUNvcnJlY3Rpb24gJiYgZXYuZGlzdGFuY2UgPiAwKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIGRyYWcgaXMgdHJpZ2dlcmVkLCBzZXQgdGhlIGV2ZW50IGNlbnRlciB0byBkcmFnTWluRGlzdGFuY2UgcGl4ZWxzIGZyb20gdGhlIG9yaWdpbmFsIGV2ZW50IGNlbnRlci5cbiAgICAgICAgICAvLyBXaXRob3V0IHRoaXMgY29ycmVjdGlvbiwgdGhlIGRyYWdnZWQgZGlzdGFuY2Ugd291bGQganVtcHN0YXJ0IGF0IGRyYWdNaW5EaXN0YW5jZSBwaXhlbHMgaW5zdGVhZCBvZiBhdCAwLlxuICAgICAgICAgIC8vIEl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBzYXZlIHRoZSBvcmlnaW5hbCBzdGFydCBwb2ludCBzb21ld2hlcmVcbiAgICAgICAgICB2YXIgZmFjdG9yID0gTWF0aC5hYnMoaW5zdC5vcHRpb25zLmRyYWdNaW5EaXN0YW5jZSAvIGV2LmRpc3RhbmNlKTtcbiAgICAgICAgICBzdGFydENlbnRlci5wYWdlWCArPSBldi5kZWx0YVggKiBmYWN0b3I7XG4gICAgICAgICAgc3RhcnRDZW50ZXIucGFnZVkgKz0gZXYuZGVsdGFZICogZmFjdG9yO1xuICAgICAgICAgIHN0YXJ0Q2VudGVyLmNsaWVudFggKz0gZXYuZGVsdGFYICogZmFjdG9yO1xuICAgICAgICAgIHN0YXJ0Q2VudGVyLmNsaWVudFkgKz0gZXYuZGVsdGFZICogZmFjdG9yO1xuXG4gICAgICAgICAgLy8gcmVjYWxjdWxhdGUgZXZlbnQgZGF0YSB1c2luZyBuZXcgc3RhcnQgcG9pbnRcbiAgICAgICAgICBldiA9IERldGVjdGlvbi5leHRlbmRFdmVudERhdGEoZXYpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGxvY2sgZHJhZyB0byBheGlzP1xuICAgICAgaWYgKGN1ci5sYXN0RXZlbnQuZHJhZ0xvY2tUb0F4aXMgfHxcbiAgICAgICAgKCBpbnN0Lm9wdGlvbnMuZHJhZ0xvY2tUb0F4aXMgJiZcbiAgICAgICAgICBpbnN0Lm9wdGlvbnMuZHJhZ0xvY2tNaW5EaXN0YW5jZSA8PSBldi5kaXN0YW5jZVxuICAgICAgICApKSB7XG4gICAgICAgICAgZXYuZHJhZ0xvY2tUb0F4aXMgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8ga2VlcCBkaXJlY3Rpb24gb24gdGhlIGF4aXMgdGhhdCB0aGUgZHJhZyBnZXN0dXJlIHN0YXJ0ZWQgb25cbiAgICAgICAgdmFyIGxhc3REaXJlY3Rpb24gPSBjdXIubGFzdEV2ZW50LmRpcmVjdGlvbjtcbiAgICAgICAgaWYgKGV2LmRyYWdMb2NrVG9BeGlzICYmIGxhc3REaXJlY3Rpb24gIT09IGV2LmRpcmVjdGlvbikge1xuICAgICAgICAgIGlmIChVdGlscy5pc1ZlcnRpY2FsKGxhc3REaXJlY3Rpb24pKSB7XG4gICAgICAgICAgICBldi5kaXJlY3Rpb24gPSAoZXYuZGVsdGFZIDwgMCkgPyBESVJFQ1RJT05fVVAgOiBESVJFQ1RJT05fRE9XTjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXYuZGlyZWN0aW9uID0gKGV2LmRlbHRhWCA8IDApID8gRElSRUNUSU9OX0xFRlQgOiBESVJFQ1RJT05fUklHSFQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlyc3QgdGltZSwgdHJpZ2dlciBkcmFnc3RhcnQgZXZlbnRcbiAgICAgICAgaWYgKCF0cmlnZ2VyZWQpIHtcbiAgICAgICAgICBpbnN0LnRyaWdnZXIobmFtZSArICdzdGFydCcsIGV2KTtcbiAgICAgICAgICB0cmlnZ2VyZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdHJpZ2dlciBldmVudHNcbiAgICAgICAgaW5zdC50cmlnZ2VyKG5hbWUsIGV2KTtcbiAgICAgICAgaW5zdC50cmlnZ2VyKG5hbWUgKyBldi5kaXJlY3Rpb24sIGV2KTtcblxuICAgICAgICB2YXIgaXNWZXJ0aWNhbCA9IFV0aWxzLmlzVmVydGljYWwoZXYuZGlyZWN0aW9uKTtcblxuICAgICAgICAvLyBibG9jayB0aGUgYnJvd3NlciBldmVudHNcbiAgICAgICAgaWYgKChpbnN0Lm9wdGlvbnMuZHJhZ0Jsb2NrVmVydGljYWwgJiYgaXNWZXJ0aWNhbCkgfHxcbiAgICAgICAgICAoaW5zdC5vcHRpb25zLmRyYWdCbG9ja0hvcml6b250YWwgJiYgIWlzVmVydGljYWwpKSB7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBFVkVOVF9SRUxFQVNFOlxuICAgICAgICBpZiAodHJpZ2dlcmVkICYmIGV2LmNoYW5nZWRMZW5ndGggPD0gaW5zdC5vcHRpb25zLmRyYWdNYXhUb3VjaGVzKSB7XG4gICAgICAgICAgaW5zdC50cmlnZ2VyKG5hbWUgKyAnZW5kJywgZXYpO1xuICAgICAgICAgIHRyaWdnZXJlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEVWRU5UX0VORDpcbiAgICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5EcmFnID0ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGluZGV4OiA1MCxcbiAgICAgIGhhbmRsZXI6IGRyYWdHZXN0dXJlLFxuICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIG1pbmltYWwgbW92ZW1lbnQgdGhhdCBoYXZlIHRvIGJlIG1hZGUgYmVmb3JlIHRoZSBkcmFnIGV2ZW50IGdldHMgdHJpZ2dlcmVkXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkcmFnTWluRGlzdGFuY2VcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMTBcbiAgICAgICAgICovXG4gICAgICAgIGRyYWdNaW5EaXN0YW5jZTogMTAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNldCBkcmFnRGlzdGFuY2VDb3JyZWN0aW9uIHRvIHRydWUgdG8gbWFrZSB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIGRyYWdcbiAgICAgICAgICogYmUgY2FsY3VsYXRlZCBmcm9tIHdoZXJlIHRoZSBkcmFnIHdhcyB0cmlnZ2VyZWQsIG5vdCBmcm9tIHdoZXJlIHRoZSB0b3VjaCBzdGFydGVkLlxuICAgICAgICAgKiBVc2VmdWwgdG8gYXZvaWQgYSBqZXJrLXN0YXJ0aW5nIGRyYWcsIHdoaWNoIGNhbiBtYWtlIGZpbmUtYWRqdXN0bWVudHNcbiAgICAgICAgICogdGhyb3VnaCBkcmFnZ2luZyBkaWZmaWN1bHQsIGFuZCBiZSB2aXN1YWxseSB1bmFwcGVhbGluZy5cbiAgICAgICAgICogQHByb3BlcnR5IGRyYWdEaXN0YW5jZUNvcnJlY3Rpb25cbiAgICAgICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAgICovXG4gICAgICAgIGRyYWdEaXN0YW5jZUNvcnJlY3Rpb246IHRydWUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHNldCAwIGZvciB1bmxpbWl0ZWQsIGJ1dCB0aGlzIGNhbiBjb25mbGljdCB3aXRoIHRyYW5zZm9ybVxuICAgICAgICAgKiBAcHJvcGVydHkgZHJhZ01heFRvdWNoZXNcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICAgKi9cbiAgICAgICAgZHJhZ01heFRvdWNoZXM6IDEsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHByZXZlbnQgZGVmYXVsdCBicm93c2VyIGJlaGF2aW9yIHdoZW4gZHJhZ2dpbmcgb2NjdXJzXG4gICAgICAgICAqIGJlIGNhcmVmdWwgd2l0aCBpdCwgaXQgbWFrZXMgdGhlIGVsZW1lbnQgYSBibG9ja2luZyBlbGVtZW50XG4gICAgICAgICAqIHdoZW4geW91IGFyZSB1c2luZyB0aGUgZHJhZyBnZXN0dXJlLCBpdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gc2V0IHRoaXMgdHJ1ZVxuICAgICAgICAgKiBAcHJvcGVydHkgZHJhZ0Jsb2NrSG9yaXpvbnRhbFxuICAgICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgICovXG4gICAgICAgIGRyYWdCbG9ja0hvcml6b250YWw6IGZhbHNlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBzYW1lIGFzIGBkcmFnQmxvY2tIb3Jpem9udGFsYCwgYnV0IGZvciB2ZXJ0aWNhbCBtb3ZlbWVudFxuICAgICAgICAgKiBAcHJvcGVydHkgZHJhZ0Jsb2NrVmVydGljYWxcbiAgICAgICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICAqL1xuICAgICAgICBkcmFnQmxvY2tWZXJ0aWNhbDogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGRyYWdMb2NrVG9BeGlzIGtlZXBzIHRoZSBkcmFnIGdlc3R1cmUgb24gdGhlIGF4aXMgdGhhdCBpdCBzdGFydGVkIG9uLFxuICAgICAgICAgKiBJdCBkaXNhbGxvd3MgdmVydGljYWwgZGlyZWN0aW9ucyBpZiB0aGUgaW5pdGlhbCBkaXJlY3Rpb24gd2FzIGhvcml6b250YWwsIGFuZCB2aWNlIHZlcnNhLlxuICAgICAgICAgKiBAcHJvcGVydHkgZHJhZ0xvY2tUb0F4aXNcbiAgICAgICAgICogQHR5cGUge0Jvb2xlYW59XG4gICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICAqL1xuICAgICAgICBkcmFnTG9ja1RvQXhpczogZmFsc2UsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGRyYWcgbG9jayBvbmx5IGtpY2tzIGluIHdoZW4gZGlzdGFuY2UgPiBkcmFnTG9ja01pbkRpc3RhbmNlXG4gICAgICAgICAqIFRoaXMgd2F5LCBsb2NraW5nIG9jY3VycyBvbmx5IHdoZW4gdGhlIGRpc3RhbmNlIGhhcyBiZWNvbWUgbGFyZ2UgZW5vdWdoIHRvIHJlbGlhYmx5IGRldGVybWluZSB0aGUgZGlyZWN0aW9uXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkcmFnTG9ja01pbkRpc3RhbmNlXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDI1XG4gICAgICAgICAqL1xuICAgICAgICBkcmFnTG9ja01pbkRpc3RhbmNlOiAyNVxuICAgICAgfVxuICAgIH07XG4gIH0pKCdkcmFnJyk7XG5cbiAgLyoqXG4gICAqIEBtb2R1bGUgZ2VzdHVyZXNcbiAgICovXG4gIC8qKlxuICAgKiB0cmlnZ2VyIGEgc2ltcGxlIGdlc3R1cmUgZXZlbnQsIHNvIHlvdSBjYW4gZG8gYW55dGhpbmcgaW4geW91ciBoYW5kbGVyLlxuICAgKiBvbmx5IHVzYWJsZSBpZiB5b3Uga25vdyB3aGF0IHlvdXIgZG9pbmcuLi5cbiAgICpcbiAgICogQGNsYXNzIEdlc3R1cmVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBnZXN0dXJlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgR2VzdHVyZURldGVjdG9yLmdlc3R1cmVzLkdlc3R1cmUgPSB7XG4gICAgbmFtZTogJ2dlc3R1cmUnLFxuICAgIGluZGV4OiAxMzM3LFxuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIHJlbGVhc2VHZXN0dXJlKGV2LCBpbnN0KSB7XG4gICAgICBpbnN0LnRyaWdnZXIodGhpcy5uYW1lLCBldik7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAbW9kdWxlIGdlc3R1cmVzXG4gICAqL1xuICAvKipcbiAgICogVG91Y2ggc3RheXMgYXQgdGhlIHNhbWUgcGxhY2UgZm9yIHggdGltZVxuICAgKlxuICAgKiBAY2xhc3MgSG9sZFxuICAgKiBAc3RhdGljXG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IGhvbGRcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKi9cbiAgKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgdGltZXI7XG5cbiAgICBmdW5jdGlvbiBob2xkR2VzdHVyZShldiwgaW5zdCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBpbnN0Lm9wdGlvbnMsXG4gICAgICAgICAgY3VycmVudCA9IERldGVjdGlvbi5jdXJyZW50O1xuXG4gICAgICBzd2l0Y2ggKGV2LmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSBFVkVOVF9TVEFSVDpcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcblxuICAgICAgICAvLyBzZXQgdGhlIGdlc3R1cmUgc28gd2UgY2FuIGNoZWNrIGluIHRoZSB0aW1lb3V0IGlmIGl0IHN0aWxsIGlzXG4gICAgICAgIGN1cnJlbnQubmFtZSA9IG5hbWU7XG5cbiAgICAgICAgLy8gc2V0IHRpbWVyIGFuZCBpZiBhZnRlciB0aGUgdGltZW91dCBpdCBzdGlsbCBpcyBob2xkLFxuICAgICAgICAvLyB3ZSB0cmlnZ2VyIHRoZSBob2xkIGV2ZW50XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50Lm5hbWUgPT0gbmFtZSkge1xuICAgICAgICAgICAgaW5zdC50cmlnZ2VyKG5hbWUsIGV2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIG9wdGlvbnMuaG9sZFRpbWVvdXQpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBFVkVOVF9NT1ZFOlxuICAgICAgICBpZiAoZXYuZGlzdGFuY2UgPiBvcHRpb25zLmhvbGRUaHJlc2hvbGQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEVWRU5UX1JFTEVBU0U6XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5Ib2xkID0ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGluZGV4OiAxMCxcbiAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJvcGVydHkgaG9sZFRpbWVvdXRcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgNTAwXG4gICAgICAgICAqL1xuICAgICAgICBob2xkVGltZW91dDogNTAwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBtb3ZlbWVudCBhbGxvd2VkIHdoaWxlIGhvbGRpbmdcbiAgICAgICAgICogQHByb3BlcnR5IGhvbGRUaHJlc2hvbGRcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMlxuICAgICAgICAgKi9cbiAgICAgICAgaG9sZFRocmVzaG9sZDogMlxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IGhvbGRHZXN0dXJlXG4gICAgfTtcbiAgfSkoJ2hvbGQnKTtcblxuICAvKipcbiAgICogQG1vZHVsZSBnZXN0dXJlc1xuICAgKi9cbiAgLyoqXG4gICAqIHdoZW4gYSB0b3VjaCBpcyBiZWluZyByZWxlYXNlZCBmcm9tIHRoZSBwYWdlXG4gICAqXG4gICAqIEBjbGFzcyBSZWxlYXNlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgcmVsZWFzZVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5SZWxlYXNlID0ge1xuICAgIG5hbWU6ICdyZWxlYXNlJyxcbiAgICBpbmRleDogSW5maW5pdHksXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gcmVsZWFzZUdlc3R1cmUoZXYsIGluc3QpIHtcbiAgICAgIGlmIChldi5ldmVudFR5cGUgPT0gRVZFTlRfUkVMRUFTRSkge1xuICAgICAgICBpbnN0LnRyaWdnZXIodGhpcy5uYW1lLCBldik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAbW9kdWxlIGdlc3R1cmVzXG4gICAqL1xuICAvKipcbiAgICogdHJpZ2dlcnMgc3dpcGUgZXZlbnRzIHdoZW4gdGhlIGVuZCB2ZWxvY2l0eSBpcyBhYm92ZSB0aGUgdGhyZXNob2xkXG4gICAqIGZvciBiZXN0IHVzYWdlLCBzZXQgYHByZXZlbnREZWZhdWx0YCAob24gdGhlIGRyYWcgZ2VzdHVyZSkgdG8gYHRydWVgXG4gICAqIGBgYGBcbiAgICogIEdlc3R1cmVEZXRlY3RvcnRpbWUub24oXCJkcmFnbGVmdCBzd2lwZWxlZnRcIiwgZnVuY3Rpb24oZXYpIHtcbiAgICogICAgY29uc29sZS5sb2coZXYpO1xuICAgKiAgICBldi5nZXN0dXJlLnByZXZlbnREZWZhdWx0KCk7XG4gICAqICB9KTtcbiAgICogYGBgYFxuICAgKlxuICAgKiBAY2xhc3MgU3dpcGVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBzd2lwZVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgc3dpcGVsZWZ0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBzd2lwZXJpZ2h0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBzd2lwZXVwXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBzd2lwZWRvd25cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMuU3dpcGUgPSB7XG4gICAgbmFtZTogJ3N3aXBlJyxcbiAgICBpbmRleDogNDAsXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgIC8qKlxuICAgICAgICogQHByb3BlcnR5IHN3aXBlTWluVG91Y2hlc1xuICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAqIEBkZWZhdWx0IDFcbiAgICAgICAqL1xuICAgICAgc3dpcGVNaW5Ub3VjaGVzOiAxLFxuXG4gICAgICAvKipcbiAgICAgICAqIEBwcm9wZXJ0eSBzd2lwZU1heFRvdWNoZXNcbiAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgKiBAZGVmYXVsdCAxXG4gICAgICAgKi9cbiAgICAgIHN3aXBlTWF4VG91Y2hlczogMSxcblxuICAgICAgLyoqXG4gICAgICAgKiBob3Jpem9udGFsIHN3aXBlIHZlbG9jaXR5XG4gICAgICAgKiBAcHJvcGVydHkgc3dpcGVWZWxvY2l0eVhcbiAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgKiBAZGVmYXVsdCAwLjZcbiAgICAgICAqL1xuICAgICAgc3dpcGVWZWxvY2l0eVg6IDAuNixcblxuICAgICAgLyoqXG4gICAgICAgKiB2ZXJ0aWNhbCBzd2lwZSB2ZWxvY2l0eVxuICAgICAgICogQHByb3BlcnR5IHN3aXBlVmVsb2NpdHlZXG4gICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICogQGRlZmF1bHQgMC42XG4gICAgICAgKi9cbiAgICAgIHN3aXBlVmVsb2NpdHlZOiAwLjZcbiAgICB9LFxuXG4gICAgaGFuZGxlcjogZnVuY3Rpb24gc3dpcGVHZXN0dXJlKGV2LCBpbnN0KSB7XG4gICAgICBpZiAoZXYuZXZlbnRUeXBlID09IEVWRU5UX1JFTEVBU0UpIHtcbiAgICAgICAgdmFyIHRvdWNoZXMgPSBldi50b3VjaGVzLmxlbmd0aCxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBpbnN0Lm9wdGlvbnM7XG5cbiAgICAgICAgLy8gbWF4IHRvdWNoZXNcbiAgICAgICAgaWYgKHRvdWNoZXMgPCBvcHRpb25zLnN3aXBlTWluVG91Y2hlcyB8fFxuICAgICAgICAgIHRvdWNoZXMgPiBvcHRpb25zLnN3aXBlTWF4VG91Y2hlcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gdGhlIGRpc3RhbmNlIHdlIG1vdmVkIGlzIHRvbyBzbWFsbCB3ZSBza2lwIHRoaXMgZ2VzdHVyZVxuICAgICAgICAvLyBvciB3ZSBjYW4gYmUgYWxyZWFkeSBpbiBkcmFnZ2luZ1xuICAgICAgICBpZiAoZXYudmVsb2NpdHlYID4gb3B0aW9ucy5zd2lwZVZlbG9jaXR5WCB8fFxuICAgICAgICAgIGV2LnZlbG9jaXR5WSA+IG9wdGlvbnMuc3dpcGVWZWxvY2l0eVkpIHtcbiAgICAgICAgICAvLyB0cmlnZ2VyIHN3aXBlIGV2ZW50c1xuICAgICAgICAgIGluc3QudHJpZ2dlcih0aGlzLm5hbWUsIGV2KTtcbiAgICAgICAgICBpbnN0LnRyaWdnZXIodGhpcy5uYW1lICsgZXYuZGlyZWN0aW9uLCBldik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEBtb2R1bGUgZ2VzdHVyZXNcbiAgICovXG4gIC8qKlxuICAgKiBTaW5nbGUgdGFwIGFuZCBhIGRvdWJsZSB0YXAgb24gYSBwbGFjZVxuICAgKlxuICAgKiBAY2xhc3MgVGFwXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIC8qKlxuICAgKiBAZXZlbnQgdGFwXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCBkb3VibGV0YXBcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKi9cbiAgKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaGFzTW92ZWQgPSBmYWxzZTtcblxuICAgIGZ1bmN0aW9uIHRhcEdlc3R1cmUoZXYsIGluc3QpIHtcbiAgICAgIHZhciBvcHRpb25zID0gaW5zdC5vcHRpb25zLFxuICAgICAgICAgIGN1cnJlbnQgPSBEZXRlY3Rpb24uY3VycmVudCxcbiAgICAgICAgICBwcmV2ID0gRGV0ZWN0aW9uLnByZXZpb3VzLFxuICAgICAgICAgIHNpbmNlUHJldixcbiAgICAgICAgICBkaWREb3VibGVUYXA7XG5cbiAgICAgIHN3aXRjaCAoZXYuZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlIEVWRU5UX1NUQVJUOlxuICAgICAgICBoYXNNb3ZlZCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBFVkVOVF9NT1ZFOlxuICAgICAgICBoYXNNb3ZlZCA9IGhhc01vdmVkIHx8IChldi5kaXN0YW5jZSA+IG9wdGlvbnMudGFwTWF4RGlzdGFuY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBFVkVOVF9FTkQ6XG4gICAgICAgIGlmICghVXRpbHMuaW5TdHIoZXYuc3JjRXZlbnQudHlwZSwgJ2NhbmNlbCcpICYmIGV2LmRlbHRhVGltZSA8IG9wdGlvbnMudGFwTWF4VGltZSAmJiAhaGFzTW92ZWQpIHtcbiAgICAgICAgICAvLyBwcmV2aW91cyBnZXN0dXJlLCBmb3IgdGhlIGRvdWJsZSB0YXAgc2luY2UgdGhlc2UgYXJlIHR3byBkaWZmZXJlbnQgZ2VzdHVyZSBkZXRlY3Rpb25zXG4gICAgICAgICAgc2luY2VQcmV2ID0gcHJldiAmJiBwcmV2Lmxhc3RFdmVudCAmJiBldi50aW1lU3RhbXAgLSBwcmV2Lmxhc3RFdmVudC50aW1lU3RhbXA7XG4gICAgICAgICAgZGlkRG91YmxlVGFwID0gZmFsc2U7XG5cbiAgICAgICAgICAvLyBjaGVjayBpZiBkb3VibGUgdGFwXG4gICAgICAgICAgaWYgKHByZXYgJiYgcHJldi5uYW1lID09IG5hbWUgJiZcbiAgICAgICAgICAgIChzaW5jZVByZXYgJiYgc2luY2VQcmV2IDwgb3B0aW9ucy5kb3VibGVUYXBJbnRlcnZhbCkgJiZcbiAgICAgICAgICAgIGV2LmRpc3RhbmNlIDwgb3B0aW9ucy5kb3VibGVUYXBEaXN0YW5jZSkge1xuICAgICAgICAgICAgaW5zdC50cmlnZ2VyKCdkb3VibGV0YXAnLCBldik7XG4gICAgICAgICAgICBkaWREb3VibGVUYXAgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGRvIGEgc2luZ2xlIHRhcFxuICAgICAgICAgIGlmICghZGlkRG91YmxlVGFwIHx8IG9wdGlvbnMudGFwQWx3YXlzKSB7XG4gICAgICAgICAgICBjdXJyZW50Lm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgaW5zdC50cmlnZ2VyKGN1cnJlbnQubmFtZSwgZXYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMuVGFwID0ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGluZGV4OiAxMDAsXG4gICAgICBoYW5kbGVyOiB0YXBHZXN0dXJlLFxuICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIG1heCB0aW1lIG9mIGEgdGFwLCB0aGlzIGlzIGZvciB0aGUgc2xvdyB0YXBwZXJzXG4gICAgICAgICAqIEBwcm9wZXJ0eSB0YXBNYXhUaW1lXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDI1MFxuICAgICAgICAgKi9cbiAgICAgICAgdGFwTWF4VGltZTogMjUwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBtYXggZGlzdGFuY2Ugb2YgbW92ZW1lbnQgb2YgYSB0YXAsIHRoaXMgaXMgZm9yIHRoZSBzbG93IHRhcHBlcnNcbiAgICAgICAgICogQHByb3BlcnR5IHRhcE1heERpc3RhbmNlXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICAgICAqL1xuICAgICAgICB0YXBNYXhEaXN0YW5jZTogMTAsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFsd2F5cyB0cmlnZ2VyIHRoZSBgdGFwYCBldmVudCwgZXZlbiB3aGlsZSBkb3VibGUtdGFwcGluZ1xuICAgICAgICAgKiBAcHJvcGVydHkgdGFwQWx3YXlzXG4gICAgICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgICAqL1xuICAgICAgICB0YXBBbHdheXM6IHRydWUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIG1heCBkaXN0YW5jZSBiZXR3ZWVuIHR3byB0YXBzXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkb3VibGVUYXBEaXN0YW5jZVxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAyMFxuICAgICAgICAgKi9cbiAgICAgICAgZG91YmxlVGFwRGlzdGFuY2U6IDIwLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBtYXggdGltZSBiZXR3ZWVuIHR3byB0YXBzXG4gICAgICAgICAqIEBwcm9wZXJ0eSBkb3VibGVUYXBJbnRlcnZhbFxuICAgICAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAgICAgKiBAZGVmYXVsdCAzMDBcbiAgICAgICAgICovXG4gICAgICAgIGRvdWJsZVRhcEludGVydmFsOiAzMDBcbiAgICAgIH1cbiAgICB9O1xuICB9KSgndGFwJyk7XG5cbiAgLyoqXG4gICAqIEBtb2R1bGUgZ2VzdHVyZXNcbiAgICovXG4gIC8qKlxuICAgKiB3aGVuIGEgdG91Y2ggaXMgYmVpbmcgdG91Y2hlZCBhdCB0aGUgcGFnZVxuICAgKlxuICAgKiBAY2xhc3MgVG91Y2hcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCB0b3VjaFxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZcbiAgICovXG4gIEdlc3R1cmVEZXRlY3Rvci5nZXN0dXJlcy5Ub3VjaCA9IHtcbiAgICBuYW1lOiAndG91Y2gnLFxuICAgIGluZGV4OiAtSW5maW5pdHksXG4gICAgZGVmYXVsdHM6IHtcbiAgICAgIC8qKlxuICAgICAgICogY2FsbCBwcmV2ZW50RGVmYXVsdCBhdCB0b3VjaHN0YXJ0LCBhbmQgbWFrZXMgdGhlIGVsZW1lbnQgYmxvY2tpbmcgYnkgZGlzYWJsaW5nIHRoZSBzY3JvbGxpbmcgb2YgdGhlIHBhZ2UsXG4gICAgICAgKiBidXQgaXQgaW1wcm92ZXMgZ2VzdHVyZXMgbGlrZSB0cmFuc2Zvcm1pbmcgYW5kIGRyYWdnaW5nLlxuICAgICAgICogYmUgY2FyZWZ1bCB3aXRoIHVzaW5nIHRoaXMsIGl0IGNhbiBiZSB2ZXJ5IGFubm95aW5nIGZvciB1c2VycyB0byBiZSBzdHVjayBvbiB0aGUgcGFnZVxuICAgICAgICogQHByb3BlcnR5IHByZXZlbnREZWZhdWx0XG4gICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHByZXZlbnREZWZhdWx0OiBmYWxzZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBkaXNhYmxlIG1vdXNlIGV2ZW50cywgc28gb25seSB0b3VjaCAob3IgcGVuISkgaW5wdXQgdHJpZ2dlcnMgZXZlbnRzXG4gICAgICAgKiBAcHJvcGVydHkgcHJldmVudE1vdXNlXG4gICAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHByZXZlbnRNb3VzZTogZmFsc2VcbiAgICB9LFxuICAgIGhhbmRsZXI6IGZ1bmN0aW9uIHRvdWNoR2VzdHVyZShldiwgaW5zdCkge1xuICAgICAgaWYgKGluc3Qub3B0aW9ucy5wcmV2ZW50TW91c2UgJiYgZXYucG9pbnRlclR5cGUgPT0gUE9JTlRFUl9NT1VTRSkge1xuICAgICAgICBldi5zdG9wRGV0ZWN0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGluc3Qub3B0aW9ucy5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXYuZXZlbnRUeXBlID09IEVWRU5UX1RPVUNIKSB7XG4gICAgICAgIGluc3QudHJpZ2dlcigndG91Y2gnLCBldik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAbW9kdWxlIGdlc3R1cmVzXG4gICAqL1xuICAvKipcbiAgICogVXNlciB3YW50IHRvIHNjYWxlIG9yIHJvdGF0ZSB3aXRoIDIgZmluZ2Vyc1xuICAgKiBQcmV2ZW50aW5nIHRoZSBkZWZhdWx0IGJyb3dzZXIgYmVoYXZpb3IgaXMgYSBnb29kIHdheSB0byBpbXByb3ZlIGZlZWwgYW5kIHdvcmtpbmcuIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCB0aGVcbiAgICogYHByZXZlbnREZWZhdWx0YCBvcHRpb24uXG4gICAqXG4gICAqIEBjbGFzcyBUcmFuc2Zvcm1cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCB0cmFuc2Zvcm1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHRyYW5zZm9ybXN0YXJ0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCB0cmFuc2Zvcm1lbmRcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHBpbmNoaW5cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuICAvKipcbiAgICogQGV2ZW50IHBpbmNob3V0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cbiAgLyoqXG4gICAqIEBldmVudCByb3RhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2XG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKi9cbiAgKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgdHJpZ2dlcmVkID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1HZXN0dXJlKGV2LCBpbnN0KSB7XG4gICAgICBzd2l0Y2ggKGV2LmV2ZW50VHlwZSkge1xuICAgICAgY2FzZSBFVkVOVF9TVEFSVDpcbiAgICAgICAgdHJpZ2dlcmVkID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEVWRU5UX01PVkU6XG4gICAgICAgIC8vIGF0IGxlYXN0IG11bHRpdG91Y2hcbiAgICAgICAgaWYgKGV2LnRvdWNoZXMubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzY2FsZVRocmVzaG9sZCA9IE1hdGguYWJzKDEgLSBldi5zY2FsZSk7XG4gICAgICAgIHZhciByb3RhdGlvblRocmVzaG9sZCA9IE1hdGguYWJzKGV2LnJvdGF0aW9uKTtcblxuICAgICAgICAvLyB3aGVuIHRoZSBkaXN0YW5jZSB3ZSBtb3ZlZCBpcyB0b28gc21hbGwgd2Ugc2tpcCB0aGlzIGdlc3R1cmVcbiAgICAgICAgLy8gb3Igd2UgY2FuIGJlIGFscmVhZHkgaW4gZHJhZ2dpbmdcbiAgICAgICAgaWYgKHNjYWxlVGhyZXNob2xkIDwgaW5zdC5vcHRpb25zLnRyYW5zZm9ybU1pblNjYWxlICYmXG4gICAgICAgICAgcm90YXRpb25UaHJlc2hvbGQgPCBpbnN0Lm9wdGlvbnMudHJhbnNmb3JtTWluUm90YXRpb24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3ZSBhcmUgdHJhbnNmb3JtaW5nIVxuICAgICAgICBEZXRlY3Rpb24uY3VycmVudC5uYW1lID0gbmFtZTtcblxuICAgICAgICAvLyBmaXJzdCB0aW1lLCB0cmlnZ2VyIGRyYWdzdGFydCBldmVudFxuICAgICAgICBpZiAoIXRyaWdnZXJlZCkge1xuICAgICAgICAgIGluc3QudHJpZ2dlcihuYW1lICsgJ3N0YXJ0JywgZXYpO1xuICAgICAgICAgIHRyaWdnZXJlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpbnN0LnRyaWdnZXIobmFtZSwgZXYpOyAvLyBiYXNpYyB0cmFuc2Zvcm0gZXZlbnRcblxuICAgICAgICAvLyB0cmlnZ2VyIHJvdGF0ZSBldmVudFxuICAgICAgICBpZiAocm90YXRpb25UaHJlc2hvbGQgPiBpbnN0Lm9wdGlvbnMudHJhbnNmb3JtTWluUm90YXRpb24pIHtcbiAgICAgICAgICBpbnN0LnRyaWdnZXIoJ3JvdGF0ZScsIGV2KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyaWdnZXIgcGluY2ggZXZlbnRcbiAgICAgICAgaWYgKHNjYWxlVGhyZXNob2xkID4gaW5zdC5vcHRpb25zLnRyYW5zZm9ybU1pblNjYWxlKSB7XG4gICAgICAgICAgaW5zdC50cmlnZ2VyKCdwaW5jaCcsIGV2KTtcbiAgICAgICAgICBpbnN0LnRyaWdnZXIoJ3BpbmNoJyArIChldi5zY2FsZSA8IDEgPyAnaW4nIDogJ291dCcpLCBldik7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRVZFTlRfUkVMRUFTRTpcbiAgICAgICAgaWYgKHRyaWdnZXJlZCAmJiBldi5jaGFuZ2VkTGVuZ3RoIDwgMikge1xuICAgICAgICAgIGluc3QudHJpZ2dlcihuYW1lICsgJ2VuZCcsIGV2KTtcbiAgICAgICAgICB0cmlnZ2VyZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBHZXN0dXJlRGV0ZWN0b3IuZ2VzdHVyZXMuVHJhbnNmb3JtID0ge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGluZGV4OiA0NSxcbiAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBtaW5pbWFsIHNjYWxlIGZhY3Rvciwgbm8gc2NhbGUgaXMgMSwgem9vbWluIGlzIHRvIDAgYW5kIHpvb21vdXQgdW50aWwgaGlnaGVyIHRoZW4gMVxuICAgICAgICAgKiBAcHJvcGVydHkgdHJhbnNmb3JtTWluU2NhbGVcbiAgICAgICAgICogQHR5cGUge051bWJlcn1cbiAgICAgICAgICogQGRlZmF1bHQgMC4wMVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmb3JtTWluU2NhbGU6IDAuMDEsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHJvdGF0aW9uIGluIGRlZ3JlZXNcbiAgICAgICAgICogQHByb3BlcnR5IHRyYW5zZm9ybU1pblJvdGF0aW9uXG4gICAgICAgICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAgICAgICAqIEBkZWZhdWx0IDFcbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZm9ybU1pblJvdGF0aW9uOiAxXG4gICAgICB9LFxuXG4gICAgICBoYW5kbGVyOiB0cmFuc2Zvcm1HZXN0dXJlXG4gICAgfTtcbiAgfSkoJ3RyYW5zZm9ybScpO1xuXG5leHBvcnQgZGVmYXVsdCBHZXN0dXJlRGV0ZWN0b3I7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5sZXQgcmVhZHlNYXAsIHF1ZXVlTWFwO1xuXG5mdW5jdGlvbiBpc0NvbnRlbnRSZWFkeShlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgIHNldENvbnRlbnRSZWFkeShlbGVtZW50KTtcbiAgfVxuICByZXR1cm4gcmVhZHlNYXAuaGFzKGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBzZXRDb250ZW50UmVhZHkoZWxlbWVudCkge1xuICByZWFkeU1hcC5zZXQoZWxlbWVudCwgdHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGFkZENhbGxiYWNrKGVsZW1lbnQsIGZuKSB7XG4gIGlmICghcXVldWVNYXAuaGFzKGVsZW1lbnQpKSB7XG4gICAgcXVldWVNYXAuc2V0KGVsZW1lbnQsIFtdKTtcbiAgfVxuICBxdWV1ZU1hcC5nZXQoZWxlbWVudCkucHVzaChmbik7XG59XG5cbmZ1bmN0aW9uIGNvbnN1bWVRdWV1ZShlbGVtZW50KSB7XG4gIGNvbnN0IGNhbGxiYWNrcyA9IHF1ZXVlTWFwLmdldChlbGVtZW50LCBbXSkgfHwgW107XG4gIHF1ZXVlTWFwLmRlbGV0ZShlbGVtZW50KTtcbiAgY2FsbGJhY2tzLmZvckVhY2goY2FsbGJhY2sgPT4gY2FsbGJhY2soKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRlbnRSZWFkeShlbGVtZW50LCBmbiA9ICgpID0+IHt9KSB7XG4gIGlmIChyZWFkeU1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmVhZHlNYXAgPSBuZXcgV2Vha01hcCgpO1xuICAgIHF1ZXVlTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgfVxuXG4gIGFkZENhbGxiYWNrKGVsZW1lbnQsIGZuKTtcblxuICBpZiAoaXNDb250ZW50UmVhZHkoZWxlbWVudCkpIHtcbiAgICBjb25zdW1lUXVldWUoZWxlbWVudCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjaGFuZ2VzID0+IHtcbiAgICBzZXRDb250ZW50UmVhZHkoZWxlbWVudCk7XG4gICAgY29uc3VtZVF1ZXVlKGVsZW1lbnQpO1xuICB9KTtcbiAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7Y2hpbGRMaXN0OiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7XG5cbiAgLy8gZmFpbGJhY2sgZm9yIGVsZW1lbnRzIGhhcyBlbXB0eSBjb250ZW50LlxuICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgIHNldENvbnRlbnRSZWFkeShlbGVtZW50KTtcbiAgICBjb25zdW1lUXVldWUoZWxlbWVudCk7XG4gIH0pO1xufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuY2xhc3MgVG9hc3RRdWV1ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucXVldWUgPSBbXTtcbiAgfVxuXG4gIGFkZChmbiwgcHJvbWlzZSkge1xuICAgIHRoaXMucXVldWUucHVzaChmbik7XG5cbiAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHNldEltbWVkaWF0ZSh0aGlzLnF1ZXVlWzBdKTtcbiAgICB9XG5cbiAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5xdWV1ZS5zaGlmdCgpO1xuXG4gICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNldFRpbWVvdXQodGhpcy5xdWV1ZVswXSwgMTAwMC8zMCk7IC8vIEFwcGx5IHNvbWUgdmlzdWFsIGRlbGF5XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IFRvYXN0UXVldWUoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4vY29udGVudC1yZWFkeS5qcyc7XG5pbXBvcnQgVG9hc3RRdWV1ZSBmcm9tICcuL2ludGVybmFsL3RvYXN0LXF1ZXVlLmpzJztcblxuY29uc3QgX3NldEF0dHJpYnV0ZXMgPSAoZWxlbWVudCwgb3B0aW9ucykgPT4ge1xuICBbJ2lkJywgJ2NsYXNzJywgJ2FuaW1hdGlvbiddXG4gICAgLmZvckVhY2goYSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgYSkgJiYgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYSwgb3B0aW9uc1thXSkpO1xuXG4gIGlmIChvcHRpb25zLm1vZGlmaWVyKSB7XG4gICAgdXRpbC5hZGRNb2RpZmllcihlbGVtZW50LCBvcHRpb25zLm1vZGlmaWVyKTtcbiAgfVxufTtcblxuY29uc3QgX25vcm1hbGl6ZUFyZ3VtZW50cyA9IChtZXNzYWdlLCBvcHRpb25zID0ge30sIGRlZmF1bHRzID0ge30pID0+IHtcbiAgb3B0aW9ucyA9IHsgLi4ub3B0aW9ucyB9O1xuICB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgPyAob3B0aW9ucy5tZXNzYWdlID0gbWVzc2FnZSkgOiAob3B0aW9ucyA9IG1lc3NhZ2UpO1xuICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMubWVzc2FnZSAmJiAhb3B0aW9ucy5tZXNzYWdlSFRNTCkge1xuICAgIHV0aWwudGhyb3coJ05vdGlmaWNhdGlvbnMgbXVzdCBjb250YWluIGEgbWVzc2FnZScpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCAnYnV0dG9uTGFiZWxzJykgfHwgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsICdidXR0b25MYWJlbCcpKSB7XG4gICAgb3B0aW9ucy5idXR0b25MYWJlbHMgPSBvcHRpb25zLmJ1dHRvbkxhYmVscyB8fCBvcHRpb25zLmJ1dHRvbkxhYmVsO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShvcHRpb25zLmJ1dHRvbkxhYmVscykpIHtcbiAgICAgIG9wdGlvbnMuYnV0dG9uTGFiZWxzID0gW29wdGlvbnMuYnV0dG9uTGFiZWxzIHx8ICcnXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXRpbC5leHRlbmQoe1xuICAgICAgY29tcGlsZTogcGFyYW0gPT4gcGFyYW0sXG4gICAgICBjYWxsYmFjazogcGFyYW0gPT4gcGFyYW0sXG4gICAgICBhbmltYXRpb246ICdkZWZhdWx0JyxcbiAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgcHJpbWFyeUJ1dHRvbkluZGV4OiAob3B0aW9ucy5idXR0b25MYWJlbHMgfHwgZGVmYXVsdHMuYnV0dG9uTGFiZWxzIHx8IFtdKS5sZW5ndGggLSAxXG4gICAgfSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBAb2JqZWN0IG9ucy5ub3RpZmljYXRpb25cbiAqIEBjYXRlZ29yeSBkaWFsb2dcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9ub3RpZmljYXRpb25cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgVXRpbGl0eSBtZXRob2RzIHRvIGNyZWF0ZSBkaWZmZXJlbnQga2luZHMgb2Ygbm90aWZpY2F0aW9ucy4gVGhlcmUgYXJlIHRocmVlIG1ldGhvZHMgYXZhaWxhYmxlOlxuICpcbiAqICAgICAqIGBvbnMubm90aWZpY2F0aW9uLmFsZXJ0KClgXG4gKiAgICAgKiBgb25zLm5vdGlmaWNhdGlvbi5jb25maXJtKClgXG4gKiAgICAgKiBgb25zLm5vdGlmaWNhdGlvbi5wcm9tcHQoKWBcbiAqICAgICAqIGBvbnMubm90aWZpY2F0aW9uLnRvYXN0KClgXG4gKlxuICogICAgIEl0IHdpbGwgYXV0b21hdGljYWxseSBkaXNwbGF5IGEgTWF0ZXJpYWwgRGVzaWduIGRpYWxvZyBvbiBBbmRyb2lkIGRldmljZXMuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV3jgYTjgY/jgaTjgYvjga7nqK7poZ7jga7jgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjgpLkvZzmiJDjgZnjgovjgZ/jgoHjga7jg6bjg7zjg4bjgqPjg6rjg4bjgqPjg6Hjgr3jg4Pjg4njgpLlj47jgoHjgZ/jgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICogQGV4YW1wbGVcbiAqIG9ucy5ub3RpZmljYXRpb24uYWxlcnQoJ0hlbGxvLCB3b3JsZCEnKTtcbiAqXG4gKiBvbnMubm90aWZpY2F0aW9uLmNvbmZpcm0oJ0FyZSB5b3UgcmVhZHk/JylcbiAqICAgLnRoZW4oXG4gKiAgICAgZnVuY3Rpb24oYW5zd2VyKSB7XG4gKiAgICAgICBpZiAoYW5zd2VyID09PSAxKSB7XG4gKiAgICAgICAgIG9ucy5ub3RpZmljYXRpb24uYWxlcnQoJ0xldFxcJ3MgZ28hJyk7XG4gKiAgICAgICB9XG4gKiAgICAgfVxuICogICApO1xuICpcbiAqIG9ucy5ub3RpZmljYXRpb24ucHJvbXB0KCdIb3cgb2xkIGFyZSA/JylcbiAqICAgLnRoZW4oXG4gKiAgICAgZnVuY3Rpb24oYWdlKSB7XG4gKiAgICAgICBvbnMubm90aWZpY2F0aW9uLmFsZXJ0KCdZb3UgYXJlICcgKyBhZ2UgKyAnIHllYXJzIG9sZC4nKTtcbiAqICAgICB9XG4gKiAgICk7XG4gKi9cbmNvbnN0IG5vdGlmaWNhdGlvbiA9IHt9O1xuXG5ub3RpZmljYXRpb24uX2NyZWF0ZUFsZXJ0RGlhbG9nID0gKC4uLnBhcmFtcykgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBfbm9ybWFsaXplQXJndW1lbnRzKC4uLnBhcmFtcyk7XG4gIHV0aWwuY2hlY2tNaXNzaW5nSW1wb3J0KCdBbGVydERpYWxvZycsICdBbGVydERpYWxvZ0J1dHRvbicpO1xuXG4gIC8vIFByb21wdCBpbnB1dCBzdHJpbmdcbiAgbGV0IGlucHV0U3RyaW5nID0gJyc7XG4gIGlmIChvcHRpb25zLmlzUHJvbXB0KSB7XG4gICAgaW5wdXRTdHJpbmcgPSBgXG4gICAgICA8aW5wdXRcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LWlucHV0IHRleHQtaW5wdXQtLXVuZGVyYmFyXCJcbiAgICAgICAgdHlwZT1cIiR7b3B0aW9ucy5pbnB1dFR5cGUgfHwgJ3RleHQnfVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiJHtvcHRpb25zLnBsYWNlaG9sZGVyIHx8ICcnfVwiXG4gICAgICAgIHZhbHVlPVwiJHtvcHRpb25zLmRlZmF1bHRWYWx1ZSB8fCAnJ31cIlxuICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlOyBtYXJnaW4tdG9wOiAxMHB4O1wiXG4gICAgICAvPlxuICAgIGA7XG4gIH1cblxuICAvLyBCdXR0b25zIHN0cmluZ1xuICBsZXQgYnV0dG9ucyA9ICcnO1xuICBvcHRpb25zLmJ1dHRvbkxhYmVscy5mb3JFYWNoKChsYWJlbCwgaW5kZXgpID0+IHtcbiAgICBidXR0b25zICs9IGBcbiAgICAgIDxvbnMtYWxlcnQtZGlhbG9nLWJ1dHRvblxuICAgICAgICBjbGFzcz1cIlxuICAgICAgICAgICR7aW5kZXggPT09IG9wdGlvbnMucHJpbWFyeUJ1dHRvbkluZGV4ID8gJyBhbGVydC1kaWFsb2ctYnV0dG9uLS1wcmltYWwnIDogJyd9XG4gICAgICAgICAgJHtvcHRpb25zLmJ1dHRvbkxhYmVscy5sZW5ndGggPD0gMiA/ICcgYWxlcnQtZGlhbG9nLWJ1dHRvbi0tcm93Zm9vdGVyJyA6ICcnfVxuICAgICAgICBcIlxuICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIj5cbiAgICAgICAgJHtsYWJlbH1cbiAgICAgIDwvb25zLWFsZXJ0LWRpYWxvZy1idXR0b24+XG4gICAgYDtcbiAgfSk7XG5cbiAgLy8gRGlhbG9nIEVsZW1lbnRcbiAgbGV0IGVsID0ge307XG4gIGNvbnN0IF9kZXN0cm95RGlhbG9nID0gKCkgPT4ge1xuICAgIGlmIChlbC5kaWFsb2cub25EaWFsb2dDYW5jZWwpIHtcbiAgICAgIGVsLmRpYWxvZy5yZW1vdmVFdmVudExpc3RlbmVyKCdkaWFsb2djYW5jZWwnLCBlbC5kaWFsb2cub25EaWFsb2dDYW5jZWwpO1xuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKGVsKS5mb3JFYWNoKGtleSA9PiBkZWxldGUgZWxba2V5XSk7XG4gICAgZWwgPSBudWxsO1xuXG4gICAgaWYgKG9wdGlvbnMuZGVzdHJveSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICBvcHRpb25zLmRlc3Ryb3koKTtcbiAgICB9XG4gIH07XG5cbiAgZWwuZGlhbG9nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb25zLWFsZXJ0LWRpYWxvZycpO1xuICBlbC5kaWFsb2cuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2ctbWFza1wiXG4gICAgICBzdHlsZT1cIlxuICAgICAgICAke29wdGlvbnMubWFza0NvbG9yID8gJ2JhY2tncm91bmQtY29sb3I6ICcgKyBvcHRpb25zLm1hc2tDb2xvciA6ICcnfVxuICAgICAgXCI+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImFsZXJ0LWRpYWxvZ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0LWRpYWxvZy1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0LWRpYWxvZy10aXRsZVwiPlxuICAgICAgICAgICR7b3B0aW9ucy50aXRsZSB8fCAnJ31cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2ctY29udGVudFwiPlxuICAgICAgICAgICR7b3B0aW9ucy5tZXNzYWdlIHx8IG9wdGlvbnMubWVzc2FnZUhUTUx9XG4gICAgICAgICAgJHtpbnB1dFN0cmluZ31cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJcbiAgICAgICAgICBhbGVydC1kaWFsb2ctZm9vdGVyXG4gICAgICAgICAgJHtvcHRpb25zLmJ1dHRvbkxhYmVscy5sZW5ndGggPD0gMiA/ICcgYWxlcnQtZGlhbG9nLWZvb3Rlci0tcm93Zm9vdGVyJyA6ICcnfVxuICAgICAgICBcIj5cbiAgICAgICAgICAke2J1dHRvbnN9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIGNvbnRlbnRSZWFkeShlbC5kaWFsb2cpO1xuXG4gIC8vIFNldCBhdHRyaWJ1dGVzXG4gIF9zZXRBdHRyaWJ1dGVzKGVsLmRpYWxvZywgb3B0aW9ucyk7XG5cbiAgLy8gUHJvbXB0IGV2ZW50c1xuICBpZiAob3B0aW9ucy5pc1Byb21wdCkge1xuICAgIGVsLmlucHV0ID0gZWwuZGlhbG9nLnF1ZXJ5U2VsZWN0b3IoJy50ZXh0LWlucHV0Jyk7XG5cbiAgICBpZiAob3B0aW9ucy5zdWJtaXRPbkVudGVyKSB7XG4gICAgICBlbC5pbnB1dC5vbmtleXByZXNzID0gZXZlbnQgPT4ge1xuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgICBlbC5kaWFsb2cuaGlkZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVWYWx1ZSA9IGVsLmlucHV0LnZhbHVlO1xuICAgICAgICAgICAgICAgIF9kZXN0cm95RGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFjayhyZXNvbHZlVmFsdWUpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzb2x2ZVZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLy8gQnV0dG9uIGV2ZW50c1xuICBlbC5mb290ZXIgPSBlbC5kaWFsb2cucXVlcnlTZWxlY3RvcignLmFsZXJ0LWRpYWxvZy1mb290ZXInKTtcbiAgdXRpbC5hcnJheUZyb20oZWwuZGlhbG9nLnF1ZXJ5U2VsZWN0b3JBbGwoJy5hbGVydC1kaWFsb2ctYnV0dG9uJykpLmZvckVhY2goKGJ1dHRvbkVsZW1lbnQsIGluZGV4KSA9PiB7XG4gICAgYnV0dG9uRWxlbWVudC5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICBlbC5kaWFsb2cuaGlkZSgpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgIGxldCByZXNvbHZlVmFsdWUgPSBpbmRleDtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaXNQcm9tcHQpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlVmFsdWUgPSBpbmRleCA9PT0gb3B0aW9ucy5wcmltYXJ5QnV0dG9uSW5kZXggPyBlbC5pbnB1dC52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWwuZGlhbG9nLnJlbW92ZSgpO1xuICAgICAgICAgICAgICBfZGVzdHJveURpYWxvZygpO1xuICAgICAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrKHJlc29sdmVWYWx1ZSk7XG4gICAgICAgICAgICAgIHJlc29sdmUocmVzb2x2ZVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZWwuZm9vdGVyLmFwcGVuZENoaWxkKGJ1dHRvbkVsZW1lbnQpO1xuICB9KTtcblxuICAvLyBDYW5jZWwgZXZlbnRzXG4gIGlmIChvcHRpb25zLmNhbmNlbGFibGUpIHtcbiAgICBlbC5kaWFsb2cuY2FuY2VsYWJsZSA9IHRydWU7XG4gICAgZWwuZGlhbG9nLm9uRGlhbG9nQ2FuY2VsID0gKCkgPT4ge1xuICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgZWwuZGlhbG9nLnJlbW92ZSgpO1xuICAgICAgICBfZGVzdHJveURpYWxvZygpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCByZXNvbHZlVmFsdWUgPSBvcHRpb25zLmlzUHJvbXB0ID8gbnVsbCA6IC0xO1xuICAgICAgb3B0aW9ucy5jYWxsYmFjayhyZXNvbHZlVmFsdWUpO1xuICAgICAgcmVzb2x2ZShyZXNvbHZlVmFsdWUpO1xuICAgIH07XG4gICAgZWwuZGlhbG9nLmFkZEV2ZW50TGlzdGVuZXIoJ2RpYWxvZ2NhbmNlbCcsIGVsLmRpYWxvZy5vbkRpYWxvZ0NhbmNlbCwgZmFsc2UpO1xuICB9XG5cbiAgLy8gU2hvdyBkaWFsb2dcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbC5kaWFsb2cpO1xuICBvcHRpb25zLmNvbXBpbGUoZWwuZGlhbG9nKTtcbiAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICBlbC5kaWFsb2cuc2hvdygpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChlbC5pbnB1dCAmJiBvcHRpb25zLmlzUHJvbXB0ICYmIG9wdGlvbnMuYXV0b2ZvY3VzKSB7XG4gICAgICAgICAgY29uc3Qgc3RyTGVuZ3RoID0gZWwuaW5wdXQudmFsdWUubGVuZ3RoO1xuICAgICAgICAgIGVsLmlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgaWYgKGVsLmlucHV0LnR5cGUgJiZcbiAgICAgICAgICAgIFsndGV4dCcsICdzZWFyY2gnLCAndXJsJywgJ3RlbCcsICdwYXNzd29yZCddLmluY2x1ZGVzKGVsLmlucHV0LnR5cGUpKSB7XG4gICAgICAgICAgICBlbC5pbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShzdHJMZW5ndGgsIHN0ckxlbmd0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgfSk7XG59KTtcblxuLyoqXG4gKiBAbWV0aG9kIGFsZXJ0XG4gKiBAc2lnbmF0dXJlIGFsZXJ0KG1lc3NhZ2UgWywgb3B0aW9uc10gfCBvcHRpb25zKVxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqICAgW2VuXVdpbGwgcmVzb2x2ZSB0byB0aGUgaW5kZXggb2YgdGhlIGJ1dHRvbiB0aGF0IHdhcyBwcmVzc2VkIG9yIGAtMWAgd2hlbiBjYW5jZWxlZC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gKiAgIFtlbl1Ob3RpZmljYXRpb24gbWVzc2FnZS4gVGhpcyBhcmd1bWVudCBpcyBvcHRpb25hbCBidXQgaWYgaXQncyBub3QgZGVmaW5lZCBlaXRoZXIgYG9wdGlvbnMubWVzc2FnZWAgb3IgYG9wdGlvbnMubWVzc2FnZUhUTUxgIG11c3QgYmUgZGVmaW5lZCBpbnN0ZWFkLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubWVzc2FnZV1cbiAqICAgW2VuXU5vdGlmaWNhdGlvbiBtZXNzYWdlLlsvZW5dXG4gKiAgIFtqYV3jgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjgavooajnpLrjgZnjgovmloflrZfliJfjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2VIVE1MXVxuICogICBbZW5dTm90aWZpY2F0aW9uIG1lc3NhZ2UgaW4gSFRNTC5bL2VuXVxuICogICBbamFd44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44Gr6KGo56S644GZ44KLSFRNTOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZyB8IEFycmF5fSBbb3B0aW9ucy5idXR0b25MYWJlbHNdXG4gKiAgIFtlbl1MYWJlbHMgZm9yIHRoZSBidXR0b25zLiBEZWZhdWx0IGlzIGBcIk9LXCJgLlsvZW5dXG4gKiAgIFtqYV3norroqo3jg5zjgr/jg7Pjga7jg6njg5njg6vjgpLmjIflrprjgZfjgb7jgZnjgIJcIk9LXCLjgYzjg4fjg5Xjgqnjg6vjg4jjgafjgZnjgIJbL2phXVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnByaW1hcnlCdXR0b25JbmRleF1cbiAqICAgW2VuXUluZGV4IG9mIHByaW1hcnkgYnV0dG9uLiBEZWZhdWx0IGlzIHRoZSBsYXN0IG9uZS5bL2VuXVxuICogICBbamFd44OX44Op44Kk44Oe44Oq44Oc44K/44Oz44Gu44Kk44Oz44OH44OD44Kv44K544KS5oyH5a6a44GX44G+44GZ44CC44OH44OV44Kp44Or44OI44GvIDAg44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY2FuY2VsYWJsZV1cbiAqICAgW2VuXVdoZXRoZXIgdGhlIGRpYWxvZyBpcyBjYW5jZWxhYmxlIG9yIG5vdC4gRGVmYXVsdCBpcyBgZmFsc2VgLiBJZiB0aGUgZGlhbG9nIGlzIGNhbmNlbGFibGUgaXQgY2FuIGJlIGNsb3NlZCBieSBjbGlja2luZyB0aGUgYmFja2dyb3VuZCBvciBwcmVzc2luZyB0aGUgQW5kcm9pZCBiYWNrIGJ1dHRvbi5bL2VuXVxuICogICBbamFd44OA44Kk44Ki44Ot44Kw44GM44Kt44Oj44Oz44K744Or5Y+v6IO944GL44Gp44GG44GL44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gKiAgIFtlbl1BbmltYXRpb24gbmFtZS4gQXZhaWxhYmxlIGFuaW1hdGlvbnMgYXJlIGBub25lYCBhbmQgYGZhZGVgLiBEZWZhdWx0IGlzIGBmYWRlYC5bL2VuXVxuICogICBbamFd44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44KS6KGo56S644GZ44KL6Zqb44Gu44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCXCJub25lXCIsIFwiZmFkZVwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5pZF1cbiAqICAgW2VuXVRoZSBgPG9ucy1hbGVydC1kaWFsb2c+YCBlbGVtZW50J3MgSUQuWy9lbl1cbiAqICAgW2phXW9ucy1hbGVydC1kaWFsb2fopoHntKDjga5JROOAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY2xhc3NdXG4gKiAgIFtlbl1UaGUgYDxvbnMtYWxlcnQtZGlhbG9nPmAgZWxlbWVudCdzIGNsYXNzLlsvZW5dXG4gKiAgIFtqYV1vbnMtYWxlcnQtZGlhbG9n6KaB57Sg44GuY2xhc3PjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnRpdGxlXVxuICogICBbZW5dRGlhbG9nIHRpdGxlLiBEZWZhdWx0IGlzIGBcIkFsZXJ0XCJgLlsvZW5dXG4gKiAgIFtqYV3jgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjga7kuIrpg6jjgavooajnpLrjgZnjgovjgr/jgqTjg4jjg6vjgpLmjIflrprjgZfjgb7jgZnjgIJcIkFsZXJ0XCLjgYzjg4fjg5Xjgqnjg6vjg4jjgafjgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1vZGlmaWVyXVxuICogICBbZW5dTW9kaWZpZXIgZm9yIHRoZSBkaWFsb2cuWy9lbl1cbiAqICAgW2phXeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOBrm1vZGlmaWVy5bGe5oCn44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5tYXNrQ29sb3JdXG4gKiAgIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZCBtYXNrLiBEZWZhdWx0IGlzIFwicmdiYSgwLCAwLCAwLCAwLjIpXCIgKFwicmdiYSgwLCAwLCAwLCAwLjMpXCIgZm9yIE1hdGVyaWFsKS5bL2VuXVxuICogICBbamFd6IOM5pmv44Gu44Oe44K544Kv44Gu6Imy44KS5oyH5a6a44GX44G+44GZ44CCXCJyZ2JhKDAsIDAsIDAsIDAuMilcIuOBjOODh+ODleOCqeODq+ODiOWApOOBp+OBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAqICAgW2VuXUZ1bmN0aW9uIHRoYXQgZXhlY3V0ZXMgYWZ0ZXIgZGlhbG9nIGhhcyBiZWVuIGNsb3NlZC5bL2VuXVxuICogICBbamFd44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44GM6ZaJ44GY44KJ44KM44Gf5pmC44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgRGlzcGxheSBhbiBhbGVydCBkaWFsb2cgdG8gc2hvdyB0aGUgdXNlciBhIG1lc3NhZ2UuXG4gKlxuICogICAgIFRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlIGNhbiBiZSBlaXRoZXIgc2ltcGxlIHRleHQgb3IgSFRNTC5cbiAqXG4gKiAgICAgSXQgY2FuIGJlIGNhbGxlZCBpbiB0aGUgZm9sbG93aW5nIHdheXM6XG4gKlxuICogICAgIGBgYFxuICogICAgIG9ucy5ub3RpZmljYXRpb24uYWxlcnQobWVzc2FnZSwgb3B0aW9ucyk7XG4gKiAgICAgb25zLm5vdGlmaWNhdGlvbi5hbGVydChvcHRpb25zKTtcbiAqICAgICBgYGBcbiAqXG4gKiAgICAgTXVzdCBzcGVjaWZ5IGVpdGhlciBgbWVzc2FnZWAgb3IgYG1lc3NhZ2VIVE1MYC5cbiAqICAgWy9lbl1cbiAqICAgW2phXVxuICogICAgIOODpuODvOOCtuODvOOBuOODoeODg+OCu+ODvOOCuOOCkuimi+OBm+OCi+OBn+OCgeOBruOCouODqeODvOODiOODgOOCpOOCouODreOCsOOCkuihqOekuuOBl+OBvuOBmeOAglxuICogICAgIOihqOekuuOBmeOCi+ODoeODg+OCu+ODvOOCuOOBr+OAgeODhuOCreOCueODiOOBi+OCguOBl+OBj+OBr0hUTUzjgpLmjIflrprjgafjgY3jgb7jgZnjgIJcbiAqICAgICDjgZPjga7jg6Hjgr3jg4Pjg4njga7lvJXmlbDjgavjga/jgIFvcHRpb25zLm1lc3NhZ2XjgoLjgZfjgY/jga9vcHRpb25zLm1lc3NhZ2VIVE1M44Gu44Gp44Gh44KJ44GL44KS5b+F44Ga5oyH5a6a44GZ44KL5b+F6KaB44GM44GC44KK44G+44GZ44CCXG4gKiAgIFsvamFdXG4gKi9cbm5vdGlmaWNhdGlvbi5hbGVydCA9IChtZXNzYWdlLCBvcHRpb25zKSA9PlxuICBub3RpZmljYXRpb24uX2NyZWF0ZUFsZXJ0RGlhbG9nKG1lc3NhZ2UsIG9wdGlvbnMsIHtcbiAgICBidXR0b25MYWJlbHM6IFsnT0snXSxcbiAgICB0aXRsZTogJ0FsZXJ0J1xuICB9KTtcblxuLyoqXG4gKiBAbWV0aG9kIGNvbmZpcm1cbiAqIEBzaWduYXR1cmUgY29uZmlybShtZXNzYWdlIFssIG9wdGlvbnNdIHwgb3B0aW9ucylcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKiAgIFtlbl1XaWxsIHJlc29sdmUgdG8gdGhlIGluZGV4IG9mIHRoZSBidXR0b24gdGhhdCB3YXMgcHJlc3NlZCBvciBgLTFgIHdoZW4gY2FuY2VsZWQuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICogICBbZW5dTm90aWZpY2F0aW9uIG1lc3NhZ2UuIFRoaXMgYXJndW1lbnQgaXMgb3B0aW9uYWwgYnV0IGlmIGl0J3Mgbm90IGRlZmluZWQgZWl0aGVyIGBvcHRpb25zLm1lc3NhZ2VgIG9yIGBvcHRpb25zLm1lc3NhZ2VIVE1MYCBtdXN0IGJlIGRlZmluZWQgaW5zdGVhZC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5idXR0b25MYWJlbHNdXG4gKiAgIFtlbl1MYWJlbHMgZm9yIHRoZSBidXR0b25zLiBEZWZhdWx0IGlzIGBbXCJDYW5jZWxcIiwgXCJPS1wiXWAuWy9lbl1cbiAqICAgW2phXeODnOOCv+ODs+OBruODqeODmeODq+OBrumFjeWIl+OCkuaMh+WumuOBl+OBvuOBmeOAgltcIkNhbmNlbFwiLCBcIk9LXCJd44GM44OH44OV44Kp44Or44OI44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5wcmltYXJ5QnV0dG9uSW5kZXhdXG4gKiAgIFtlbl1JbmRleCBvZiBwcmltYXJ5IGJ1dHRvbi4gRGVmYXVsdCBpcyB0aGUgbGFzdCBvbmUuWy9lbl1cbiAqICAgW2phXeODl+ODqeOCpOODnuODquODnOOCv+ODs+OBruOCpOODs+ODh+ODg+OCr+OCueOCkuaMh+WumuOBl+OBvuOBmeOAguODh+ODleOCqeODq+ODiOOBryAxIOOBp+OBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIERpc3BsYXkgYSBkaWFsb2cgdG8gYXNrIHRoZSB1c2VyIGZvciBjb25maXJtYXRpb24uIEV4dGVuZHMgYGFsZXJ0KClgIHBhcmFtZXRlcnMuXG4gKiAgICAgVGhlIGRlZmF1bHQgYnV0dG9uIGxhYmVscyBhcmUgYFwiQ2FuY2VsXCJgIGFuZCBgXCJPS1wiYCBidXQgdGhleSBjYW4gYmUgY3VzdG9taXplZC5cbiAqXG4gKiAgICAgSXQgY2FuIGJlIGNhbGxlZCBpbiB0aGUgZm9sbG93aW5nIHdheXM6XG4gKlxuICogICAgIGBgYFxuICogICAgIG9ucy5ub3RpZmljYXRpb24uY29uZmlybShtZXNzYWdlLCBvcHRpb25zKTtcbiAqICAgICBvbnMubm90aWZpY2F0aW9uLmNvbmZpcm0ob3B0aW9ucyk7XG4gKiAgICAgYGBgXG4gKlxuICogICAgIE11c3Qgc3BlY2lmeSBlaXRoZXIgYG1lc3NhZ2VgIG9yIGBtZXNzYWdlSFRNTGAuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1cbiAqICAgICDjg6bjg7zjgrbjgavnorroqo3jgpLkv4PjgZnjg4DjgqTjgqLjg63jgrDjgpLooajnpLrjgZfjgb7jgZnjgIJcbiAqICAgICDjg4fjgqrjg6vjgajjga7jg5zjgr/jg7Pjg6njg5njg6vjga/jgIFcIkNhbmNlbFwi44GoXCJPS1wi44Gn44GZ44GM44CB44GT44KM44Gv44GT44Gu44Oh44K944OD44OJ44Gu5byV5pWw44Gn44Kr44K544K/44Oe44Kk44K644Gn44GN44G+44GZ44CCXG4gKiAgICAg44GT44Gu44Oh44K944OD44OJ44Gu5byV5pWw44Gr44Gv44CBb3B0aW9ucy5tZXNzYWdl44KC44GX44GP44Gvb3B0aW9ucy5tZXNzYWdlSFRNTOOBruOBqeOBoeOCieOBi+OCkuW/heOBmuaMh+WumuOBmeOCi+W/heimgeOBjOOBguOCiuOBvuOBmeOAglxuICogICBbL2phXVxuICovXG5ub3RpZmljYXRpb24uY29uZmlybSA9IChtZXNzYWdlLCBvcHRpb25zKSA9PlxuICBub3RpZmljYXRpb24uX2NyZWF0ZUFsZXJ0RGlhbG9nKG1lc3NhZ2UsIG9wdGlvbnMsIHtcbiAgICBidXR0b25MYWJlbHM6IFsnQ2FuY2VsJywgJ09LJ10sXG4gICAgdGl0bGU6ICdDb25maXJtJ1xuICB9KTtcblxuLyoqXG4gKiBAbWV0aG9kIHByb21wdFxuICogQHNpZ25hdHVyZSBwcm9tcHQobWVzc2FnZSBbLCBvcHRpb25zXSB8IG9wdGlvbnMpXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICogICBbZW5dTm90aWZpY2F0aW9uIG1lc3NhZ2UuIFRoaXMgYXJndW1lbnQgaXMgb3B0aW9uYWwgYnV0IGlmIGl0J3Mgbm90IGRlZmluZWQgZWl0aGVyIGBvcHRpb25zLm1lc3NhZ2VgIG9yIGBvcHRpb25zLm1lc3NhZ2VIVE1MYCBtdXN0IGJlIGRlZmluZWQgaW5zdGVhZC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKiAgIFtlbl1XaWxsIHJlc29sdmUgdG8gdGhlIGlucHV0IHZhbHVlIHdoZW4gdGhlIGRpYWxvZyBpcyBjbG9zZWQgb3IgYG51bGxgIHdoZW4gY2FuY2VsZWQuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nIHwgQXJyYXl9IFtvcHRpb25zLmJ1dHRvbkxhYmVsc11cbiAqICAgW2VuXUxhYmVscyBmb3IgdGhlIGJ1dHRvbnMuIERlZmF1bHQgaXMgYFwiT0tcImAuWy9lbl1cbiAqICAgW2phXeeiuuiqjeODnOOCv+ODs+OBruODqeODmeODq+OCkuaMh+WumuOBl+OBvuOBmeOAglwiT0tcIuOBjOODh+ODleOCqeODq+ODiOOBp+OBmeOAglsvamFdXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucHJpbWFyeUJ1dHRvbkluZGV4XVxuICogICBbZW5dSW5kZXggb2YgcHJpbWFyeSBidXR0b24uIERlZmF1bHQgaXMgdGhlIGxhc3Qgb25lLlsvZW5dXG4gKiAgIFtqYV3jg5fjg6njgqTjg57jg6rjg5zjgr/jg7Pjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgpLmjIflrprjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjga8gMCDjgafjgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnBsYWNlaG9sZGVyXVxuICogICBbZW5dUGxhY2Vob2xkZXIgZm9yIHRoZSB0ZXh0IGlucHV0LlsvZW5dXG4gKiAgIFtqYV3jg4bjgq3jgrnjg4jmrITjga7jg5fjg6zjg7zjgrnjg5vjg6vjg4DjgavooajnpLrjgZnjgovjg4bjgq3jgrnjg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmRlZmF1bHRWYWx1ZV1cbiAqICAgW2VuXURlZmF1bHQgdmFsdWUgZm9yIHRoZSB0ZXh0IGlucHV0LlsvZW5dXG4gKiAgIFtqYV3jg4bjgq3jgrnjg4jmrITjga7jg4fjg5Xjgqnjg6vjg4jjga7lgKTjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmlucHV0VHlwZV1cbiAqICAgW2VuXVR5cGUgb2YgdGhlIGlucHV0IGVsZW1lbnQgKGBwYXNzd29yZGAsIGBkYXRlYC4uLikuIERlZmF1bHQgaXMgYHRleHRgLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hdXRvZm9jdXNdXG4gKiAgIFtlbl1BdXRvZm9jdXMgdGhlIGlucHV0IGVsZW1lbnQuIERlZmF1bHQgaXMgYHRydWVgLiBJbiBDb3Jkb3ZhLCBgS2V5Ym9hcmREaXNwbGF5UmVxdWlyZXNVc2VyQWN0aW9uYCBpbiBgY29uZmlnLnhtbGAgbXVzdCBiZSBgZmFsc2VgIHRvIGFjdGl2YXRlIHRoaXMgZmVhdHVyZS5bL2VuXVxuICogICBbamFdaW5wdXTopoHntKDjgavoh6rli5XnmoTjgavjg5Xjgqnjg7zjgqvjgrnjgZnjgovjgYvjganjgYbjgYvjgpLmjIflrprjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjga90cnVl44Gn44GZ44CCQ29yZG92YeeSsOWig+OBp+OBr+OAgeOBk+OBruapn+iDveOCkuacieWKueOBq+OBmeOCi+OBn+OCgeOBq+OBryBgY29uZmlnLnhtbGAg44GnIGBLZXlib2FyZERpc3BsYXlSZXF1aXJlc1VzZXJBY3Rpb25gIOOCkiBgZmFsc2VgIOOBq+ioreWumuOBmeOCi+W/heimgeOBjOOBguOCiuOBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnN1Ym1pdE9uRW50ZXJdXG4gKiAgIFtlbl1TdWJtaXQgYXV0b21hdGljYWxseSB3aGVuIGVudGVyIGlzIHByZXNzZWQuIERlZmF1bHQgaXMgYHRydWVgLlsvZW5dXG4gKiAgIFtqYV1FbnRlcuOBjOaKvOOBleOCjOOBn+mam+OBq+OBneOBrmZvcm3jgpJzdWJtaXTjgZnjgovjgYvjganjgYbjgYvjgpLmjIflrprjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjga90cnVl44Gn44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgRGlzcGxheSBhIGRpYWxvZyB3aXRoIGEgcHJvbXB0IHRvIGFzayB0aGUgdXNlciBhIHF1ZXN0aW9uLiBFeHRlbmRzIGBhbGVydCgpYCBwYXJhbWV0ZXJzLlxuICpcbiAqICAgICBJdCBjYW4gYmUgY2FsbGVkIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqXG4gKiAgICAgYGBgXG4gKiAgICAgb25zLm5vdGlmaWNhdGlvbi5wcm9tcHQobWVzc2FnZSwgb3B0aW9ucyk7XG4gKiAgICAgb25zLm5vdGlmaWNhdGlvbi5wcm9tcHQob3B0aW9ucyk7XG4gKiAgICAgYGBgXG4gKlxuICogICAgIE11c3Qgc3BlY2lmeSBlaXRoZXIgYG1lc3NhZ2VgIG9yIGBtZXNzYWdlSFRNTGAuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1cbiAqICAgICDjg6bjg7zjgrbjg7zjgavlhaXlipvjgpLkv4PjgZnjg4DjgqTjgqLjg63jgrDjgpLooajnpLrjgZfjgb7jgZnjgIJcbiAqICAgICDjgZPjga7jg6Hjgr3jg4Pjg4njga7lvJXmlbDjgavjga/jgIFvcHRpb25zLm1lc3NhZ2XjgoLjgZfjgY/jga9vcHRpb25zLm1lc3NhZ2VIVE1M44Gu44Gp44Gh44KJ44GL44KS5b+F44Ga5oyH5a6a44GZ44KL5b+F6KaB44GM44GC44KK44G+44GZ44CCXG4gKiAgIFsvamFdXG4gKi9cbm5vdGlmaWNhdGlvbi5wcm9tcHQgPSAobWVzc2FnZSwgb3B0aW9ucykgPT5cbiAgbm90aWZpY2F0aW9uLl9jcmVhdGVBbGVydERpYWxvZyhtZXNzYWdlLCBvcHRpb25zLCB7XG4gICAgYnV0dG9uTGFiZWxzOiBbJ09LJ10sXG4gICAgdGl0bGU6ICdBbGVydCcsXG4gICAgaXNQcm9tcHQ6IHRydWUsXG4gICAgYXV0b2ZvY3VzOiB0cnVlLFxuICAgIHN1Ym1pdE9uRW50ZXI6IHRydWVcbiAgfSk7XG5cbi8qKlxuICogQG1ldGhvZCB0b2FzdFxuICogQHNpZ25hdHVyZSB0b2FzdChtZXNzYWdlIFssIG9wdGlvbnNdIHwgb3B0aW9ucylcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKiAgIFtlbl1XaWxsIHJlc29sdmUgd2hlbiB0aGUgdG9hc3QgaXMgaGlkZGVuLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAqICAgW2VuXVRvYXN0IG1lc3NhZ2UuIFRoaXMgYXJndW1lbnQgaXMgb3B0aW9uYWwgYnV0IGlmIGl0J3Mgbm90IGRlZmluZWQgdGhlbiBgb3B0aW9ucy5tZXNzYWdlYCBtdXN0IGJlIGRlZmluZWQgaW5zdGVhZC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2VdXG4gKiAgIFtlbl1Ob3RpZmljYXRpb24gbWVzc2FnZS5bL2VuXVxuICogICBbamFd44OI44O844K544OI44Gr6KGo56S644GZ44KL5paH5a2X5YiX44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5idXR0b25MYWJlbF1cbiAqICAgW2VuXUxhYmVsIGZvciB0aGUgYnV0dG9uLlsvZW5dXG4gKiAgIFtqYV3norroqo3jg5zjgr/jg7Pjga7jg6njg5njg6vjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYG5vbmVgLCBgZmFkZWAsIGBhc2NlbmRgLCBgbGlmdGAgYW5kIGBmYWxsYC4gRGVmYXVsdCBpcyBgYXNjZW5kYCBmb3IgQW5kcm9pZCBhbmQgYGxpZnRgIGZvciBpT1MuWy9lbl1cbiAqICAgW2phXeODiOODvOOCueODiOOCkuihqOekuuOBmeOCi+mam+OBruOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglwibm9uZVwiLCBcImZhZGVcIiwgXCJhc2NlbmRcIiwgXCJsaWZ0XCIsIFwiZmFsbFwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy50aW1lb3V0XVxuICogICBbZW5dTnVtYmVyIG9mIG1pbGlzZWNvbmRzIHdoZXJlIHRoZSB0b2FzdCBpcyB2aXNpYmxlIGJlZm9yZSBoaWRpbmcgYXV0b21hdGljYWxseS5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZm9yY2VdXG4gKiAgIFtlbl1JZiBgdHJ1ZWAsIHRoZSB0b2FzdCBza2lwcyB0aGUgbm90aWZpY2F0aW9uIHF1ZXVlIGFuZCBpcyBzaG93biBpbW1lZGlhdGVseS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5pZF1cbiAqICAgW2VuXVRoZSBgPG9ucy10b2FzdD5gIGVsZW1lbnQncyBJRC5bL2VuXVxuICogICBbamFdb25zLXRvYXN06KaB57Sg44GuSUTjgIJbL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmNsYXNzXVxuICogICBbZW5dVGhlIGA8b25zLXRvYXN0PmAgZWxlbWVudCdzIGNsYXNzLlsvZW5dXG4gKiAgIFtqYV1vbnMtdG9hc3TopoHntKDjga5jbGFzc+OAglsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMubW9kaWZpZXJdXG4gKiAgIFtlbl1Nb2RpZmllciBmb3IgdGhlIGVsZW1lbnQuWy9lbl1cbiAqICAgW2phXeODiOODvOOCueODiOOBrm1vZGlmaWVy5bGe5oCn44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICogICBbZW5dRnVuY3Rpb24gdGhhdCBleGVjdXRlcyBhZnRlciB0b2FzdCBoYXMgYmVlbiBoaWRkZW4uWy9lbl1cbiAqICAgW2phXeODiOODvOOCueODiOOBjOmWieOBmOOCieOCjOOBn+aZguOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIERpc3BsYXkgYSBzaW1wbGUgbm90aWZpY2F0aW9uIHRvYXN0IHdpdGggYW4gb3B0aW9uYWwgYnV0dG9uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHNpbXBsZSBhY3Rpb25zLlxuICpcbiAqICAgICBJdCBjYW4gYmUgY2FsbGVkIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqXG4gKiAgICAgYGBgXG4gKiAgICAgb25zLm5vdGlmaWNhdGlvbi50b2FzdChtZXNzYWdlLCBvcHRpb25zKTtcbiAqICAgICBvbnMubm90aWZpY2F0aW9uLnRvYXN0KG9wdGlvbnMpO1xuICogICAgIGBgYFxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqL1xubm90aWZpY2F0aW9uLnRvYXN0ID0gKG1lc3NhZ2UsIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIHV0aWwuY2hlY2tNaXNzaW5nSW1wb3J0KCdUb2FzdCcpOyAvLyBUaHJvd3MgZXJyb3IsIG11c3QgYmUgaW5zaWRlIHByb21pc2VcblxuICAgIG9wdGlvbnMgPSBfbm9ybWFsaXplQXJndW1lbnRzKG1lc3NhZ2UsIG9wdGlvbnMsIHtcbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICBmb3JjZTogZmFsc2VcbiAgICB9KTtcblxuICAgIGxldCB0b2FzdCA9IHV0aWwuY3JlYXRlRWxlbWVudChgXG4gICAgICA8b25zLXRvYXN0PlxuICAgICAgICAke29wdGlvbnMubWVzc2FnZX1cbiAgICAgICAgJHtvcHRpb25zLmJ1dHRvbkxhYmVscyA/IGA8YnV0dG9uPiR7b3B0aW9ucy5idXR0b25MYWJlbHNbMF19PC9idXR0b24+YCA6ICcnfVxuICAgICAgPC9vbnMtdG9hc3Q+XG4gICAgYCk7XG5cbiAgICBfc2V0QXR0cmlidXRlcyh0b2FzdCwgb3B0aW9ucyk7XG5cbiAgICBjb25zdCBvcmlnaW5hbEhpZGUgPSB0b2FzdC5oaWRlLmJpbmQodG9hc3QpO1xuXG4gICAgY29uc3QgZmluaXNoID0gdmFsdWUgPT4ge1xuICAgICAgaWYgKHRvYXN0KSB7XG4gICAgICAgIG9yaWdpbmFsSGlkZSgpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICBpZiAodG9hc3QpIHtcbiAgICAgICAgICAgIHRvYXN0LnJlbW92ZSgpO1xuICAgICAgICAgICAgdG9hc3QgPSBudWxsO1xuICAgICAgICAgICAgb3B0aW9ucy5jYWxsYmFjayh2YWx1ZSk7XG4gICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAob3B0aW9ucy5idXR0b25MYWJlbHMpIHtcbiAgICAgIHV0aWwuZmluZENoaWxkKHRvYXN0Ll90b2FzdCwgJ2J1dHRvbicpLm9uY2xpY2sgPSAoKSA9PiBmaW5pc2goMCk7XG4gICAgfVxuXG4gICAgLy8gb3ZlcndyaXRlIHNvIHRoYXQgb25zLm5vdGlmaWNhdGlvbi5oaWRlIHJlc29sdmVzIHdoZW4gdG9hc3QuaGlkZSBpcyBjYWxsZWRcbiAgICB0b2FzdC5oaWRlID0gKCkgPT4gZmluaXNoKC0xKTtcblxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodG9hc3QpO1xuICAgIG9wdGlvbnMuY29tcGlsZSh0b2FzdCk7XG5cbiAgICBjb25zdCBzaG93ID0gKCkgPT4ge1xuICAgICAgdG9hc3QucGFyZW50RWxlbWVudCAmJiB0b2FzdC5zaG93KG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucy50aW1lb3V0KSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBmaW5pc2goLTEpLCBvcHRpb25zLnRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IG9wdGlvbnMuZm9yY2UgPyBzaG93KCkgOiBUb2FzdFF1ZXVlLmFkZChzaG93LCBwcm9taXNlKSk7XG4gIH0pO1xuXG4gIHJldHVybiBwcm9taXNlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbm90aWZpY2F0aW9uO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsLmpzJztcblxuLy8gVmFsaWRhdGUgcGFyYW1ldGVyc1xuY29uc3QgY2hlY2tPcHRpb25zID0gb3B0aW9ucyA9PiB7XG4gIGNvbnN0IGVyciA9IChwcm9wLCB0eXBlID0gJ0Z1bmN0aW9uJykgPT4gdXRpbC50aHJvdyhgXCJvcHRpb25zLiR7cHJvcH1cIiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mICR7dHlwZX1gKTtcbiAgY29uc3QgaGFzT3duUHJvcGVydHkgPSBwcm9wID0+IE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsIHByb3ApO1xuICBjb25zdCBpbnN0YW5jZU9mID0gKHByb3AsIHR5cGUgPSBGdW5jdGlvbikgPT4gb3B0aW9uc1twcm9wXSBpbnN0YW5jZW9mIHR5cGU7XG5cbiAgY29uc3QgYiA9ICdidXR0b25zJywgY2IgPSAnY2FsbGJhY2snLCBjID0gJ2NvbXBpbGUnLCBkID0gJ2Rlc3Ryb3knO1xuICAoIWhhc093blByb3BlcnR5KGIpIHx8ICFpbnN0YW5jZU9mKGIsIEFycmF5KSkgJiYgZXJyKGIsICdBcnJheScpO1xuICAoaGFzT3duUHJvcGVydHkoY2IpICYmICFpbnN0YW5jZU9mKGNiKSkgJiYgZXJyKGNiKTtcbiAgKGhhc093blByb3BlcnR5KGMpICYmICFpbnN0YW5jZU9mKGMpKSAmJiBlcnIoYyk7XG4gIChoYXNPd25Qcm9wZXJ0eShkKSAmJiAhaW5zdGFuY2VPZihkKSkgJiYgZXJyKGQpO1xufTtcblxuLy8gQWN0aW9uIFNoZWV0XG5leHBvcnQgZGVmYXVsdCAob3B0aW9ucyA9IHt9KSA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgdXRpbC5jaGVja01pc3NpbmdJbXBvcnQoJ0FjdGlvblNoZWV0Jyk7XG4gIGNoZWNrT3B0aW9ucyhvcHRpb25zKTtcblxuICAvLyBNYWluIGNvbXBvbmVudFxuICBsZXQgYWN0aW9uU2hlZXQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoYFxuICAgIDxvbnMtYWN0aW9uLXNoZWV0XG4gICAgICAke29wdGlvbnMudGl0bGUgPyBgdGl0bGU9XCIke29wdGlvbnMudGl0bGV9XCJgIDogJyd9XG4gICAgICAke29wdGlvbnMuY2FuY2VsYWJsZSA/ICdjYW5jZWxhYmxlJyA6ICcnfVxuICAgICAgJHtvcHRpb25zLm1vZGlmaWVyID8gYG1vZGlmaWVyPVwiJHtvcHRpb25zLm1vZGlmaWVyfVwiYCA6ICcnfVxuICAgICAgJHtvcHRpb25zLm1hc2tDb2xvciA/IGBtYXNrLWNvbG9yPVwiJHtvcHRpb25zLm1hc2tDb2xvcn1cImAgOiAnJ31cbiAgICAgICR7b3B0aW9ucy5pZCA/IGBpZD1cIiR7b3B0aW9ucy5pZH1cImAgOiAnJ31cbiAgICAgICR7b3B0aW9ucy5jbGFzcyA/IGBjbGFzcz1cIiR7b3B0aW9ucy5jbGFzc31cImAgOiAnJ31cbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLXNoZWV0XCI+PC9kaXY+XG4gICAgPC9vbnMtYWN0aW9uLXNoZWV0PlxuICBgKTtcblxuICAvLyBSZXNvbHZlIGFjdGlvbiBhbmQgY2xlYW4gdXBcbiAgY29uc3QgZmluaXNoID0gKGV2ZW50LCBpbmRleCA9IC0xKSA9PiB7XG4gICAgaWYgKGFjdGlvblNoZWV0KSB7XG4gICAgICBvcHRpb25zLmRlc3Ryb3kgJiYgb3B0aW9ucy5kZXN0cm95KGFjdGlvblNoZWV0KTtcblxuICAgICAgYWN0aW9uU2hlZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZGlhbG9nY2FuY2VsJywgZmluaXNoLCBmYWxzZSk7XG4gICAgICBhY3Rpb25TaGVldC5yZW1vdmUoKTtcbiAgICAgIGFjdGlvblNoZWV0ID0gbnVsbDtcblxuICAgICAgb3B0aW9ucy5jYWxsYmFjayAmJiBvcHRpb25zLmNhbGxiYWNrKGluZGV4KTtcbiAgICAgIHJlc29sdmUoaW5kZXgpO1xuICAgIH1cbiAgfTtcblxuICAvLyBMaW5rIGNhbmNlbCBoYW5kbGVyXG4gIGFjdGlvblNoZWV0LmFkZEV2ZW50TGlzdGVuZXIoJ2RpYWxvZ2NhbmNlbCcsIGZpbmlzaCwgZmFsc2UpO1xuXG4gIC8vIENyZWF0ZSBidXR0b25zIGFuZCBsaW5rIGFjdGlvbiBoYW5kbGVyXG4gIGNvbnN0IGJ1dHRvbnMgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gIG9wdGlvbnMuYnV0dG9ucy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGJ1dHRvbk9wdGlvbnMgPSAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSA/IHsgbGFiZWw6IGl0ZW0gfSA6IHsgLi4uaXRlbSB9O1xuICAgIGlmIChvcHRpb25zLmRlc3RydWN0aXZlID09PSBpbmRleCkge1xuICAgICAgYnV0dG9uT3B0aW9ucy5tb2RpZmllciA9IChidXR0b25PcHRpb25zLm1vZGlmaWVyIHx8ICcnKSArICcgZGVzdHJ1Y3RpdmUnO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1dHRvbiA9IHV0aWwuY3JlYXRlRWxlbWVudChgXG4gICAgICA8b25zLWFjdGlvbi1zaGVldC1idXR0b25cbiAgICAgICAgJHtidXR0b25PcHRpb25zLmljb24gPyBgaWNvbj1cIiR7YnV0dG9uT3B0aW9ucy5pY29ufVwiYCA6ICcnfVxuICAgICAgICAke2J1dHRvbk9wdGlvbnMubW9kaWZpZXIgPyBgbW9kaWZpZXI9XCIke2J1dHRvbk9wdGlvbnMubW9kaWZpZXJ9XCJgIDogJyd9XG4gICAgICA+XG4gICAgICAgICR7YnV0dG9uT3B0aW9ucy5sYWJlbH1cbiAgICAgIDwvb25zLWFjdGlvbi1zaGVldC1idXR0b24+XG4gICAgYCk7XG5cbiAgICBidXR0b24ub25jbGljayA9IGV2ZW50ID0+IGFjdGlvblNoZWV0LmhpZGUoKS50aGVuKCgpID0+IGZpbmlzaChldmVudCwgaW5kZXgpKTtcbiAgICBidXR0b25zLmFwcGVuZENoaWxkKGJ1dHRvbik7XG4gIH0pO1xuXG4gIC8vIEZpbmlzaCBjb21wb25lbnQgYW5kIGF0dGFjaFxuICB1dGlsLmZpbmRDaGlsZChhY3Rpb25TaGVldCwgJy5hY3Rpb24tc2hlZXQnKS5hcHBlbmRDaGlsZChidXR0b25zKTtcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhY3Rpb25TaGVldCk7XG4gIG9wdGlvbnMuY29tcGlsZSAmJiBvcHRpb25zLmNvbXBpbGUoZWwuZGlhbG9nKTtcblxuICAvLyBTaG93XG4gIHNldEltbWVkaWF0ZSgoKSA9PiBhY3Rpb25TaGVldC5zaG93KHtcbiAgICBhbmltYXRpb246IG9wdGlvbnMuYW5pbWF0aW9uLFxuICAgIGFuaW1hdGlvbk9wdGlvbnM6IG9wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc1xuICB9KSk7XG59KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBNaWNyb0V2ZW50IGZyb20gJy4vbWljcm9ldmVudC5qcyc7XG5cbmNvbnN0IGNyZWF0ZSA9ICgpID0+IHtcblxuICAvKipcbiAgICogQG9iamVjdCBvbnMub3JpZW50YXRpb25cbiAgICogQGNhdGVnb3J5IHV0aWxcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVV0aWxpdHkgbWV0aG9kcyBmb3Igb3JpZW50YXRpb24gZGV0ZWN0aW9uLlsvZW5dXG4gICAqICAgW2phXeeUu+mdouOBruOCquODquOCqOODs+ODhuODvOOCt+ODp+ODs+aknOefpeOBruOBn+OCgeOBruODpuODvOODhuOCo+ODquODhuOCo+ODoeOCveODg+ODieOCkuWPjuOCgeOBpuOBhOOCi+OCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqL1xuICBjb25zdCBvYmogPSB7XG4gICAgLyoqXG4gICAgICogQGV2ZW50IGNoYW5nZVxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqICAgW2VuXUZpcmVkIHdoZW4gdGhlIGRldmljZSBvcmllbnRhdGlvbiBjaGFuZ2VzLlsvZW5dXG4gICAgICogICBbamFd44OH44OQ44Kk44K544Gu44Kq44Oq44Ko44Oz44OG44O844K344On44Oz44GM5aSJ5YyW44GX44Gf6Zqb44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZXZlbnQuaXNQb3J0cmFpdFxuICAgICAqICAgW2VuXVdpbGwgYmUgdHJ1ZSBpZiB0aGUgY3VycmVudCBvcmllbnRhdGlvbiBpcyBwb3J0cmFpdCBtb2RlLlsvZW5dXG4gICAgICogICBbamFd54++5Zyo44Gu44Kq44Oq44Ko44Oz44OG44O844K344On44Oz44GMcG9ydHJhaXTjga7loLTlkIjjgat0cnVl44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgb25cbiAgICAgKiBAc2lnbmF0dXJlIG9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogICBbZW5dQWRkIGFuIGV2ZW50IGxpc3RlbmVyLlsvZW5dXG4gICAgICogICBbamFd44Kk44OZ44Oz44OI44Oq44K544OK44O844KS6L+95Yqg44GX44G+44GZ44CCWy9qYV1cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnROYW1lXG4gICAgICogICBbZW5dTmFtZSBvZiB0aGUgZXZlbnQuWy9lbl1cbiAgICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gICAgICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuWy9lbl1cbiAgICAgKiAgIFtqYV3jgZPjga7jgqTjg5njg7Pjg4jjgYznmbrngavjgZXjgozjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBvbmNlXG4gICAgICogQHNpZ25hdHVyZSBvbmNlKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogIFtlbl1BZGQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCdzIG9ubHkgdHJpZ2dlcmVkIG9uY2UuWy9lbl1cbiAgICAgKiAgW2phXeS4gOW6puOBoOOBkeWRvOOBs+WHuuOBleOCjOOCi+OCpOODmeODs+ODiOODquOCueODiuODvOOCkui/veWKoOOBl+OBvuOBmeOAglsvamFdXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gICAgICogICBbamFd44Kk44OZ44Oz44OI5ZCN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgICAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gICAgICogICBbamFd44Kk44OZ44Oz44OI44GM55m654Gr44GX44Gf6Zqb44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgb2ZmXG4gICAgICogQHNpZ25hdHVyZSBvZmYoZXZlbnROYW1lLCBbbGlzdGVuZXJdKVxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqICBbZW5dUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLiBJZiB0aGUgbGlzdGVuZXIgaXMgbm90IHNwZWNpZmllZCBhbGwgbGlzdGVuZXJzIGZvciB0aGUgZXZlbnQgdHlwZSB3aWxsIGJlIHJlbW92ZWQuWy9lbl1cbiAgICAgKiAgW2phXeOCpOODmeODs+ODiOODquOCueODiuODvOOCkuWJiumZpOOBl+OBvuOBmeOAguOCguOBl+OCpOODmeODs+ODiOODquOCueODiuODvOOCkuaMh+WumuOBl+OBquOBi+OBo+OBn+WgtOWQiOOBq+OBr+OAgeOBneOBruOCpOODmeODs+ODiOOBq+e0kOOBpeOBj+WFqOOBpuOBruOCpOODmeODs+ODiOODquOCueODiuODvOOBjOWJiumZpOOBleOCjOOBvuOBmeOAglsvamFdXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICAgICAqICAgW2VuXU5hbWUgb2YgdGhlIGV2ZW50LlsvZW5dXG4gICAgICogICBbamFd44Kk44OZ44Oz44OI5ZCN44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgICAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlsvZW5dXG4gICAgICogICBbamFd5YmK6Zmk44GZ44KL44Kk44OZ44Oz44OI44Oq44K544OK44O844KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICAgKi9cblxuICAgIC8vIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiB0byBkZXRlY3QgaWYgd2hldGhlciBjdXJyZW50IHNjcmVlbiBpcyBwb3J0cmFpdCBvciBub3RcbiAgICBfaXNQb3J0cmFpdDogZmFsc2UsXG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGlzUG9ydHJhaXRcbiAgICAgKiBAc2lnbmF0dXJlIGlzUG9ydHJhaXQoKVxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICogICBbZW5dV2lsbCBiZSB0cnVlIGlmIHRoZSBjdXJyZW50IG9yaWVudGF0aW9uIGlzIHBvcnRyYWl0IG1vZGUuWy9lbl1cbiAgICAgKiAgIFtqYV3jgqrjg6rjgqjjg7Pjg4bjg7zjgrfjg6fjg7PjgYxwb3J0cmFpdOODouODvOODieOBruWgtOWQiOOBq3RydWXjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgICAqIEBkZXNjcmlwdGlvblxuICAgICAqICAgW2VuXVJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBzY3JlZW4gb3JpZW50YXRpb24gaXMgcG9ydHJhaXQgb3Igbm90LlsvZW5dXG4gICAgICogICBbamFd44Kq44Oq44Ko44Oz44OG44O844K344On44Oz44GMcG9ydHJhaXTjg6Ljg7zjg4njgYvjganjgYbjgYvjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgICAqL1xuICAgIGlzUG9ydHJhaXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2lzUG9ydHJhaXQoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBpc0xhbmRzY2FwZVxuICAgICAqIEBzaWduYXR1cmUgaXNMYW5kc2NhcGUoKVxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAgICogICBbZW5dV2lsbCBiZSB0cnVlIGlmIHRoZSBjdXJyZW50IG9yaWVudGF0aW9uIGlzIGxhbmRzY2FwZSBtb2RlLlsvZW5dXG4gICAgICogICBbamFd44Kq44Oq44Ko44Oz44OG44O844K344On44Oz44GMbGFuZHNjYXBl44Oi44O844OJ44Gu5aC05ZCI44GrdHJ1ZeOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogICBbZW5dUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHNjcmVlbiBvcmllbnRhdGlvbiBpcyBsYW5kc2NhcGUgb3Igbm90LlsvZW5dXG4gICAgICogICBbamFd44Kq44Oq44Ko44Oz44OG44O844K344On44Oz44GMbGFuZHNjYXBl44Oi44O844OJ44GL44Gp44GG44GL44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICAgKi9cbiAgICBpc0xhbmRzY2FwZTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gIXRoaXMuaXNQb3J0cmFpdCgpO1xuICAgIH0sXG5cbiAgICBfaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgdGhpcy5fb25ET01Db250ZW50TG9hZGVkLmJpbmQodGhpcyksIGZhbHNlKTtcblxuICAgICAgaWYgKCdvcmllbnRhdGlvbicgaW4gd2luZG93KSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdvcmllbnRhdGlvbmNoYW5nZScsIHRoaXMuX29uT3JpZW50YXRpb25DaGFuZ2UuYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX29uUmVzaXplLmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faXNQb3J0cmFpdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LmlubmVySGVpZ2h0ID4gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX29uRE9NQ29udGVudExvYWRlZDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLl9pbnN0YWxsSXNQb3J0cmFpdEltcGxlbWVudGF0aW9uKCk7XG4gICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsIHtpc1BvcnRyYWl0OiB0aGlzLmlzUG9ydHJhaXQoKX0pO1xuICAgIH0sXG5cbiAgICBfaW5zdGFsbElzUG9ydHJhaXRJbXBsZW1lbnRhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBpc1BvcnRyYWl0ID0gd2luZG93LmlubmVyV2lkdGggPCB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICAgIGlmICghKCdvcmllbnRhdGlvbicgaW4gd2luZG93KSkge1xuICAgICAgICB0aGlzLl9pc1BvcnRyYWl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh3aW5kb3cub3JpZW50YXRpb24gJSAxODAgPT09IDApIHtcbiAgICAgICAgdGhpcy5faXNQb3J0cmFpdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBNYXRoLmFicyh3aW5kb3cub3JpZW50YXRpb24gJSAxODApID09PSAwID8gaXNQb3J0cmFpdCA6ICFpc1BvcnRyYWl0O1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faXNQb3J0cmFpdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBNYXRoLmFicyh3aW5kb3cub3JpZW50YXRpb24gJSAxODApID09PSA5MCA/IGlzUG9ydHJhaXQgOiAhaXNQb3J0cmFpdDtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX29uT3JpZW50YXRpb25DaGFuZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgaXNQb3J0cmFpdCA9IHRoaXMuX2lzUG9ydHJhaXQoKTtcblxuICAgICAgLy8gV2FpdCBmb3IgdGhlIGRpbWVuc2lvbnMgdG8gY2hhbmdlIGJlY2F1c2VcbiAgICAgIC8vIG9mIEFuZHJvaWQgaW5jb25zaXN0ZW5jeS5cbiAgICAgIGxldCBuSXRlciA9IDA7XG4gICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgbkl0ZXIrKztcblxuICAgICAgICBjb25zdCB3ID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgIGNvbnN0IGggPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICAgICAgaWYgKChpc1BvcnRyYWl0ICYmIHcgPD0gaCkgfHxcbiAgICAgICAgICAgKCFpc1BvcnRyYWl0ICYmIHcgPj0gaCkpIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2NoYW5nZScsIHtpc1BvcnRyYWl0OiBpc1BvcnRyYWl0fSk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgIH0gZWxzZSBpZiAobkl0ZXIgPT09IDUwKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLCB7aXNQb3J0cmFpdDogaXNQb3J0cmFpdH0pO1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICB9XG4gICAgICB9LCAyMCk7XG4gICAgfSxcblxuICAgIC8vIFJ1biBvbiBub3QgbW9iaWxlIGJyb3dzZXIuXG4gICAgX29uUmVzaXplOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZW1pdCgnY2hhbmdlJywge2lzUG9ydHJhaXQ6IHRoaXMuaXNQb3J0cmFpdCgpfSk7XG4gICAgfVxuICB9O1xuXG4gIE1pY3JvRXZlbnQubWl4aW4ob2JqKTtcblxuICByZXR1cm4gb2JqO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlKCkuX2luaXQoKTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4vdXRpbC5qcyc7XG5cbi8qKlxuICogQG9iamVjdCBvbnMubW9kaWZpZXJcbiAqIEBjYXRlZ29yeSB2aXN1YWxcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgVXRpbGl0eSBtZXRob2RzIHRvIGNoYW5nZSBtb2RpZmllciBhdHRyaWJ1dGVzIG9mIE9uc2VuIFVJIGVsZW1lbnRzLi5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogb25zLm1vZGlmaWVyLmFkZChteU9uc0lucHV0RWxlbWVudCwgJ3VuZGVyYmFyJyk7XG4gKiBvbnMubW9kaWZpZXIudG9nZ2xlKG15T25zVG9hc3RFbGVtZW50LCAnY3VzdG9tLW1vZGlmaWVyJyk7XG4gKlxuICovXG5leHBvcnQgZGVmYXVsdCB7XG4gIC8qKlxuICAgKiBAbWV0aG9kIGFkZFxuICAgKiBAc2lnbmF0dXJlIGFkZChlbGVtZW50LCBtb2RpZmllciBbLCBtb2RpZmllcl0pXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1BZGQgdGhlIHNwZWNpZmllZCBtb2RpZmllcnMgdG8gdGhlIGVsZW1lbnQgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgaW5jbHVkZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiAgIFtlbl1UYXJnZXQgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kaWZpZXJcbiAgICogICBbZW5dTmFtZSBvZiB0aGUgbW9kaWZpZXIuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGFkZDogKGVsZW1lbnQsIC4uLm1vZGlmaWVycykgPT4gbW9kaWZpZXJzLmZvckVhY2gobW9kaWZpZXIgPT4gdXRpbC5hZGRNb2RpZmllcihlbGVtZW50LCBtb2RpZmllcikpLFxuICAvKipcbiAgICogQG1ldGhvZCByZW1vdmVcbiAgICogQHNpZ25hdHVyZSByZW1vdmUoZWxlbWVudCwgbW9kaWZpZXIgWywgbW9kaWZpZXJdKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbW9kaWZpZXJzIGZyb20gdGhlIGVsZW1lbnQgaWYgdGhleSBhcmUgaW5jbHVkZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiAgIFtlbl1UYXJnZXQgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kaWZpZXJcbiAgICogICBbZW5dTmFtZSBvZiB0aGUgbW9kaWZpZXIuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHJlbW92ZTogKGVsZW1lbnQsIC4uLm1vZGlmaWVycykgPT4gbW9kaWZpZXJzLmZvckVhY2gobW9kaWZpZXIgPT4gdXRpbC5yZW1vdmVNb2RpZmllcihlbGVtZW50LCBtb2RpZmllcikpLFxuICAvKipcbiAgICogQG1ldGhvZCBjb250YWluc1xuICAgKiBAc2lnbmF0dXJlIGNvbnRhaW5zKGVsZW1lbnQsIG1vZGlmaWVyKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIG1vZGlmaWVyIGlzIGluY2x1ZGVkIGluIHRoZSBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogICBbZW5dVGFyZ2V0IGVsZW1lbnQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1vZGlmaWVyXG4gICAqICAgW2VuXU5hbWUgb2YgdGhlIG1vZGlmaWVyLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqICAgW2VuXWB0cnVlYCB3aGVuIHRoZSBzcGVjaWZpZWQgbW9kaWZpZXIgaXMgZm91bmQgaW4gdGhlIGVsZW1lbnQncyBgbW9kaWZpZXJgIGF0dHJpYnV0ZS4gYGZhbHNlYCBvdGhlcndpc2UuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGNvbnRhaW5zOiB1dGlsLmhhc01vZGlmaWVyLFxuICAvKipcbiAgICogQG1ldGhvZCB0b2dnbGVcbiAgICogQHNpZ25hdHVyZSB0b2dnbGUoZWxlbWVudCwgbW9kaWZpZXIgWywgZm9yY2VdKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVG9nZ2xlIHRoZSBzcGVjaWZpZWQgbW9kaWZpZXIuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiAgIFtlbl1UYXJnZXQgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kaWZpZXJcbiAgICogICBbZW5dTmFtZSBvZiB0aGUgbW9kaWZpZXIuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IGZvcmNlXG4gICAqICAgW2VuXUlmIGl0IGV2YWx1YXRlcyB0byB0cnVlLCBhZGQgc3BlY2lmaWVkIG1vZGlmaWVyIHZhbHVlLCBhbmQgaWYgaXQgZXZhbHVhdGVzIHRvIGZhbHNlLCByZW1vdmUgaXQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHRvZ2dsZTogdXRpbC50b2dnbGVNb2RpZmllclxufTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4vdXRpbC5qcyc7XG5pbXBvcnQgTWljcm9FdmVudCBmcm9tICcuL21pY3JvZXZlbnQuanMnO1xuXG5jb25zdCBzb2Z0d2FyZUtleWJvYXJkID0gbmV3IE1pY3JvRXZlbnQoKTtcbnNvZnR3YXJlS2V5Ym9hcmQuX3Zpc2libGUgPSBmYWxzZTtcblxuY29uc3Qgb25TaG93ID0gKCkgPT4ge1xuICBzb2Z0d2FyZUtleWJvYXJkLl92aXNpYmxlID0gdHJ1ZTtcbiAgc29mdHdhcmVLZXlib2FyZC5lbWl0KCdzaG93Jyk7XG59O1xuXG5jb25zdCBvbkhpZGUgPSAoKSA9PiB7XG4gIHNvZnR3YXJlS2V5Ym9hcmQuX3Zpc2libGUgPSBmYWxzZTtcbiAgc29mdHdhcmVLZXlib2FyZC5lbWl0KCdoaWRlJyk7XG59O1xuXG5jb25zdCBiaW5kRXZlbnRzID0gKCkgPT4ge1xuICBpZiAodHlwZW9mIEtleWJvYXJkICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJ0aW5tb3NlL2NvcmRvdmEta2V5Ym9hcmQvYmxvYi85NWYzZGEzYTM4ZDhmOGUxZmE0MWZiZjQwMTQ1MzUyYzEzNTM1YTAwL1JFQURNRS5tZFxuICAgIEtleWJvYXJkLm9uc2hvdyA9IG9uU2hvdztcbiAgICBLZXlib2FyZC5vbmhpZGUgPSBvbkhpZGU7XG4gICAgc29mdHdhcmVLZXlib2FyZC5lbWl0KCdpbml0Jywge3Zpc2libGU6IEtleWJvYXJkLmlzVmlzaWJsZX0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNvcmRvdmEucGx1Z2lucyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvcmRvdmEucGx1Z2lucy5LZXlib2FyZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZHJpZnR5Y28vaW9uaWMtcGx1Z2lucy1rZXlib2FyZC9ibG9iL2NhMjdlY2YvUkVBRE1FLm1kXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ25hdGl2ZS5rZXlib2FyZHNob3cnLCBvblNob3cpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCduYXRpdmUua2V5Ym9hcmRoaWRlJywgb25IaWRlKTtcbiAgICBzb2Z0d2FyZUtleWJvYXJkLmVtaXQoJ2luaXQnLCB7dmlzaWJsZTogY29yZG92YS5wbHVnaW5zLktleWJvYXJkLmlzVmlzaWJsZX0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBub1BsdWdpbkVycm9yID0gKCkgPT4ge1xuICB1dGlsLndhcm4oJ29ucy1rZXlib2FyZDogQ29yZG92YSBLZXlib2FyZCBwbHVnaW4gaXMgbm90IHByZXNlbnQuJyk7XG59O1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsICgpID0+IHtcbiAgaWYgKCFiaW5kRXZlbnRzKCkpIHtcbiAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW29ucy1rZXlib2FyZC1hY3RpdmVdJykgfHxcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tvbnMta2V5Ym9hcmQtaW5hY3RpdmVdJykpIHtcbiAgICAgIG5vUGx1Z2luRXJyb3IoKTtcbiAgICB9XG5cbiAgICBzb2Z0d2FyZUtleWJvYXJkLm9uID0gbm9QbHVnaW5FcnJvcjtcbiAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHNvZnR3YXJlS2V5Ym9hcmQ7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5jb25zdCBnZW5lcmF0ZUlkID0gKGZ1bmN0aW9uKCkge1xuICBsZXQgaSA9IDA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gaSsrO1xuICB9O1xufSkoKTtcblxuLyoqXG4gKiBEb29yIGxvY2tpbmcgc3lzdGVtLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmxvZ11cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG9vckxvY2sge1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuX2xvY2tMaXN0ID0gW107XG4gICAgdGhpcy5fd2FpdExpc3QgPSBbXTtcbiAgICB0aGlzLl9sb2cgPSBvcHRpb25zLmxvZyB8fCBmdW5jdGlvbigpIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgbG9jay5cbiAgICpcbiAgICogQHJldHVybiB7RnVuY3Rpb259IENhbGxiYWNrIGZvciB1bmxvY2tpbmcuXG4gICAqL1xuICBsb2NrKCkge1xuICAgIGNvbnN0IHVubG9jayA9ICgpID0+IHtcbiAgICAgIHRoaXMuX3VubG9jayh1bmxvY2spO1xuICAgIH07XG4gICAgdW5sb2NrLmlkID0gZ2VuZXJhdGVJZCgpO1xuICAgIHRoaXMuX2xvY2tMaXN0LnB1c2godW5sb2NrKTtcbiAgICB0aGlzLl9sb2coJ2xvY2s6ICcgKyAodW5sb2NrLmlkKSk7XG5cbiAgICByZXR1cm4gdW5sb2NrO1xuICB9XG5cbiAgX3VubG9jayhmbikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fbG9ja0xpc3QuaW5kZXhPZihmbik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGZ1bmN0aW9uIGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBsb2NrIGxpc3QuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fbG9ja0xpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLl9sb2coJ3VubG9jazogJyArIGZuLmlkKTtcblxuICAgIHRoaXMuX3RyeVRvRnJlZVdhaXRMaXN0KCk7XG4gIH1cblxuICBfdHJ5VG9GcmVlV2FpdExpc3QoKSB7XG4gICAgd2hpbGUgKCF0aGlzLmlzTG9ja2VkKCkgJiYgdGhpcy5fd2FpdExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fd2FpdExpc3Quc2hpZnQoKSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIGZvciB3YWl0aW5nIHVubG9ja2VkIGRvb3IuXG4gICAqXG4gICAqIEBwYXJhbXMge0Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBvbiB1bmxvY2tpbmcgdGhlIGRvb3IgY29tcGxldGVseS5cbiAgICovXG4gIHdhaXRVbmxvY2soY2FsbGJhY2spIHtcbiAgICBpZiAoIShjYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY2FsbGJhY2sgcGFyYW0gbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzTG9ja2VkKCkpIHtcbiAgICAgIHRoaXMuX3dhaXRMaXN0LnB1c2goY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNMb2NrZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2tMaXN0Lmxlbmd0aCA+IDA7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5pbXBvcnQgdXRpbCBmcm9tICcuL3V0aWwuanMnO1xuaW1wb3J0IGludGVybmFsIGZyb20gJy4vaW50ZXJuYWwvaW5kZXguanMnO1xuXG4vLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBnbG9iYWwgUGFnZUxvYWRlci5cbmZ1bmN0aW9uIGxvYWRQYWdlKHtwYWdlLCBwYXJlbnQsIHBhcmFtcyA9IHt9fSwgZG9uZSwgZXJyb3IpIHtcbiAgaW50ZXJuYWwuZ2V0UGFnZUhUTUxBc3luYyhwYWdlKS50aGVuKGh0bWwgPT4ge1xuICAgIGNvbnN0IHBhZ2VFbGVtZW50ID0gdXRpbC5jcmVhdGVFbGVtZW50KGh0bWwpO1xuICAgIHBhcmVudC5hcHBlbmRDaGlsZChwYWdlRWxlbWVudCk7XG5cbiAgICBkb25lKHBhZ2VFbGVtZW50KTtcbiAgfSkuY2F0Y2goZSA9PiBlcnJvcihlKSk7XG59XG5cbmZ1bmN0aW9uIHVubG9hZFBhZ2UoZWxlbWVudCkge1xuICBpZiAoZWxlbWVudC5fZGVzdHJveSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgZWxlbWVudC5fZGVzdHJveSgpO1xuICB9IGVsc2Uge1xuICAgIGVsZW1lbnQucmVtb3ZlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhZ2VMb2FkZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXSBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGhhcyBcImVsZW1lbnRcIiBwcm9wZXJ0eSBhbmQgXCJ1bmxvYWRcIiBmdW5jdGlvbi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGxvYWRlciwgdW5sb2FkZXIpIHtcbiAgICB0aGlzLl9sb2FkZXIgPSBsb2FkZXIgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IGxvYWRlciA6IGxvYWRQYWdlO1xuICAgIHRoaXMuX3VubG9hZGVyID0gdW5sb2FkZXIgaW5zdGFuY2VvZiBGdW5jdGlvbiA/IHVubG9hZGVyIDogdW5sb2FkUGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgaW50ZXJuYWwgbG9hZGVyIGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgc2V0IGludGVybmFsTG9hZGVyKGZuKSB7XG4gICAgaWYgKCEoZm4gaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcbiAgICAgIHRocm93IEVycm9yKCdGaXJzdCBwYXJhbWV0ZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBGdW5jdGlvbicpO1xuICAgIH1cbiAgICB0aGlzLl9sb2FkZXIgPSBmbjtcbiAgfVxuXG4gIGdldCBpbnRlcm5hbExvYWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fbG9hZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvcHRpb25zLnBhZ2VcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvcHRpb25zLnBhcmVudCBBIGxvY2F0aW9uIHRvIGxvYWQgcGFnZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnBhcmFtc10gRXh0cmEgcGFyYW1ldGVycyBmb3Igb25zLXBhZ2UuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmUgVGFrZSBhbiBvYmplY3QgdGhhdCBoYXMgXCJlbGVtZW50XCIgcHJvcGVydHkgYW5kIFwidW5sb2FkXCIgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGVycm9yIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGFuIGVycm9yLlxuICAgKi9cbiAgbG9hZCh7cGFnZSwgcGFyZW50LCBwYXJhbXMgPSB7fX0sIGRvbmUsIGVycm9yKSB7XG4gICAgdGhpcy5fbG9hZGVyKHtwYWdlLCBwYXJlbnQsIHBhcmFtc30sIHBhZ2VFbGVtZW50ID0+IHtcbiAgICAgIGlmICghKHBhZ2VFbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ3BhZ2VFbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRWxlbWVudC4nKTtcbiAgICAgIH1cblxuICAgICAgZG9uZShwYWdlRWxlbWVudCk7XG4gICAgfSwgZXJyb3IpO1xuICB9XG5cbiAgdW5sb2FkKHBhZ2VFbGVtZW50KSB7XG4gICAgaWYgKCEocGFnZUVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ3BhZ2VFbGVtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRWxlbWVudC4nKTtcbiAgICB9XG5cbiAgICB0aGlzLl91bmxvYWRlcihwYWdlRWxlbWVudCk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRQYWdlTG9hZGVyID0gbmV3IFBhZ2VMb2FkZXIoKTtcblxuZXhwb3J0IGNvbnN0IGluc3RhbnRQYWdlTG9hZGVyID0gbmV3IFBhZ2VMb2FkZXIoXG4gIGZ1bmN0aW9uKHtwYWdlLCBwYXJlbnQsIHBhcmFtcyA9IHt9fSwgZG9uZSkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQocGFnZS50cmltKCkpO1xuICAgIHBhcmVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcblxuICAgIGRvbmUoZWxlbWVudCk7XG4gIH0sXG4gIHVubG9hZFBhZ2Vcbik7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuL3V0aWwuanMnO1xuaW1wb3J0IGVsZW1lbnRzIGZyb20gJy4vZWxlbWVudHMuanMnO1xuaW1wb3J0IGFuaW1pdCBmcm9tICcuL2FuaW1pdC5qcyc7XG5pbXBvcnQgR2VzdHVyZURldGVjdG9yIGZyb20gJy4vZ2VzdHVyZS1kZXRlY3Rvci5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi9wbGF0Zm9ybS5qcyc7XG5pbXBvcnQgbm90aWZpY2F0aW9uIGZyb20gJy4vbm90aWZpY2F0aW9uLmpzJztcbmltcG9ydCBhY3Rpb25TaGVldCBmcm9tICcuL2FjdGlvbi1zaGVldC5qcyc7XG5pbXBvcnQgaW50ZXJuYWwgZnJvbSAnLi9pbnRlcm5hbC9pbmRleC5qcyc7XG5pbXBvcnQgb3JpZW50YXRpb24gZnJvbSAnLi9vcmllbnRhdGlvbi5qcyc7XG5pbXBvcnQgbW9kaWZpZXIgZnJvbSAnLi9tb2RpZmllci5qcyc7XG5pbXBvcnQgc29mdHdhcmVLZXlib2FyZCBmcm9tICcuL3NvZnR3YXJlLWtleWJvYXJkLmpzJztcbmltcG9ydCBwYWdlQXR0cmlidXRlRXhwcmVzc2lvbiBmcm9tICcuL3BhZ2UtYXR0cmlidXRlLWV4cHJlc3Npb24uanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgRG9vckxvY2sgZnJvbSAnLi9kb29ybG9jay5qcyc7XG5pbXBvcnQgeyBkZWZhdWx0UGFnZUxvYWRlciwgUGFnZUxvYWRlciB9IGZyb20gJy4vcGFnZS1sb2FkZXIuanMnO1xuXG4vKipcbiAqIEBvYmplY3Qgb25zXG4gKiBAY2F0ZWdvcnkgdXRpbFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtqYV1PbnNlbiBVSeOBp+WIqeeUqOOBp+OBjeOCi+OCsOODreODvOODkOODq+OBquOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gKiAgIFtlbl1BIGdsb2JhbCBvYmplY3QgdGhhdCdzIHVzZWQgaW4gT25zZW4gVUkuIFsvZW5dXG4gKi9cbmNvbnN0IG9ucyA9IHtcbiAgYW5pbWl0LFxuICBkZWZhdWx0UGFnZUxvYWRlcixcbiAgZWxlbWVudHMsXG4gIEdlc3R1cmVEZXRlY3RvcixcbiAgbW9kaWZpZXIsXG4gIG5vdGlmaWNhdGlvbixcbiAgb3JpZW50YXRpb24sXG4gIHBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uLFxuICBQYWdlTG9hZGVyLFxuICBwbGF0Zm9ybSxcbiAgc29mdHdhcmVLZXlib2FyZCxcbiAgX2F1dG9TdHlsZTogYXV0b1N0eWxlLFxuICBfaW50ZXJuYWw6IGludGVybmFsLFxuICBfcmVhZHlMb2NrOiBuZXcgRG9vckxvY2soKSxcbiAgX3V0aWw6IHV0aWwsXG59O1xuXG5vbnMucGxhdGZvcm0uc2VsZWN0KCh3aW5kb3cubG9jYXRpb24uc2VhcmNoLm1hdGNoKC9wbGF0Zm9ybT0oW1xcdy1dKykvKSB8fCBbXSlbMV0pO1xuXG53YWl0RGV2aWNlUmVhZHkoKTtcblxuY29uc3QgcmVhZHlFcnJvciA9IGFmdGVyID0+IHV0aWwudGhyb3coYFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkICR7YWZ0ZXIgPyAnYWZ0ZXInIDogJ2JlZm9yZSd9IG9ucy5pc1JlYWR5KCkgaXMgdHJ1ZWApO1xuXG4vKipcbiAqIEBtZXRob2QgaXNSZWFkeVxuICogQHNpZ25hdHVyZSBpc1JlYWR5KClcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKiAgIFtlbl1XaWxsIGJlIHRydWUgaWYgT25zZW4gVUkgaXMgaW5pdGlhbGl6ZWQuWy9lbl1cbiAqICAgW2phXeWIneacn+WMluOBleOCjOOBpuOBhOOCi+OBi+OBqeOBhuOBi+OCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVJldHVybnMgdHJ1ZSBpZiBPbnNlbiBVSSBpcyBpbml0aWFsaXplZC5bL2VuXVxuICogICBbamFdT25zZW4gVUnjgYzjgZnjgafjgavliJ3mnJ/ljJbjgZXjgozjgabjgYTjgovjgYvjganjgYbjgYvjgpLov5TjgZnjg6Hjgr3jg4Pjg4njgafjgZnjgIJbL2phXVxuICovXG5vbnMuaXNSZWFkeSA9ICgpID0+IHtcbiAgcmV0dXJuICFvbnMuX3JlYWR5TG9jay5pc0xvY2tlZCgpO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIGlzV2ViVmlld1xuICogQHNpZ25hdHVyZSBpc1dlYlZpZXcoKVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqICAgW2VuXVdpbGwgYmUgdHJ1ZSBpZiB0aGUgYXBwIGlzIHJ1bm5pbmcgaW4gQ29yZG92YS5bL2VuXVxuICogICBbamFdQ29yZG92YeOBp+Wun+ihjOOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq3RydWXjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1SZXR1cm5zIHRydWUgaWYgcnVubmluZyBpbnNpZGUgQ29yZG92YS5bL2VuXVxuICogICBbamFdQ29yZG92YeOBp+Wun+ihjOOBleOCjOOBpuOBhOOCi+OBi+OBqeOBhuOBi+OCkui/lOOBmeODoeOCveODg+ODieOBp+OBmeOAglsvamFdXG4gKi9cbm9ucy5pc1dlYlZpZXcgPSBvbnMucGxhdGZvcm0uaXNXZWJWaWV3O1xuXG4vKipcbiAqIEBtZXRob2QgcmVhZHlcbiAqIEBzaWduYXR1cmUgcmVhZHkoY2FsbGJhY2spXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2phXeOCouODl+ODquOBruWIneacn+WMluOBq+WIqeeUqOOBmeOCi+ODoeOCveODg+ODieOBp+OBmeOAgua4oeOBleOCjOOBn+mWouaVsOOBr+OAgU9uc2VuIFVJ44Gu5Yid5pyf5YyW44GM57WC5LqG44GX44Gm44GE44KL5pmC54K544Gn5b+F44Ga5ZG844Gw44KM44G+44GZ44CCWy9qYV1cbiAqICAgW2VuXU1ldGhvZCB1c2VkIHRvIHdhaXQgZm9yIGFwcCBpbml0aWFsaXphdGlvbi4gV2FpdHMgZm9yIGBET01Db250ZW50TG9hZGVkYCBhbmQgYGRldmljZXJlYWR5YCwgd2hlbiBuZWNlc3NhcnksIGJlZm9yZSBleGVjdXRpbmcgdGhlIGNhbGxiYWNrLlsvZW5dXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogICBbZW5dRnVuY3Rpb24gdGhhdCBleGVjdXRlcyBhZnRlciBPbnNlbiBVSSBoYXMgYmVlbiBpbml0aWFsaXplZC5bL2VuXVxuICogICBbamFdT25zZW4gVUnjgYzliJ3mnJ/ljJbjgYzlrozkuobjgZfjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICovXG5vbnMucmVhZHkgPSBjYWxsYmFjayA9PiB7XG4gIGlmIChvbnMuaXNSZWFkeSgpKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfSBlbHNlIHtcbiAgICBvbnMuX3JlYWR5TG9jay53YWl0VW5sb2NrKGNhbGxiYWNrKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAbWV0aG9kIHNldERlZmF1bHREZXZpY2VCYWNrQnV0dG9uTGlzdGVuZXJcbiAqIEBzaWduYXR1cmUgc2V0RGVmYXVsdERldmljZUJhY2tCdXR0b25MaXN0ZW5lcihsaXN0ZW5lcilcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyXG4gKiAgIFtlbl1GdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIHdoZW4gZGV2aWNlIGJhY2sgYnV0dG9uIGlzIHByZXNzZWQuIE11c3QgYmUgY2FsbGVkIG9uIGBvbnMucmVhZHlgLlsvZW5dXG4gKiAgIFtqYV3jg4fjg5DjgqTjgrnjga7jg5Djg4Pjgq/jg5zjgr/jg7PjgYzmirzjgZXjgozjgZ/mmYLjgavlrp/ooYzjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1TZXQgZGVmYXVsdCBoYW5kbGVyIGZvciBkZXZpY2UgYmFjayBidXR0b24uWy9lbl1cbiAqICAgW2phXeODh+ODkOOCpOOCueOBruODkOODg+OCr+ODnOOCv+ODs+OBruOBn+OCgeOBruODh+ODleOCqeODq+ODiOOBruODj+ODs+ODieODqeOCkuioreWumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cbm9ucy5zZXREZWZhdWx0RGV2aWNlQmFja0J1dHRvbkxpc3RlbmVyID0gZnVuY3Rpb24obGlzdGVuZXIpIHtcbiAgaWYgKCFvbnMuaXNSZWFkeSgpKSB7XG4gICAgcmVhZHlFcnJvcih0cnVlKTtcbiAgfVxuICBvbnMuX2RlZmF1bHREZXZpY2VCYWNrQnV0dG9uSGFuZGxlci5zZXRMaXN0ZW5lcihsaXN0ZW5lcik7XG59O1xuXG4vKipcbiAqIEBtZXRob2QgZGlzYWJsZURldmljZUJhY2tCdXR0b25IYW5kbGVyXG4gKiBAc2lnbmF0dXJlIGRpc2FibGVEZXZpY2VCYWNrQnV0dG9uSGFuZGxlcigpXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl1EaXNhYmxlIGRldmljZSBiYWNrIGJ1dHRvbiBldmVudCBoYW5kbGVyLiBNdXN0IGJlIGNhbGxlZCBvbiBgb25zLnJlYWR5YC5bL2VuXVxuICogW2phXeODh+ODkOOCpOOCueOBruODkOODg+OCr+ODnOOCv+ODs+OBruOCpOODmeODs+ODiOOCkuWPl+OBkeS7mOOBkeOBquOBhOOCiOOBhuOBq+OBl+OBvuOBmeOAglsvamFdXG4gKi9cbm9ucy5kaXNhYmxlRGV2aWNlQmFja0J1dHRvbkhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCFvbnMuaXNSZWFkeSgpKSB7XG4gICAgcmVhZHlFcnJvcih0cnVlKTtcbiAgfVxuICBpbnRlcm5hbC5kYmJEaXNwYXRjaGVyLmRpc2FibGUoKTtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBlbmFibGVEZXZpY2VCYWNrQnV0dG9uSGFuZGxlclxuICogQHNpZ25hdHVyZSBlbmFibGVEZXZpY2VCYWNrQnV0dG9uSGFuZGxlcigpXG4gKiBAZGVzY3JpcHRpb25cbiAqIFtlbl1FbmFibGUgZGV2aWNlIGJhY2sgYnV0dG9uIGV2ZW50IGhhbmRsZXIuIE11c3QgYmUgY2FsbGVkIG9uIGBvbnMucmVhZHlgLlsvZW5dXG4gKiBbamFd44OH44OQ44Kk44K544Gu44OQ44OD44Kv44Oc44K/44Oz44Gu44Kk44OZ44Oz44OI44KS5Y+X44GR5LuY44GR44KL44KI44GG44Gr44GX44G+44GZ44CCWy9qYV1cbiAqL1xub25zLmVuYWJsZURldmljZUJhY2tCdXR0b25IYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gIGlmICghb25zLmlzUmVhZHkoKSkge1xuICAgIHJlYWR5RXJyb3IodHJ1ZSk7XG4gIH1cbiAgaW50ZXJuYWwuZGJiRGlzcGF0Y2hlci5lbmFibGUoKTtcbn07XG5cbm9ucy5maXJlRGV2aWNlQmFja0J1dHRvbkV2ZW50ID0gZnVuY3Rpb24oKSB7XG4gIGludGVybmFsLmRiYkRpc3BhdGNoZXIuZmlyZURldmljZUJhY2tCdXR0b25FdmVudCgpO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIGVuYWJsZUF1dG9TdGF0dXNCYXJGaWxsXG4gKiBAc2lnbmF0dXJlIGVuYWJsZUF1dG9TdGF0dXNCYXJGaWxsKClcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dRW5hYmxlIHN0YXR1cyBiYXIgZmlsbCBmZWF0dXJlIG9uIGlPUzcgYW5kIGFib3ZlIChleGNlcHQgZm9yIGlQaG9uZSBYKS4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGBvbnMucmVhZHlgLlsvZW5dXG4gKiAgIFtqYV1pT1M35Lul5LiK77yIaVBob25lIFjjga/pmaTjgY/vvInjgafjgIHjgrnjg4bjg7zjgr/jgrnjg5Djg7zpg6jliIbjga7pq5jjgZXjgpLoh6rli5XnmoTjgavln4vjgoHjgovlh6bnkIbjgpLmnInlirnjgavjgZfjgb7jgZnjgIJbL2phXVxuICovXG5vbnMuZW5hYmxlQXV0b1N0YXR1c0JhckZpbGwgPSAoKSA9PiB7XG4gIGlmIChvbnMuaXNSZWFkeSgpKSB7XG4gICAgcmVhZHlFcnJvcihmYWxzZSk7XG4gIH1cbiAgaW50ZXJuYWwuY29uZmlnLmF1dG9TdGF0dXNCYXJGaWxsID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBkaXNhYmxlQXV0b1N0YXR1c0JhckZpbGxcbiAqIEBzaWduYXR1cmUgZGlzYWJsZUF1dG9TdGF0dXNCYXJGaWxsKClcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dRGlzYWJsZSBzdGF0dXMgYmFyIGZpbGwgZmVhdHVyZSBvbiBpT1M3IGFuZCBhYm92ZSAoZXhjZXB0IGZvciBpUGhvbmUgWCkuIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBgb25zLnJlYWR5YC5bL2VuXVxuICogICBbamFdaU9TN+S7peS4iu+8iGlQaG9uZSBY44Gv6Zmk44GP77yJ44Gn44CB44K544OG44O844K/44K544OQ44O86YOo5YiG44Gu6auY44GV44KS6Ieq5YuV55qE44Gr5Z+L44KB44KL5Yem55CG44KS54Sh5Yq544Gr44GX44G+44GZ44CCWy9qYV1cbiAqL1xub25zLmRpc2FibGVBdXRvU3RhdHVzQmFyRmlsbCA9ICgpID0+IHtcbiAgaWYgKG9ucy5pc1JlYWR5KCkpIHtcbiAgICByZWFkeUVycm9yKGZhbHNlKTtcbiAgfVxuICBpbnRlcm5hbC5jb25maWcuYXV0b1N0YXR1c0JhckZpbGwgPSBmYWxzZTtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBtb2NrU3RhdHVzQmFyXG4gKiBAc2lnbmF0dXJlIG1vY2tTdGF0dXNCYXIoKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1DcmVhdGVzIGEgc3RhdGljIGVsZW1lbnQgc2ltaWxhciB0byBpT1Mgc3RhdHVzIGJhci4gT25seSB1c2VmdWwgZm9yIGJyb3dzZXIgdGVzdGluZy4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGBvbnMucmVhZHlgLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICovXG5vbnMubW9ja1N0YXR1c0JhciA9ICgpID0+IHtcbiAgaWYgKG9ucy5pc1JlYWR5KCkpIHtcbiAgICByZWFkeUVycm9yKGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IG1vY2sgPSAoKSA9PiB7XG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNoaWxkcmVuWzBdIHx8ICFkb2N1bWVudC5ib2R5LmNoaWxkcmVuWzBdLmNsYXNzTGlzdC5jb250YWlucygnb25zLXN0YXR1cy1iYXItbW9jaycpKSB7XG4gICAgICBjb25zdCBhbmRyb2lkID0gcGxhdGZvcm0uaXNBbmRyb2lkKCksIGkgPSBpID0+IGA8aSBjbGFzcz1cIiR7aS5zcGxpdCgnLScpWzBdfSAke2l9XCI+PC9pPmA7XG4gICAgICBjb25zdCBsZWZ0ID0gYW5kcm9pZCA/IGAke2koJ3ptZGktdHdpdHRlcicpfSAke2koJ3ptZGktZ29vZ2xlLXBsYXknKX1gIDogYE5vIFNJTSAke2koJ2ZhLXdpZmknKX1gLFxuICAgICAgICBjZW50ZXIgPSBhbmRyb2lkID8gJycgOiAnMTI6MjggUE0nLFxuICAgICAgICByaWdodCA9IGFuZHJvaWQgPyBgJHtpKCd6bWRpLW5ldHdvcmsnKX0gJHtpKCd6bWRpLXdpZmknKX0gJHtpKCd6bWRpLWJhdHRlcnknKX0gMTI6MjggUE1gIDogYDgwJSAke2koJ2ZhLWJhdHRlcnktdGhyZWUtcXVhcnRlcnMnKX1gO1xuXG4gICAgICBkb2N1bWVudC5ib2R5Lmluc2VydEJlZm9yZSh1dGlsLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIGA8ZGl2IGNsYXNzPVwib25zLXN0YXR1cy1iYXItbW9jayAke2FuZHJvaWQgPyAnYW5kcm9pZCcgOiAnaW9zJ31cIj5gICtcbiAgICAgICAgICBgPGRpdj4ke2xlZnR9PC9kaXY+PGRpdj4ke2NlbnRlcn08L2Rpdj48ZGl2PiR7cmlnaHR9PC9kaXY+YCArXG4gICAgICAgIGA8L2Rpdj5gXG4gICAgICApLCBkb2N1bWVudC5ib2R5LmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgfTtcblxuICBkb2N1bWVudC5ib2R5XG4gICAgPyBtb2NrKClcbiAgICA6IGludGVybmFsLndhaXRET01Db250ZW50TG9hZGVkKG1vY2spO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIGRpc2FibGVBbmltYXRpb25zXG4gKiBAc2lnbmF0dXJlIGRpc2FibGVBbmltYXRpb25zKClcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dRGlzYWJsZSBhbGwgYW5pbWF0aW9ucy4gQ291bGQgYmUgaGFuZHkgZm9yIHRlc3RpbmcgYW5kIG9sZGVyIGRldmljZXMuWy9lbl1cbiAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+OCkuWFqOOBpueEoeWKueOBq+OBl+OBvuOBmeOAguODhuOCueODiOOBrumam+OBq+S+v+WIqeOBp+OBmeOAglsvamFdXG4gKi9cbm9ucy5kaXNhYmxlQW5pbWF0aW9ucyA9ICgpID0+IHtcbiAgaW50ZXJuYWwuY29uZmlnLmFuaW1hdGlvbnNEaXNhYmxlZCA9IHRydWU7XG59O1xuXG4vKipcbiAqIEBtZXRob2QgZW5hYmxlQW5pbWF0aW9uc1xuICogQHNpZ25hdHVyZSBlbmFibGVBbmltYXRpb25zKClcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dRW5hYmxlIGFuaW1hdGlvbnMgKGRlZmF1bHQpLlsvZW5dXG4gKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PjgpLmnInlirnjgavjgZfjgb7jgZnjgIJbL2phXVxuICovXG5vbnMuZW5hYmxlQW5pbWF0aW9ucyA9ICgpID0+IHtcbiAgaW50ZXJuYWwuY29uZmlnLmFuaW1hdGlvbnNEaXNhYmxlZCA9IGZhbHNlO1xufTtcblxub25zLl9kaXNhYmxlV2FybmluZ3MgPSAoKSA9PiB7XG4gIGludGVybmFsLmNvbmZpZy53YXJuaW5nc0Rpc2FibGVkID0gdHJ1ZTtcbn07XG5cbm9ucy5fZW5hYmxlV2FybmluZ3MgPSAoKSA9PiB7XG4gIGludGVybmFsLmNvbmZpZy53YXJuaW5nc0Rpc2FibGVkID0gZmFsc2U7XG59O1xuXG4vKipcbiAqIEBtZXRob2QgZGlzYWJsZUF1dG9TdHlsaW5nXG4gKiBAc2lnbmF0dXJlIGRpc2FibGVBdXRvU3R5bGluZygpXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXURpc2FibGUgYXV0b21hdGljIHN0eWxpbmcuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKi9cbm9ucy5kaXNhYmxlQXV0b1N0eWxpbmcgPSBhdXRvU3R5bGUuZGlzYWJsZTtcblxuLyoqXG4gKiBAbWV0aG9kIGVuYWJsZUF1dG9TdHlsaW5nXG4gKiBAc2lnbmF0dXJlIGVuYWJsZUF1dG9TdHlsaW5nKClcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dRW5hYmxlIGF1dG9tYXRpYyBzdHlsaW5nIGJhc2VkIG9uIE9TIChkZWZhdWx0KS5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqL1xub25zLmVuYWJsZUF1dG9TdHlsaW5nID0gYXV0b1N0eWxlLmVuYWJsZTtcblxuLyoqXG4gKiBAbWV0aG9kIGRpc2FibGVJY29uQXV0b1ByZWZpeFxuICogQHNpZ25hdHVyZSBkaXNhYmxlSWNvbkF1dG9QcmVmaXgoKVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1EaXNhYmxlIGFkZGluZyBgZmEtYCBwcmVmaXggYXV0b21hdGljYWxseSB0byBgb25zLWljb25gIGNsYXNzZXMuIFVzZWZ1bCB3aGVuIGluY2x1ZGluZyBjdXN0b20gaWNvbiBwYWNrcy5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqL1xub25zLmRpc2FibGVJY29uQXV0b1ByZWZpeCA9ICgpID0+IHtcbiAgdXRpbC5jaGVja01pc3NpbmdJbXBvcnQoJ0ljb24nKTtcbiAgZWxlbWVudHMuSWNvbi5zZXRBdXRvUHJlZml4KGZhbHNlKTtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBmb3JjZVBsYXRmb3JtU3R5bGluZ1xuICogQHNpZ25hdHVyZSBmb3JjZVBsYXRmb3JtU3R5bGluZyhwbGF0Zm9ybSlcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dUmVmcmVzaCBzdHlsaW5nIGZvciB0aGUgZ2l2ZW4gcGxhdGZvcm0uIE9ubHkgdXNlZnVsIGZvciBkZW1vcy4gVXNlIGBvbnMucGxhdGZvcm0uc2VsZWN0KC4uLilgIGluc3RlYWQgZm9yIGRldmVsb3BtZW50IGFuZCBwcm9kdWN0aW9uLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtzdHJpbmd9IHBsYXRmb3JtIE5ldyBwbGF0Zm9ybSB0byBzdHlsZSB0aGUgZWxlbWVudHMuXG4gKi9cbm9ucy5mb3JjZVBsYXRmb3JtU3R5bGluZyA9IG5ld1BsYXRmb3JtID0+IHtcbiAgb25zLmVuYWJsZUF1dG9TdHlsaW5nKCk7XG4gIG9ucy5wbGF0Zm9ybS5zZWxlY3QobmV3UGxhdGZvcm0gfHwgJ2lvcycpO1xuXG4gIG9ucy5fdXRpbC5hcnJheUZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpKVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ29ucy1pZicpIHtcbiAgICAgICAgZWxlbWVudC5fcGxhdGZvcm1VcGRhdGUoKTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC50YWdOYW1lLm1hdGNoKC9eb25zLS9pKSkge1xuICAgICAgICBhdXRvU3R5bGUucHJlcGFyZShlbGVtZW50LCB0cnVlKTtcbiAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnb25zLXRhYmJhcicpIHtcbiAgICAgICAgICBlbGVtZW50Ll91cGRhdGVQb3NpdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIEBtZXRob2QgcHJlbG9hZFxuICogQHNpZ25hdHVyZSBwcmVsb2FkKHRlbXBsYXRlUGF0aHMpXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gdGVtcGxhdGVQYXRoc1xuICogICBbZW5dU2V0IG9mIEhUTUwgZmlsZSBwYXRocyBjb250YWluaW5nICdvbnMtcGFnZScgZWxlbWVudHMuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICogICBbZW5dUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIHRoZSB0ZW1wbGF0ZXMgYXJlIGNhY2hlZC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dU2VwYXJhdGVkIGZpbGVzIG5lZWQgdG8gYmUgcmVxdWVzdGVkIG9uIGRlbWFuZCBhbmQgdGhpcyBjYW4gc2xpZ2h0bHkgZGVsYXkgcHVzaGluZyBuZXcgcGFnZXMuIFRoaXMgbWV0aG9kIHJlcXVlc3RzIGFuZCBjYWNoZXMgdGVtcGxhdGVzIGZvciBsYXRlciB1c2UuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKi9cbm9ucy5wcmVsb2FkID0gZnVuY3Rpb24odGVtcGxhdGVzID0gW10pIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKCh0ZW1wbGF0ZXMgaW5zdGFuY2VvZiBBcnJheSA/IHRlbXBsYXRlcyA6IFt0ZW1wbGF0ZXNdKS5tYXAodGVtcGxhdGUgPT4ge1xuICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB1dGlsLnRocm93KCdFeHBlY3RlZCBzdHJpbmcgYXJndW1lbnRzIGJ1dCBnb3QgJyArIHR5cGVvZiB0ZW1wbGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiBpbnRlcm5hbC5nZXRUZW1wbGF0ZUhUTUxBc3luYyh0ZW1wbGF0ZSk7XG4gIH0pKTtcbn07XG5cbi8qKlxuICogQG1ldGhvZCBjcmVhdGVFbGVtZW50XG4gKiBAc2lnbmF0dXJlIGNyZWF0ZUVsZW1lbnQodGVtcGxhdGUsIG9wdGlvbnMpXG4gKiBAcGFyYW0ge1N0cmluZ30gdGVtcGxhdGVcbiAqICAgW2VuXUVpdGhlciBhbiBIVE1MIGZpbGUgcGF0aCwgYSBgPHRlbXBsYXRlPmAgaWQgb3IgYW4gSFRNTCBzdHJpbmcgc3VjaCBhcyBgJzxkaXYgaWQ9XCJmb29cIj5ob2dlPC9kaXY+J2AuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICogQHBhcmFtIHtCb29sZWFufEhUTUxFbGVtZW50fSBbb3B0aW9ucy5hcHBlbmRdXG4gKiAgIFtlbl1XaGV0aGVyIG9yIG5vdCB0aGUgZWxlbWVudCBzaG91bGQgYmUgYXV0b21hdGljYWxseSBhcHBlbmRlZCB0byB0aGUgRE9NLiAgRGVmYXVsdHMgdG8gYGZhbHNlYC4gSWYgYHRydWVgIHZhbHVlIGlzIGdpdmVuLCBgZG9jdW1lbnQuYm9keWAgd2lsbCBiZSB1c2VkIGFzIHRoZSB0YXJnZXQuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBbb3B0aW9ucy5pbnNlcnRCZWZvcmVdXG4gKiAgIFtlbl1SZWZlcmVuY2Ugbm9kZSB0aGF0IGJlY29tZXMgdGhlIG5leHQgc2libGluZyBvZiB0aGUgbmV3IG5vZGUgKGBvcHRpb25zLmFwcGVuZGAgZWxlbWVudCkuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxQcm9taXNlfVxuICogICBbZW5dSWYgdGhlIHByb3ZpZGVkIHRlbXBsYXRlIHdhcyBhbiBpbmxpbmUgSFRNTCBzdHJpbmcsIGl0IHJldHVybnMgdGhlIG5ldyBlbGVtZW50LiBPdGhlcndpc2UsIGl0IHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5ldyBlbGVtZW50LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1DcmVhdGUgYSBuZXcgZWxlbWVudCBmcm9tIGEgdGVtcGxhdGUuIEJvdGggaW5saW5lIEhUTUwgYW5kIGV4dGVybmFsIGZpbGVzIGFyZSBzdXBwb3J0ZWQgYWx0aG91Z2ggdGhlIHJldHVybiB2YWx1ZSBkaWZmZXJzLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICovXG5vbnMuY3JlYXRlRWxlbWVudCA9ICh0ZW1wbGF0ZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIHRlbXBsYXRlID0gdGVtcGxhdGUudHJpbSgpO1xuXG4gIGNvbnN0IGNyZWF0ZSA9IGh0bWwgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBvbnMuX3V0aWwuY3JlYXRlRWxlbWVudChodG1sKTtcbiAgICBlbGVtZW50LnJlbW92ZSgpO1xuXG4gICAgaWYgKG9wdGlvbnMuYXBwZW5kKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBvcHRpb25zLmFwcGVuZCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gb3B0aW9ucy5hcHBlbmQgOiBkb2N1bWVudC5ib2R5O1xuICAgICAgdGFyZ2V0Lmluc2VydEJlZm9yZShlbGVtZW50LCBvcHRpb25zLmluc2VydEJlZm9yZSB8fCBudWxsKTtcbiAgICAgIG9wdGlvbnMubGluayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIG9wdGlvbnMubGluayhlbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfTtcblxuICByZXR1cm4gdGVtcGxhdGUuY2hhckF0KDApID09PSAnPCcgPyBjcmVhdGUodGVtcGxhdGUpIDogaW50ZXJuYWwuZ2V0UGFnZUhUTUxBc3luYyh0ZW1wbGF0ZSkudGhlbihjcmVhdGUpO1xufTtcblxuLyoqXG4gKiBAbWV0aG9kIGNyZWF0ZVBvcG92ZXJcbiAqIEBzaWduYXR1cmUgY3JlYXRlUG9wb3ZlcihwYWdlLCBbb3B0aW9uc10pXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICogICBbZW5dUGFnZSBuYW1lLiBDYW4gYmUgZWl0aGVyIGFuIEhUTUwgZmlsZSBvciBhIDx0ZW1wbGF0ZT4gY29udGFpbmluZyBhIDxvbnMtZGlhbG9nPiBjb21wb25lbnQuWy9lbl1cbiAqICAgW2phXXBhZ2Xjga5VUkzjgYvjgIHjgoLjgZfjgY/jga9gPHRlbXBsYXRlPmDjgaflrqPoqIDjgZfjgZ/jg4bjg7Pjg5fjg6zjg7zjg4jjga5pZOWxnuaAp+OBruWApOOCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnBhcmVudFNjb3BlXVxuICogICBbZW5dUGFyZW50IHNjb3BlIG9mIHRoZSBkaWFsb2cuIFVzZWQgdG8gYmluZCBtb2RlbHMgYW5kIGFjY2VzcyBzY29wZSBtZXRob2RzIGZyb20gdGhlIGRpYWxvZy5bL2VuXVxuICogICBbamFd44OA44Kk44Ki44Ot44Kw5YaF44Gn5Yip55So44GZ44KL6Kaq44K544Kz44O844OX44KS5oyH5a6a44GX44G+44GZ44CC44OA44Kk44Ki44Ot44Kw44GL44KJ44Oi44OH44Or44KE44K544Kz44O844OX44Gu44Oh44K944OD44OJ44Gr44Ki44Kv44K744K544GZ44KL44Gu44Gr5L2/44GE44G+44GZ44CC44GT44Gu44OR44Op44Oh44O844K/44GvQW5ndWxhckpT44OQ44Kk44Oz44OH44Kj44Oz44Kw44Gn44Gu44G/5Yip55So44Gn44GN44G+44GZ44CCWy9qYV1cbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKiAgIFtlbl1Qcm9taXNlIG9iamVjdCB0aGF0IHJlc29sdmVzIHRvIHRoZSBwb3BvdmVyIGNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAqICAgW2phXeODneODg+ODl+OCquODvOODkOODvOOBruOCs+ODs+ODneODvOODjeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOCkuino+axuuOBmeOCi1Byb21pc2Xjgqrjg5bjgrjjgqfjgq/jg4jjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1DcmVhdGUgYSBwb3BvdmVyIGluc3RhbmNlIGZyb20gYSB0ZW1wbGF0ZS5bL2VuXVxuICogICBbamFd44OG44Oz44OX44Os44O844OI44GL44KJ44Od44OD44OX44Kq44O844OQ44O844Gu44Kk44Oz44K544K/44Oz44K544KS55Sf5oiQ44GX44G+44GZ44CCWy9qYV1cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIGNyZWF0ZURpYWxvZ1xuICogQHNpZ25hdHVyZSBjcmVhdGVEaWFsb2cocGFnZSwgW29wdGlvbnNdKVxuICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAqICAgW2VuXVBhZ2UgbmFtZS4gQ2FuIGJlIGVpdGhlciBhbiBIVE1MIGZpbGUgb3IgYW4gYDx0ZW1wbGF0ZT5gIGNvbnRhaW5pbmcgYSA8b25zLWRpYWxvZz4gY29tcG9uZW50LlsvZW5dXG4gKiAgIFtqYV1wYWdl44GuVVJM44GL44CB44KC44GX44GP44GvYDx0ZW1wbGF0ZT5g44Gn5a6j6KiA44GX44Gf44OG44Oz44OX44Os44O844OI44GuaWTlsZ7mgKfjga7lgKTjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKiAgIFtlbl1Qcm9taXNlIG9iamVjdCB0aGF0IHJlc29sdmVzIHRvIHRoZSBkaWFsb2cgY29tcG9uZW50IG9iamVjdC5bL2VuXVxuICogICBbamFd44OA44Kk44Ki44Ot44Kw44Gu44Kz44Oz44Od44O844ON44Oz44OI44Kq44OW44K444Kn44Kv44OI44KS6Kej5rG644GZ44KLUHJvbWlzZeOCquODluOCuOOCp+OCr+ODiOOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUNyZWF0ZSBhIGRpYWxvZyBpbnN0YW5jZSBmcm9tIGEgdGVtcGxhdGUuWy9lbl1cbiAqICAgW2phXeODhuODs+ODl+ODrOODvOODiOOBi+OCieODgOOCpOOCouODreOCsOOBruOCpOODs+OCueOCv+ODs+OCueOCkueUn+aIkOOBl+OBvuOBmeOAglsvamFdXG4gKi9cbi8qKlxuICogQG1ldGhvZCBjcmVhdGVBbGVydERpYWxvZ1xuICogQHNpZ25hdHVyZSBjcmVhdGVBbGVydERpYWxvZyhwYWdlLCBbb3B0aW9uc10pXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFnZVxuICogICBbZW5dUGFnZSBuYW1lLiBDYW4gYmUgZWl0aGVyIGFuIEhUTUwgZmlsZSBvciBhbiBgPHRlbXBsYXRlPmAgY29udGFpbmluZyBhIDxvbnMtYWxlcnQtZGlhbG9nPiBjb21wb25lbnQuWy9lbl1cbiAqICAgW2phXXBhZ2Xjga5VUkzjgYvjgIHjgoLjgZfjgY/jga9gPHRlbXBsYXRlPmDjgaflrqPoqIDjgZfjgZ/jg4bjg7Pjg5fjg6zjg7zjg4jjga5pZOWxnuaAp+OBruWApOOCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqICAgW2VuXVByb21pc2Ugb2JqZWN0IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGFsZXJ0IGRpYWxvZyBjb21wb25lbnQgb2JqZWN0LlsvZW5dXG4gKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgpLop6PmsbrjgZnjgotQcm9taXNl44Kq44OW44K444Kn44Kv44OI44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQ3JlYXRlIGEgYWxlcnQgZGlhbG9nIGluc3RhbmNlIGZyb20gYSB0ZW1wbGF0ZS5bL2VuXVxuICogICBbamFd44OG44Oz44OX44Os44O844OI44GL44KJ44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44Gu44Kk44Oz44K544K/44Oz44K544KS55Sf5oiQ44GX44G+44GZ44CCWy9qYV1cbiAqL1xub25zLmNyZWF0ZVBvcG92ZXIgPSBvbnMuY3JlYXRlRGlhbG9nID0gb25zLmNyZWF0ZUFsZXJ0RGlhbG9nID0gKHRlbXBsYXRlLCBvcHRpb25zID0ge30pID0+IG9ucy5jcmVhdGVFbGVtZW50KHRlbXBsYXRlLCB7IGFwcGVuZDogdHJ1ZSwgLi4ub3B0aW9ucyB9KTtcblxuLyoqXG4gKiBAbWV0aG9kIG9wZW5BY3Rpb25TaGVldFxuICogQHNpZ25hdHVyZSBvcGVuQWN0aW9uU2hlZXQob3B0aW9ucylcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dU2hvd3MgYW4gaW5zdGFudCBBY3Rpb24gU2hlZXQgYW5kIGxldHMgdGhlIHVzZXIgY2hvb3NlIGFuIGFjdGlvbi5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5idXR0b25zXVxuICogICBbZW5dUmVwcmVzZW50IGVhY2ggYnV0dG9uIG9mIHRoZSBhY3Rpb24gc2hlZXQgZm9sbG93aW5nIHRoZSBzcGVjaWZpZWQgb3JkZXIuIEV2ZXJ5IGl0ZW0gY2FuIGJlIGVpdGhlciBhIHN0cmluZyBsYWJlbCBvciBhbiBvYmplY3QgY29udGFpbmluZyBgbGFiZWxgLCBgaWNvbmAgYW5kIGBtb2RpZmllcmAgcHJvcGVydGllcy5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy50aXRsZV1cbiAqICAgW2VuXU9wdGlvbmFsIHRpdGxlIGZvciB0aGUgYWN0aW9uIHNoZWV0LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRlc3RydWN0aXZlXVxuICogICBbZW5dT3B0aW9uYWwgaW5kZXggb2YgdGhlIFwiZGVzdHJ1Y3RpdmVcIiBidXR0b24gKG9ubHkgZm9yIGlPUykuIEl0IGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIGJ1dHRvbiBhcnJheSBhcyB3ZWxsLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jYW5jZWxhYmxlXVxuICogICBbZW5dV2hldGhlciB0aGUgYWN0aW9uIHNoZWV0IGNhbiBiZSBjYW5jZWxlZCBieSB0YXBwaW5nIG9uIHRoZSBiYWNrZ3JvdW5kIG1hc2sgb3Igbm90LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1vZGlmaWVyXVxuICogICBbZW5dTW9kaWZpZXIgYXR0cmlidXRlIG9mIHRoZSBhY3Rpb24gc2hlZXQuIEUuZy4gYCdkZXN0cnVjdGl2ZSdgLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLm1hc2tDb2xvcl1cbiAqICAgW2VuXU9wdGlvbmFsbHkgY2hhbmdlIHRoZSBiYWNrZ3JvdW5kIG1hc2sgY29sb3IuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaWRdXG4gKiAgIFtlbl1UaGUgZWxlbWVudCdzIGlkIGF0dHJpYnV0ZS5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5jbGFzc11cbiAqICAgW2VuXVRoZSBlbGVtZW50J3MgY2xhc3MgYXR0cmlidXRlLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHJldHVybiB7UHJvbWlzZX1cbiAqICAgW2VuXVdpbGwgcmVzb2x2ZSB3aGVuIHRoZSBhY3Rpb24gc2hlZXQgaXMgY2xvc2VkLiBUaGUgcmVzb2x2ZSB2YWx1ZSBpcyBlaXRoZXIgdGhlIGluZGV4IG9mIHRoZSB0YXBwZWQgYnV0dG9uIG9yIC0xIHdoZW4gY2FuY2VsZWQuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKi9cbm9ucy5vcGVuQWN0aW9uU2hlZXQgPSBhY3Rpb25TaGVldDtcblxuLyoqXG4gKiBAbWV0aG9kIHJlc29sdmVMb2FkaW5nUGxhY2Vob2xkZXJcbiAqIEBzaWduYXR1cmUgcmVzb2x2ZUxvYWRpbmdQbGFjZWhvbGRlcihwYWdlKVxuICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAqICAgW2VuXVBhZ2UgbmFtZS4gQ2FuIGJlIGVpdGhlciBhbiBIVE1MIGZpbGUgb3IgYSBgPHRlbXBsYXRlPmAgaWQuWy9lbl1cbiAqICAgW2phXXBhZ2Xjga5VUkzjgYvjgIHjgoLjgZfjgY/jga9gPHRlbXBsYXRlPmDjgaflrqPoqIDjgZfjgZ/jg4bjg7Pjg5fjg6zjg7zjg4jjga5pZOWxnuaAp+OBruWApOOCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUlmIG5vIHBhZ2UgaXMgZGVmaW5lZCBmb3IgdGhlIGBvbnMtbG9hZGluZy1wbGFjZWhvbGRlcmAgYXR0cmlidXRlIGl0IHdpbGwgd2FpdCBmb3IgdGhpcyBtZXRob2QgYmVpbmcgY2FsbGVkIGJlZm9yZSBsb2FkaW5nIHRoZSBwYWdlLlsvZW5dXG4gKiAgIFtqYV1vbnMtbG9hZGluZy1wbGFjZWhvbGRlcuOBruWxnuaAp+WApOOBqOOBl+OBpuODmuODvOOCuOOBjOaMh+WumuOBleOCjOOBpuOBhOOBquOBhOWgtOWQiOOBr+OAgeODmuODvOOCuOODreODvOODieWJjeOBq+WRvOOBsOOCjOOCi29ucy5yZXNvbHZlTG9hZGluZ1BsYWNlaG9sZGVy5Yem55CG44GM6KGM44KP44KM44KL44G+44Gn6KGo56S644GV44KM44G+44Gb44KT44CCWy9qYV1cbiAqL1xub25zLnJlc29sdmVMb2FkaW5nUGxhY2Vob2xkZXIgPSAocGFnZSwgbGluaykgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IG9ucy5fdXRpbC5hcnJheUZyb20od2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tvbnMtbG9hZGluZy1wbGFjZWhvbGRlcl0nKSk7XG4gIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICB1dGlsLnRocm93KCdObyBvbnMtbG9hZGluZy1wbGFjZWhvbGRlciBleGlzdHMnKTtcbiAgfVxuXG4gIGVsZW1lbnRzXG4gICAgLmZpbHRlcihlbGVtZW50ID0+ICFlbGVtZW50LmdldEF0dHJpYnV0ZSgncGFnZScpKVxuICAgIC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ29ucy1sb2FkaW5nLXBsYWNlaG9sZGVyJywgcGFnZSk7XG4gICAgICBvbnMuX3Jlc29sdmVMb2FkaW5nUGxhY2Vob2xkZXIoZWxlbWVudCwgcGFnZSwgbGluayk7XG4gICAgfSk7XG59O1xuXG5cbm9ucy5fc2V0dXBMb2FkaW5nUGxhY2VIb2xkZXJzID0gZnVuY3Rpb24oKSB7XG4gIG9ucy5yZWFkeSgoKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBvbnMuX3V0aWwuYXJyYXlGcm9tKHdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbb25zLWxvYWRpbmctcGxhY2Vob2xkZXJdJykpO1xuXG4gICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IHBhZ2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnb25zLWxvYWRpbmctcGxhY2Vob2xkZXInKTtcbiAgICAgIGlmICh0eXBlb2YgcGFnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb25zLl9yZXNvbHZlTG9hZGluZ1BsYWNlaG9sZGVyKGVsZW1lbnQsIHBhZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn07XG5cbm9ucy5fcmVzb2x2ZUxvYWRpbmdQbGFjZWhvbGRlciA9IGZ1bmN0aW9uKHBhcmVudCwgcGFnZSwgbGluayA9ICgoZWwsIGRvbmUpID0+IGRvbmUoKSkpIHtcbiAgcGFnZSAmJiBvbnMuY3JlYXRlRWxlbWVudChwYWdlKVxuICAgIC50aGVuKGVsZW1lbnQgPT4ge1xuICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgbGluayhlbGVtZW50LCAoKSA9PiB7XG4gICAgICAgIHdoaWxlIChwYXJlbnQuZmlyc3RDaGlsZCAmJiBwYXJlbnQuZmlyc3RDaGlsZCAhPT0gZWxlbWVudCkge1xuICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChwYXJlbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5jYXRjaChlcnJvciA9PiBQcm9taXNlLnJlamVjdCgnVW5hYmxlZCB0byByZXNvbHZlIHBsYWNlaG9sZGVyOiAnICsgZXJyb3IpKTtcbn07XG5cbmZ1bmN0aW9uIHdhaXREZXZpY2VSZWFkeSgpIHtcbiAgY29uc3QgdW5sb2NrRGV2aWNlUmVhZHkgPSBvbnMuX3JlYWR5TG9jay5sb2NrKCk7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgIGlmIChvbnMuaXNXZWJWaWV3KCkpIHtcbiAgICAgIHdpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkZXZpY2VyZWFkeScsIHVubG9ja0RldmljZVJlYWR5LCB7b25jZTogdHJ1ZX0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bmxvY2tEZXZpY2VSZWFkeSgpO1xuICAgIH1cbiAgfSwge29uY2U6IHRydWV9KTtcbn1cblxuLyoqXG4gKiBAbWV0aG9kIGdldFNjcmlwdFBhZ2VcbiAqIEBzaWduYXR1cmUgZ2V0U2NyaXB0UGFnZSgpXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXUFjY2VzcyB0aGUgbGFzdCBjcmVhdGVkIHBhZ2UgZnJvbSB0aGUgY3VycmVudCBgc2NyaXB0YCBzY29wZS4gT25seSB3b3JrcyBpbnNpZGUgYDxzY3JpcHQ+PC9zY3JpcHQ+YCB0YWdzIHRoYXQgYXJlIGRpcmVjdCBjaGlsZHJlbiBvZiBgb25zLXBhZ2VgIGVsZW1lbnQuIFVzZSB0aGlzIHRvIGFkZCBsaWZlY3ljbGUgaG9va3MgdG8gYSBwYWdlLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gKiAgIFtlbl1SZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHBhZ2UgZWxlbWVudC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqL1xuY29uc3QgZ2V0Q1MgPSAnY3VycmVudFNjcmlwdCcgaW4gZG9jdW1lbnQgPyAoKSA9PiBkb2N1bWVudC5jdXJyZW50U2NyaXB0IDogKCkgPT4gZG9jdW1lbnQuc2NyaXB0c1tkb2N1bWVudC5zY3JpcHRzLmxlbmd0aCAtIDFdO1xub25zLmdldFNjcmlwdFBhZ2UgPSAoKSA9PiBnZXRDUygpICYmIC9vbnMtcGFnZS9pLnRlc3QoZ2V0Q1MoKS5wYXJlbnRFbGVtZW50LnRhZ05hbWUpICYmIGdldENTKCkucGFyZW50RWxlbWVudCB8fCBudWxsO1xuXG5leHBvcnQgZGVmYXVsdCBvbnM7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5mdW5jdGlvbiBnZXRFbGVtZW50Q2xhc3MoKSB7XG4gIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgIT09ICdmdW5jdGlvbicpIHsgLy8gY2FzZSBvZiBTYWZhcmlcbiAgICBjb25zdCBCYXNlRWxlbWVudCA9ICgpID0+IHt9O1xuICAgIEJhc2VFbGVtZW50LnByb3RvdHlwZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHJldHVybiBCYXNlRWxlbWVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gSFRNTEVsZW1lbnQ7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUVsZW1lbnQgZXh0ZW5kcyBnZXRFbGVtZW50Q2xhc3MoKSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IG9yaWVudGF0aW9uIGZyb20gJy4uL29ucy9vcmllbnRhdGlvbi5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vb25zL3BsYXRmb3JtLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1pZlxuICogQGNhdGVnb3J5IGNvbmRpdGlvbmFsXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvaWZcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgQ29uZGl0aW9uYWxseSBkaXNwbGF5IGNvbnRlbnQgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSwgZGV2aWNlIG9yaWVudGF0aW9uIG9yIGJvdGguXG4gKlxuICogICAgIFNvbWV0aW1lcyBpdCBpcyB1c2VmdWwgdG8gY29uZGl0aW9uYWxseSBoaWRlIG9yIHNob3cgY2VydGFpbiBjb21wb25lbnRzIGJhc2VkIG9uIHBsYXRmb3JtLiBXaGVuIHJ1bm5pbmcgb24gaU9TIHRoZSBgPG9ucy1pZj5gIGVsZW1lbnQgY2FuIGJlIHVzZWQgdG8gaGlkZSB0aGUgYDxvbnMtZmFiPmAgZWxlbWVudC5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI2Nyb3NzLXBsYXRmb3JtLXN0eWxpbmctYXV0b3N0eWxpbmcgW2VuXUluZm9ybWF0aW9uIGFib3V0IGNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2VuXVtqYV1JbmZvcm1hdGlvbiBhYm91dCBjcm9zcyBwbGF0Zm9ybSBzdHlsaW5nWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXBhZ2U+XG4gKiAgIDxvbnMtaWYgb3JpZW50YXRpb249XCJsYW5kc2NhcGVcIj5cbiAqICAgICBMYW5kc2NhcGUgdmlldyFcbiAqICAgPC9vbnMtaWY+XG4gKiAgIDxvbnMtaWYgcGxhdGZvcm09XCJhbmRyb2lkXCI+XG4gKiAgICAgVGhpcyBpcyBBbmRyb2lkLlxuICogICA8L29ucy1pZj5cbiAqICAgPG9ucy1pZiBwbGF0Zm9ybT1cImlvcyBvdGhlclwiPlxuICogICAgIFRoaXMgaXMgbm90IEFuZHJvaWQuXG4gKiAgIDwvb25zLWlmPlxuICogPC9vbnMtcGFnZT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSWZFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHBsYXRmb3JtXG4gICAqIEBpbml0b25seVxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGFjZS1zZXBhcmF0ZWQgcGxhdGZvcm0gbmFtZXMuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYFwiaW9zXCJgLCBgXCJhbmRyb2lkXCJgLCBgXCJ3aW5kb3dzXCJgIGFuZCBgXCJvdGhlclwiYC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG9yaWVudGF0aW9uXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUVpdGhlciBgXCJwb3J0cmFpdFwiYCBvciBgXCJsYW5kc2NhcGVcImAuWy9lbl1cbiAgICogIFtqYV1wb3J0cmFpdOOCguOBl+OBj+OBr2xhbmRzY2FwZeOCkuaMh+WumuOBl+OBvuOBmVsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgaWYgKHBsYXRmb3JtLl9nZXRTZWxlY3RlZFBsYXRmb3JtKCkgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fcGxhdGZvcm1VcGRhdGUoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzQWxsb3dlZFBsYXRmb3JtKCkpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuY2hpbGROb2Rlc1swXSkge1xuICAgICAgICAgIHRoaXMuY2hpbGROb2Rlc1swXS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wbGF0Zm9ybVVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fb25PcmllbnRhdGlvbkNoYW5nZSgpO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgb3JpZW50YXRpb24ub24oJ2NoYW5nZScsIHRoaXMuX29uT3JpZW50YXRpb25DaGFuZ2UuYmluZCh0aGlzKSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydvcmllbnRhdGlvbiddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUpIHtcbiAgICBpZiAobmFtZSA9PT0gJ29yaWVudGF0aW9uJykge1xuICAgICAgdGhpcy5fb25PcmllbnRhdGlvbkNoYW5nZSgpO1xuICAgIH1cbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIG9yaWVudGF0aW9uLm9mZignY2hhbmdlJywgdGhpcy5fb25PcmllbnRhdGlvbkNoYW5nZSk7XG4gIH1cblxuICBfcGxhdGZvcm1VcGRhdGUoKSB7XG4gICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gdGhpcy5faXNBbGxvd2VkUGxhdGZvcm0oKSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgX2lzQWxsb3dlZFBsYXRmb3JtKCkge1xuICAgIHJldHVybiAhdGhpcy5nZXRBdHRyaWJ1dGUoJ3BsYXRmb3JtJykgfHwgdGhpcy5nZXRBdHRyaWJ1dGUoJ3BsYXRmb3JtJykuc3BsaXQoL1xccysvKS5pbmRleE9mKHBsYXRmb3JtLmdldE1vYmlsZU9TKCkpID49IDA7XG4gIH1cblxuICBfb25PcmllbnRhdGlvbkNoYW5nZSgpIHtcbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ29yaWVudGF0aW9uJykgJiYgdGhpcy5faXNBbGxvd2VkUGxhdGZvcm0oKSkge1xuICAgICAgY29uc3QgY29uZGl0aW9uYWxPcmllbnRhdGlvbiA9IHRoaXMuZ2V0QXR0cmlidXRlKCdvcmllbnRhdGlvbicpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBjdXJyZW50T3JpZW50YXRpb24gPSBvcmllbnRhdGlvbi5pc1BvcnRyYWl0KCkgPyAncG9ydHJhaXQnIDogJ2xhbmRzY2FwZSc7XG5cbiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9IChjb25kaXRpb25hbE9yaWVudGF0aW9uID09PSBjdXJyZW50T3JpZW50YXRpb24pID8gJycgOiAnbm9uZSc7XG4gICAgfVxuICB9XG59XG5cbm9uc0VsZW1lbnRzLklmID0gSWZFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtaWYnLCBJZkVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUFuaW1hdG9yIHtcblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMudGltaW5nXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmR1cmF0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmRlbGF5XG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLnRpbWluZyA9IG9wdGlvbnMudGltaW5nIHx8ICdsaW5lYXInO1xuICAgIHRoaXMuZHVyYXRpb24gPSBvcHRpb25zLmR1cmF0aW9uIHx8IDA7XG4gICAgdGhpcy5kZWxheSA9IG9wdGlvbnMuZGVsYXkgfHwgMDtcblxuICAgIHRoaXMuZGVmID0ge1xuICAgICAgdGltaW5nOiB0aGlzLnRpbWluZyxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgZGVsYXk6IHRoaXMuZGVsYXlcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGV4dGVuZChwcm9wZXJ0aWVzID0ge30pIHtcbiAgICBjb25zdCBleHRlbmRlZEFuaW1hdG9yID0gdGhpcztcbiAgICBjb25zdCBuZXdBbmltYXRvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgZXh0ZW5kZWRBbmltYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgdXRpbC5leHRlbmQodGhpcywgcHJvcGVydGllcyk7XG4gICAgfTtcblxuICAgIG5ld0FuaW1hdG9yLnByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuICAgIHJldHVybiBuZXdBbmltYXRvcjtcbiAgfVxufVxuXG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG4vLyBUaGlzIG9iamVjdCBzaG91bGQgbm90IGJlIGV4cG9zZWQgdG8gdXNlcnMuIFBsZWFzZSBrZWVwIHRoaXMgcHJpdmF0ZS5cbmNvbnN0IGlQaG9uZVhQYXRjaCA9IHt9O1xuXG5pUGhvbmVYUGF0Y2guaXNJUGhvbmVYUG9ydHJhaXRQYXRjaEFjdGl2ZSA9ICgpID0+IHtcbiAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ29uc2ZsYWctaXBob25leC1wb3J0cmFpdCcpICE9IG51bGwgJiYgd2luZG93LmlubmVyV2lkdGggPCB3aW5kb3cuaW5uZXJIZWlnaHQ7XG59O1xuXG5pUGhvbmVYUGF0Y2guaXNJUGhvbmVYTGFuZHNjYXBlUGF0Y2hBY3RpdmUgPSAoKSA9PiB7XG4gIC8vIElmIHdpZHRoID09PSBoZWlnaHQsIHRyZWF0IGl0IGFzIGxhbmRzY2FwZVxuICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnb25zZmxhZy1pcGhvbmV4LWxhbmRzY2FwZScpICE9IG51bGwgJiYgd2luZG93LmlubmVyV2lkdGggPj0gd2luZG93LmlubmVySGVpZ2h0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzYWZlIGFyZWEgbGVuZ3RocyBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc2FmZSBhcmVhcy5cbiAqL1xuaVBob25lWFBhdGNoLmdldFNhZmVBcmVhTGVuZ3RocyA9ICgpID0+IHtcbiAgbGV0IHNhZmVBcmVhTGVuZ3RocztcbiAgaWYgKGlQaG9uZVhQYXRjaC5pc0lQaG9uZVhQb3J0cmFpdFBhdGNoQWN0aXZlKCkpIHtcbiAgICBzYWZlQXJlYUxlbmd0aHMgPSB7XG4gICAgICB0b3A6IDQ0LFxuICAgICAgcmlnaHQ6IDAsXG4gICAgICBib3R0b206IDM0LFxuICAgICAgbGVmdDogMFxuICAgIH07XG4gIH0gZWxzZSBpZiAoaVBob25lWFBhdGNoLmlzSVBob25lWExhbmRzY2FwZVBhdGNoQWN0aXZlKCkpIHtcbiAgICBzYWZlQXJlYUxlbmd0aHMgPSB7XG4gICAgICB0b3A6IDAsXG4gICAgICByaWdodDogNDQsXG4gICAgICBib3R0b206IDIxLFxuICAgICAgbGVmdDogNDRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHNhZmVBcmVhTGVuZ3RocyA9IHtcbiAgICAgIHRvcDogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgYm90dG9tOiAwLFxuICAgICAgbGVmdDogMFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc2FmZUFyZWFMZW5ndGhzO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzYWZlIGFyZWEgcmVjdCBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc2FmZSBhcmVhcy5cbiAqL1xuaVBob25lWFBhdGNoLmdldFNhZmVBcmVhRE9NUmVjdCA9ICgpID0+IHtcbiAgbGV0IHNhZmVBcmVhUmVjdDtcbiAgaWYgKGlQaG9uZVhQYXRjaC5pc0lQaG9uZVhQb3J0cmFpdFBhdGNoQWN0aXZlKCkpIHtcbiAgICBzYWZlQXJlYVJlY3QgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogNDQsIC8qIDAgKyA0NCAodG9wIHNhZmUgYXJlYSkgKi9cbiAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCxcbiAgICAgIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0IC0gNzggLyogaGVpZ2h0IC0gNDQgKHRvcCBzYWZlIGFyZWEpIC0gMzQgKGJvdHRvbSBzYWZlIGFyZWEpICovXG4gICAgfTtcbiAgfSBlbHNlIGlmIChpUGhvbmVYUGF0Y2guaXNJUGhvbmVYTGFuZHNjYXBlUGF0Y2hBY3RpdmUoKSkge1xuICAgIHNhZmVBcmVhUmVjdCA9IHtcbiAgICAgIHg6IDQ0LCAvKiAwICsgNDQgKGxlZnQgc2FmZSBhcmVhKSAqL1xuICAgICAgeTogMCxcbiAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCAtIDg4LCAvKiB3aWR0aCAtIDQ0IChsZWZ0IHNhZmUgYXJlYSkgLSAzNCAocmlnaHQgc2FmZSBhcmVhKSAqL1xuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgLSAyMSAvKiBoZWlnaHQgLSAyMSAoYm90dG9tIHNhZmUgYXJlYSkgKi9cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHNhZmVBcmVhUmVjdCA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwLFxuICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zYWZlQXJlYVJlY3QsXG4gICAgbGVmdDogc2FmZUFyZWFSZWN0LngsXG4gICAgdG9wOiBzYWZlQXJlYVJlY3QueSxcbiAgICByaWdodDogc2FmZUFyZWFSZWN0LnggKyBzYWZlQXJlYVJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiBzYWZlQXJlYVJlY3QueSArIHNhZmVBcmVhUmVjdC5oZWlnaHRcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGlQaG9uZVhQYXRjaDtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5pbXBvcnQgQmFzZUFuaW1hdG9yIGZyb20gJy4uLy4uL29ucy9iYXNlLWFuaW1hdG9yLmpzJztcbmltcG9ydCBpUGhvbmVYUGF0Y2ggZnJvbSAnLi4vLi4vb25zL2lwaG9uZXgtcGF0Y2guanMnO1xuXG5leHBvcnQgY2xhc3MgQWN0aW9uU2hlZXRBbmltYXRvciBleHRlbmRzIEJhc2VBbmltYXRvciB7XG5cbiAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdsaW5lYXInLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC4yfSA9IHt9KSB7XG4gICAgc3VwZXIoeyB0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgKi9cbiAgc2hvdyhkaWFsb2csIGRvbmUpIHtcbiAgICBkb25lKCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIGhpZGUoZGlhbG9nLCBkb25lKSB7XG4gICAgZG9uZSgpO1xuICB9XG59XG5cbi8qKlxuICogQW5kcm9pZCBzdHlsZSBhbmltYXRvciBmb3IgQWN0aW9uIFNoZWV0LlxuICovXG5leHBvcnQgY2xhc3MgTURBY3Rpb25TaGVldEFuaW1hdG9yIGV4dGVuZHMgQWN0aW9uU2hlZXRBbmltYXRvciB7XG5cbiAgY29uc3RydWN0b3IoeyB0aW1pbmcgPSAnZWFzZScsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjQgfSA9IHt9KSB7XG4gICAgc3VwZXIoe3RpbWluZywgZGVsYXksIGR1cmF0aW9ufSk7XG5cbiAgICB0aGlzLm1hc2tUaW1pbmcgPSAnbGluZWFyJztcbiAgICB0aGlzLm1hc2tEdXJhdGlvbiA9IDAuMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzaG93KGRpYWxvZywgY2FsbGJhY2spIHtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICBhbmltaXQoZGlhbG9nLl9tYXNrKVxuICAgICAgICAucXVldWUoeyBvcGFjaXR5OiAwIH0pXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7IG9wYWNpdHk6IDEuMCB9LCB7XG4gICAgICAgICAgZHVyYXRpb246IHRoaXMubWFza0R1cmF0aW9uLFxuICAgICAgICAgIHRpbWluZzogdGhpcy5tYXNrVGltaW5nXG4gICAgICAgIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9zaGVldCwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoMCwgODAlLCAwKWAsIG9wYWNpdHk6IDAgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJywgb3BhY2l0eTogMSB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZShkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fbWFzaylcbiAgICAgICAgLnF1ZXVlKHsgb3BhY2l0eTogMSB9KVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoeyBvcGFjaXR5OiAwIH0sIHtcbiAgICAgICAgICBkdXJhdGlvbjogdGhpcy5tYXNrRHVyYXRpb24sXG4gICAgICAgICAgdGltaW5nOiB0aGlzLm1hc2tUaW1pbmdcbiAgICAgICAgfSksXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX3NoZWV0LCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsIG9wYWNpdHk6IDEgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsIDgwJSwgMClgLCBvcGFjaXR5OiAwIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIGlPUyBzdHlsZSBhbmltYXRvciBmb3IgZGlhbG9nLlxuICovXG5leHBvcnQgY2xhc3MgSU9TQWN0aW9uU2hlZXRBbmltYXRvciBleHRlbmRzIEFjdGlvblNoZWV0QW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHsgdGltaW5nID0gJ2Vhc2UnLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC4zIH0gPSB7fSkge1xuICAgIHN1cGVyKHt0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbn0pO1xuXG4gICAgdGhpcy5tYXNrVGltaW5nID0gJ2xpbmVhcic7XG4gICAgdGhpcy5tYXNrRHVyYXRpb24gPSAwLjI7XG4gICAgaWYgKGlQaG9uZVhQYXRjaC5pc0lQaG9uZVhQb3J0cmFpdFBhdGNoQWN0aXZlKCkpIHtcbiAgICAgIHRoaXMubGlmdEFtb3VudCA9ICdjYWxjKDEwMCUgKyA0OHB4KSc7XG4gICAgfSBlbHNlIGlmIChpUGhvbmVYUGF0Y2guaXNJUGhvbmVYTGFuZHNjYXBlUGF0Y2hBY3RpdmUoKSkge1xuICAgICAgdGhpcy5saWZ0QW1vdW50ID0gJ2NhbGMoMTAwJSArIDMzcHgpJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5saWZ0QW1vdW50ID0gZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQgLyAyLjAgLSAxICsgJ3B4JzsgLy8gYXZvaWQgRm9yY2VkIFN5bmNocm9ub3VzIExheW91dFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzaG93KGRpYWxvZywgY2FsbGJhY2spIHtcbiAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9tYXNrKVxuICAgICAgLnF1ZXVlKHsgb3BhY2l0eTogMCB9KVxuICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgIC5xdWV1ZSh7IG9wYWNpdHk6IDEgfSwge1xuICAgICAgICBkdXJhdGlvbjogdGhpcy5tYXNrRHVyYXRpb24sXG4gICAgICAgIHRpbWluZzogdGhpcy5tYXNrVGltaW5nXG4gICAgICB9KSxcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fc2hlZXQsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsICR7dGhpcy5saWZ0QW1vdW50fSwgMClgIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGhpZGUoZGlhbG9nLCBjYWxsYmFjaykge1xuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2spXG4gICAgICAucXVldWUoeyBvcGFjaXR5OiAxIH0pXG4gICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgLnF1ZXVlKHsgb3BhY2l0eTogMCB9LCB7XG4gICAgICAgIGR1cmF0aW9uOiB0aGlzLm1hc2tEdXJhdGlvbixcbiAgICAgICAgdGltaW5nOiB0aGlzLm1hc2tUaW1pbmdcbiAgICAgIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9zaGVldCwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgwLCAke3RoaXMubGlmdEFtb3VudH0sIDApYCB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4uLy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uLy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBBbmltYXRvckZhY3RvcnkgZnJvbSAnLi4vLi4vb25zL2ludGVybmFsL2FuaW1hdG9yLWZhY3RvcnkuanMnO1xuaW1wb3J0IERvb3JMb2NrIGZyb20gJy4uLy4uL29ucy9kb29ybG9jay5qcyc7XG5pbXBvcnQgZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIgZnJvbSAnLi4vLi4vb25zL2ludGVybmFsL2RldmljZS1iYWNrLWJ1dHRvbi1kaXNwYXRjaGVyLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlRGlhbG9nRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICBnZXQgX3NjaGVtZSgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBnZXR0ZXItcmV0dXJuXG4gICAgdXRpbC50aHJvd01lbWJlcigpO1xuICB9XG5cbiAgX3VwZGF0ZUFuaW1hdG9yRmFjdG9yeSgpIHtcbiAgICB1dGlsLnRocm93TWVtYmVyKCk7XG4gIH1cblxuICBfdG9nZ2xlU3R5bGUoc2hvdWxkU2hvdykge1xuICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9IHNob3VsZFNob3cgPyAnYmxvY2snIDogJ25vbmUnO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlRGlhbG9nRWxlbWVudCkge1xuICAgICAgdXRpbC50aHJvd0Fic3RyYWN0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5fdmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuX2Rvb3JMb2NrID0gbmV3IERvb3JMb2NrKCk7XG4gICAgdGhpcy5fY2FuY2VsID0gdGhpcy5fY2FuY2VsLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fc2VsZkNhbWVsTmFtZSA9IHV0aWwuY2FtZWxpemUodGhpcy50YWdOYW1lLnNsaWNlKDQpKTtcbiAgICB0aGlzLl9kZWZhdWx0REJCID0gZSA9PiB0aGlzLmNhbmNlbGFibGUgPyB0aGlzLl9jYW5jZWwoKSA6IGUuY2FsbFBhcmVudEhhbmRsZXIoKTtcbiAgICB0aGlzLl9hbmltYXRvckZhY3RvcnkgPSB0aGlzLl91cGRhdGVBbmltYXRvckZhY3RvcnkoKTtcbiAgfVxuXG4gIGdldCBvbkRldmljZUJhY2tCdXR0b24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyO1xuICB9XG5cbiAgc2V0IG9uRGV2aWNlQmFja0J1dHRvbihjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9iYWNrQnV0dG9uSGFuZGxlcikge1xuICAgICAgdGhpcy5fYmFja0J1dHRvbkhhbmRsZXIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMuX2JhY2tCdXR0b25DYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyID0gZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIuY3JlYXRlSGFuZGxlcih0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICBfY2FuY2VsKCkge1xuICAgIGlmICh0aGlzLmNhbmNlbGFibGUgJiYgIXRoaXMuX3J1bm5pbmcpIHtcbiAgICAgIHRoaXMuX3J1bm5pbmcgPSB0cnVlO1xuICAgICAgdGhpcy5oaWRlKClcbiAgICAgICAgLnRoZW4oXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdkaWFsb2djYW5jZWwnKTtcbiAgICAgICAgICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAnZGlhbG9nLWNhbmNlbCcpOyAgLy8gZGlhbG9nLWNhbmNlbCBpcyBkZXByZWNhdGVkIGJ1dCBzdGlsbCBlbWl0IHRvIGF2b2lkIGJyZWFraW5nIHVzZXIgY29kZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4gdGhpcy5fcnVubmluZyA9IGZhbHNlXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2hvdyguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldFZpc2libGUodHJ1ZSwgLi4uYXJncykudGhlbihkaWFsb2cgPT4ge1xuICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiBkaWFsb2c7XG4gICAgfSk7XG4gIH1cblxuICBoaWRlKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0VmlzaWJsZShmYWxzZSwgLi4uYXJncykudGhlbihkaWFsb2cgPT4ge1xuICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICByZXR1cm4gZGlhbG9nO1xuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0VmlzaWJsZSghdGhpcy52aXNpYmxlLCAuLi5hcmdzKS50aGVuKGRpYWxvZyA9PiB7XG4gICAgICB0aGlzLnZpc2libGUgPSB0aGlzLl92aXNpYmxlO1xuICAgICAgcmV0dXJuIGRpYWxvZztcbiAgICB9KTtcbiAgfVxuXG4gIF9zZXRWaXNpYmxlKHNob3VsZFNob3csIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHNob3VsZFNob3cgPyAnc2hvdycgOiAnaGlkZSc7XG5cbiAgICBvcHRpb25zID0geyAuLi5vcHRpb25zIH07XG4gICAgb3B0aW9ucy5hbmltYXRpb25PcHRpb25zID0gdXRpbC5leHRlbmQoXG4gICAgICBvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnMgfHwge30sXG4gICAgICB0aGlzLmFuaW1hdGlvbk9wdGlvbnNcbiAgICApO1xuXG4gICAgbGV0IGNhbmNlbGVkID0gZmFsc2U7XG4gICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsIGBwcmUke2FjdGlvbn1gLCB7IC8vIHByZXNob3cgcHJlaGlkZVxuICAgICAgW3RoaXMuX3NlbGZDYW1lbE5hbWVdOiB0aGlzLFxuICAgICAgY2FuY2VsOiAoKSA9PiBjYW5jZWxlZCA9IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChjYW5jZWxlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGBDYW5jZWxlZCBpbiBwcmUke2FjdGlvbn0gZXZlbnQuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgdGhpcy5fZG9vckxvY2sud2FpdFVubG9jaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IHVubG9jayA9IHRoaXMuX2Rvb3JMb2NrLmxvY2soKTtcbiAgICAgICAgY29uc3QgYW5pbWF0b3IgPSB0aGlzLl9hbmltYXRvckZhY3RvcnkubmV3QW5pbWF0b3Iob3B0aW9ucyk7XG5cbiAgICAgICAgc2hvdWxkU2hvdyAmJiB0aGlzLl90b2dnbGVTdHlsZSh0cnVlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fdmlzaWJsZSA9IHNob3VsZFNob3c7XG4gICAgICAgIHV0aWwuaW9zUGFnZVNjcm9sbEZpeChzaG91bGRTaG93KTtcblxuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgICAgIGFuaW1hdG9yW2FjdGlvbl0odGhpcywgKCkgPT4ge1xuICAgICAgICAgICAgIXNob3VsZFNob3cgJiYgdGhpcy5fdG9nZ2xlU3R5bGUoZmFsc2UsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICB1bmxvY2soKTtcblxuICAgICAgICAgICAgdXRpbC5wcm9wYWdhdGVBY3Rpb24odGhpcywgJ18nICsgYWN0aW9uKTtcbiAgICAgICAgICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAncG9zdCcgKyBhY3Rpb24sIHtbdGhpcy5fc2VsZkNhbWVsTmFtZV06IHRoaXN9KTsgLy8gcG9zdHNob3cgcG9zdGhpZGVcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2FsbGJhY2sgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrKHRoaXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgbWFza0NvbG9yKCkge1xuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnbWFzay1jb2xvcicpO1xuICB9XG5cbiAgc2V0IG1hc2tDb2xvcih2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnbWFzay1jb2xvcicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnbWFzay1jb2xvcicsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXQgYW5pbWF0aW9uT3B0aW9ucygpIHtcbiAgICByZXR1cm4gQW5pbWF0b3JGYWN0b3J5LnBhcnNlQW5pbWF0aW9uT3B0aW9uc1N0cmluZyh0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKSk7XG4gIH1cblxuICBzZXQgYW5pbWF0aW9uT3B0aW9ucyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbi1vcHRpb25zJywgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlTWFzaygpIHtcbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX21hc2spIHtcbiAgICAgICAgdGhpcy5fbWFzay5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm1hc2tDb2xvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF91cGRhdGVBbmltYXRpb24oKSB7XG4gICAgdGhpcy5fYW5pbWF0b3JGYWN0b3J5ID0gdGhpcy5fdXBkYXRlQW5pbWF0b3JGYWN0b3J5KCk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2JhY2tCdXR0b25DYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5vbkRldmljZUJhY2tCdXR0b24gPSB0aGlzLl9iYWNrQnV0dG9uQ2FsbGJhY2s7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5fZGVmYXVsdERCQiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5vbkRldmljZUJhY2tCdXR0b24gPSB0aGlzLl9kZWZhdWx0REJCLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9tYXNrKSB7XG4gICAgICAgIHRoaXMuX21hc2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9jYW5jZWwsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICh0aGlzLl9iYWNrQnV0dG9uSGFuZGxlcikge1xuICAgICAgdGhpcy5fYmFja0J1dHRvbkhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5fYmFja0J1dHRvbkhhbmRsZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9tYXNrKSB7XG4gICAgICB0aGlzLl9tYXNrLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fY2FuY2VsLCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInLCAnYW5pbWF0aW9uJywgJ21hc2stY29sb3InLCAndmlzaWJsZSddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHRoaXMuX3NjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYW5pbWF0aW9uJzpcbiAgICAgICAgdGhpcy5fdXBkYXRlQW5pbWF0aW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWFzay1jb2xvcic6XG4gICAgICAgIHRoaXMuX3VwZGF0ZU1hc2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd2aXNpYmxlJzpcbiAgICAgICAgaWYgKHRoaXMudmlzaWJsZSAhPT0gdGhpcy5fdmlzaWJsZSkge1xuICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgbWFzayBhbmQgYW5pbWF0aW9uIGVhcmx5IGluIGNhc2UgYHZpc2libGVgIGF0dHJpYnV0ZVxuICAgICAgICAgIC8vIGNoYW5nZWQgY2FsbGJhY2sgaXMgY2FsbGVkIGJlZm9yZSBgYW5pbWF0aW9uYCBvciBgbWFzay1jb2xvcmBcbiAgICAgICAgICB0aGlzLl91cGRhdGVNYXNrKCk7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlQW5pbWF0aW9uKCk7XG5cbiAgICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc2V0VmlzaWJsZSh0aGlzLnZpc2libGUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXQgZXZlbnRzKCkge1xuICAgIHJldHVybiBbJ3ByZXNob3cnLCAncG9zdHNob3cnLCAncHJlaGlkZScsICdwb3N0aGlkZScsICdkaWFsb2djYW5jZWwnLCAnZGlhbG9nLWNhbmNlbCddO1xuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoQmFzZURpYWxvZ0VsZW1lbnQsIFsndmlzaWJsZScsICdkaXNhYmxlZCcsICdjYW5jZWxhYmxlJ10pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQW5pbWF0b3JGYWN0b3J5IGZyb20gJy4uL29ucy9pbnRlcm5hbC9hbmltYXRvci1mYWN0b3J5LmpzJztcbmltcG9ydCB7IEFjdGlvblNoZWV0QW5pbWF0b3IsIElPU0FjdGlvblNoZWV0QW5pbWF0b3IsIE1EQWN0aW9uU2hlZXRBbmltYXRvciB9IGZyb20gJy4vb25zLWFjdGlvbi1zaGVldC9hbmltYXRvci5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vb25zL3BsYXRmb3JtLmpzJztcbmltcG9ydCBCYXNlRGlhbG9nRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1kaWFsb2cuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJy5hY3Rpb24tc2hlZXQnOiAnYWN0aW9uLXNoZWV0LS0qJyxcbiAgJy5hY3Rpb24tc2hlZXQtbWFzayc6ICdhY3Rpb24tc2hlZXQtbWFzay0tKicsXG4gICcuYWN0aW9uLXNoZWV0LXRpdGxlJzogJ2FjdGlvbi1zaGVldC10aXRsZS0tKidcbn07XG5cbmNvbnN0IF9hbmltYXRvckRpY3QgPSB7XG4gICdkZWZhdWx0JzogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBNREFjdGlvblNoZWV0QW5pbWF0b3IgOiBJT1NBY3Rpb25TaGVldEFuaW1hdG9yOyB9LFxuICAnbm9uZSc6IEFjdGlvblNoZWV0QW5pbWF0b3Jcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWFjdGlvbi1zaGVldFxuICogQGNhdGVnb3J5IGRpYWxvZ1xuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBBY3Rpb24vYm90dG9tIHNoZWV0IHRoYXQgaXMgZGlzcGxheWVkIG9uIHRvcCBvZiBjdXJyZW50IHNjcmVlbi5cbiAqXG4gKiAgICAgVGhpcyBlbGVtZW50IGNhbiBlaXRoZXIgYmUgYXR0YWNoZWQgZGlyZWN0bHkgdG8gdGhlIGA8Ym9keT5gIG9yIGR5bmFtaWNhbGx5IGNyZWF0ZWQgZnJvbSBhIHRlbXBsYXRlIHVzaW5nIHRoZSBgb25zLmNyZWF0ZUVsZW1lbnQodGVtcGxhdGUsIHsgYXBwZW5kOiB0cnVlIH0pYCB1dGlsaXR5IGZ1bmN0aW9uIGFuZCB0aGUgYDx0ZW1wbGF0ZT5gIHRhZy5cbiAqXG4gKiAgICAgVGhlIGFjdGlvbiBzaGVldCBpcyB1c2VmdWwgZm9yIGRpc3BsYXlpbmcgYSBsaXN0IG9mIG9wdGlvbnMgYW5kIGFza2luZyB0aGUgdXNlciB0byBtYWtlIGEgZGVjaXNpb24uIEEgYG9ucy1hY3Rpb24tc2hlZXQtYnV0dG9uYCBpcyBwcm92aWRlZCBmb3IgdGhpcyBwdXJwb3NlLCBhbHRob3VnaCBpdCBjYW4gY29udGFpbiBhbnkgdHlwZSBvZiBjb250ZW50LlxuICpcbiAqICAgICBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzcGxheWVkIGFzIE1hdGVyaWFsIERlc2lnbiAoYm90dG9tIHNoZWV0KSB3aGVuIHJ1bm5pbmcgb24gYW4gQW5kcm9pZCBkZXZpY2UuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1cbiAqICAgICDjgqLjgq/jgrfjg6fjg7Pjgrfjg7zjg4jjgIHjgoLjgZfjgY/jga/jg5zjg4jjg6Djgrfjg7zjg4jjgpLnj77lnKjjga7jgrnjgq/jg6rjg7zjg7PkuIrjgavooajnpLrjgZfjgb7jgZnjgIJcbiAqXG4gKiAgICAg44GT44Gu6KaB57Sg44Gv44CBYDxib2R5PmDopoHntKDjgavnm7TmjqXjgqLjgr/jg4Pjg4HjgZXjgozjgovjgYvjgIHjgoLjgZfjgY/jga9gb25zLmNyZWF0ZUVsZW1lbnQodGVtcGxhdGUsIHsgYXBwZW5kOiB0cnVlIH0pYOOBqGA8dGVtcGxhdGU+YOOCv+OCsOOCkuS9v+OBo+OBpuODhuODs+ODl+ODrOODvOODiOOBi+OCieWLleeahOOBq+eUn+aIkOOBleOCjOOBvuOBmeOAglxuICpcbiAqICAgICDjgqLjgq/jgrfjg6fjg7Pjgrfjg7zjg4jjga/jgIHpgbjmip7ogqLjga7jg6rjgrnjg4jjgpLooajnpLrjgZfjgabjg6bjg7zjgrbjg7zjgavlsIvjga3jgovjga7jgavkvr/liKnjgafjgZnjgIJgb25zLWFjdGlvbi1zaGVldC1idXR0b25g44Gv44CB44GT44Gu6KaB57Sg44Gu5Lit44Gr572u44GP44Gf44KB44Gr5o+Q5L6b44GV44KM44Gm44GE44G+44GZ44GM44CB44Gd44KM5Lul5aSW44Gr44KC5LuW44Gu44Gp44Gu44KI44GG44Gq6KaB57Sg44KS5ZCr44KA44GT44Go44GM44Gn44GN44G+44GZ44CCXG4gKlxuICogICAgIEFuZHJvaWTjg4fjg5DjgqTjgrnjgaflrp/ooYzjgZXjgozjgovjgajjgY3jgavjga/jgIHoh6rli5XnmoTjgavjg57jg4bjg6rjgqLjg6vjg4fjgrbjgqTjg7Mo44Oc44OI44Og44K344O844OIKeOBqOOBl+OBpuihqOekuuOBleOCjOOBvuOBmeOAglxuICogICBbL2phXVxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1EaXNwbGF5IGEgTWF0ZXJpYWwgRGVzaWduIGJvdHRvbSBzaGVldC5bL2VuXVxuICogICBbamFd44Oe44OG44Oq44Ki44Or44OH44K244Kk44Oz44Gu44Oc44OI44Og44K344O844OI44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEB0dXRvcmlhbCB2YW5pbGxhL3JlZmVyZW5jZS9hY3Rpb24tc2hlZXRcbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjbW9kaWZpZXJzIFtlbl1Nb3JlIGRldGFpbHMgYWJvdXQgdGhlIGBtb2RpZmllcmAgYXR0cmlidXRlWy9lbl1bamFdbW9kaWZpZXLlsZ7mgKfjga7kvb/jgYTmlrlbL2phXVxuICogQHNlZWFsc28gb25zLXBvcG92ZXJcbiAqICAgW2VuXWA8b25zLXBvcG92ZXI+YCBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLXBvcG92ZXLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLW1vZGFsXG4gKiAgIFtlbl1gPG9ucy1tb2RhbD5gIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtbW9kYWzjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtYWN0aW9uLXNoZWV0IGlkPVwic2hlZXRcIj5cbiAqICAgPG9ucy1hY3Rpb24tc2hlZXQtYnV0dG9uPkxhYmVsPC9vbnMtYWN0aW9uLXNoZWV0LWJ1dHRvbj5cbiAqICAgPG9ucy1hY3Rpb24tc2hlZXQtYnV0dG9uPkxhYmVsPC9vbnMtYWN0aW9uLXNoZWV0LWJ1dHRvbj5cbiAqIDwvb25zLWFjdGlvbi1zaGVldD5cbiAqXG4gKiA8c2NyaXB0PlxuICogICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hlZXQnKS5zaG93KCk7XG4gKiA8L3NjcmlwdD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWN0aW9uU2hlZXRFbGVtZW50IGV4dGVuZHMgQmFzZURpYWxvZ0VsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHJlc2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogW2VuXUZpcmVkIGp1c3QgYmVmb3JlIHRoZSBhY3Rpb24gc2hlZXQgaXMgZGlzcGxheWVkLlsvZW5dXG4gICAqIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzooajnpLrjgZXjgozjgovnm7TliY3jgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuYWN0aW9uU2hlZXRcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jYW5jZWxcbiAgICogICBbZW5dRXhlY3V0ZSB0aGlzIGZ1bmN0aW9uIHRvIHN0b3AgdGhlIGFjdGlvbiBzaGVldCBmcm9tIGJlaW5nIHNob3duLlsvZW5dXG4gICAqICAgW2phXeOBk+OBrumWouaVsOOCkuWun+ihjOOBmeOCi+OBqOOAgeODgOOCpOOCouODreOCsOOBruihqOekuuOBjOOCreODo+ODs+OCu+ODq+OBleOCjOOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdHNob3dcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCBqdXN0IGFmdGVyIHRoZSBhY3Rpb24gc2hlZXQgaXMgZGlzcGxheWVkLlsvZW5dXG4gICAqIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzooajnpLrjgZXjgozjgZ/nm7TlvozjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuYWN0aW9uU2hlZXRcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHByZWhpZGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCBqdXN0IGJlZm9yZSB0aGUgYWN0aW9uIHNoZWV0IGlzIGhpZGRlbi5bL2VuXVxuICAgKiBbamFd44OA44Kk44Ki44Ot44Kw44GM6Zqg44KM44KL55u05YmN44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmFjdGlvblNoZWV0XG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUV4ZWN1dGUgdGhpcyBmdW5jdGlvbiB0byBzdG9wIHRoZSBhY3Rpb24gc2hlZXQgZnJvbSBiZWluZyBoaWRkZW4uWy9lbl1cbiAgICogICBbamFd44GT44Gu6Zai5pWw44KS5a6f6KGM44GZ44KL44Go44CB44OA44Kk44Ki44Ot44Kw44Gu6Z2e6KGo56S644GM44Kt44Oj44Oz44K744Or44GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0aGlkZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIGFjdGlvbiBzaGVldCBpcyBoaWRkZW4uWy9lbl1cbiAgICogW2phXeODgOOCpOOCouODreOCsOOBjOmaoOOCjOOBn+W+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5hY3Rpb25TaGVldFxuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgZGlhbG9nY2FuY2VsXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBbZW5dRmlyZWQgd2hlbiB0aGUgYWN0aW9uIHNoZWV0IGlzIGNhbmNlbGVkLlsvZW5dXG4gICAqIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB0aXRsZVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1PcHRpb25hbCB0aXRsZSBvZiB0aGUgYWN0aW9uIHNoZWV0LiBBIG5ldyBlbGVtZW50IHdpbGwgYmUgY3JlYXRlZCBjb250YWluaW5nIHRoaXMgc3RyaW5nLlsvZW5dXG4gICAqICBbamFd44Ki44Kv44K344On44Oz44K344O844OI44Gu44K/44Kk44OI44Or44KS5oyH5a6a44GX44G+44GZ44CC44GT44GT44Gn5oyH5a6a44GX44Gf5paH5a2X5YiX44KS5ZCr44KA5paw44GX44GE6KaB57Sg44GM5L2c5oiQ44GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB0aXRsZVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1PcHRpb25hbCB0aXRsZSBvZiB0aGUgYWN0aW9uIHNoZWV0LiBBIG5ldyBlbGVtZW50IHdpbGwgYmUgY3JlYXRlZCBjb250YWluaW5nIHRoaXMgc3RyaW5nLlsvZW5dXG4gICAqICBbamFd44Ki44Kv44K344On44Oz44K344O844OI44Gu44K/44Kk44OI44Or44KS5oyH5a6a44GX44G+44GZ44CC44GT44GT44Gn5oyH5a6a44GX44Gf5paH5a2X5YiX44KS5ZCr44KA5paw44GX44GE6KaB57Sg44GM5L2c5oiQ44GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGFjdGlvbiBzaGVldC5bL2VuXVxuICAgKiAgW2phXeODgOOCpOOCouODreOCsOOBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGNhbmNlbGFibGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSBhY3Rpb24gc2hlZXQgY2FuIGJlIGNsb3NlZCBieSB0YXBwaW5nIHRoZSBiYWNrZ3JvdW5kIG9yIGJ5IHByZXNzaW5nIHRoZSBiYWNrIGJ1dHRvbiBvbiBBbmRyb2lkIGRldmljZXMuWy9lbl1cbiAgICogIFtqYV3jgZPjga7lsZ7mgKfjgYzoqK3lrprjgZXjgozjgovjgajjgIHjgqLjgq/jgrfjg6fjg7Pjgrfjg7zjg4jjga7og4zmma/jgoRBbmRyb2lk44OH44OQ44Kk44K544Gu44OQ44OD44Kv44Oc44K/44Oz44KS5o6o44GZ44GT44Go44Gn44Ki44Kv44K344On44Oz44K344O844OI44GM6ZaJ44GY44KL44KI44GG44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSBhY3Rpb24gc2hlZXQgaXMgZGlzYWJsZWQuWy9lbl1cbiAgICogIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovmmYLjgIHjg4DjgqTjgqLjg63jgrDjga9kaXNhYmxlZOeKtuaFi+OBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCBkZWZhdWx0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhbmltYXRpb24gdXNlZCB3aGVuIHNob3dpbmcgYW5kIGhpZGluZyB0aGUgYWN0aW9uIHNoZWV0LiBDYW4gYmUgZWl0aGVyIGBcIm5vbmVcImAgb3IgYFwiZGVmYXVsdFwiYC5bL2VuXVxuICAgKiAgW2phXeODgOOCpOOCouODreOCsOOCkuihqOekuuOBmeOCi+mam+OBruOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglwibm9uZVwi44KC44GX44GP44GvXCJkZWZhdWx0XCLjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb24tb3B0aW9uc1xuICAgKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgIJlLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAguS+i++8mntkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbWFzay1jb2xvclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCByZ2JhKDAsIDAsIDAsIDAuMilcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ29sb3Igb2YgdGhlIGJhY2tncm91bmQgbWFzay4gRGVmYXVsdCBpcyBgXCJyZ2JhKDAsIDAsIDAsIDAuMilcImAuWy9lbl1cbiAgICogIFtqYV3og4zmma/jga7jg57jgrnjgq/jga7oibLjgpLmjIflrprjgZfjgb7jgZnjgIJcInJnYmEoMCwgMCwgMCwgMC4yKVwi44GM44OH44OV44Kp44Or44OI5YCk44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdmlzaWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGFjdGlvbiBzaGVldCBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG4gIH1cblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4gc2NoZW1lO1xuICB9XG5cbiAgZ2V0IF9tYXNrKCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLmFjdGlvbi1zaGVldC1tYXNrJyk7XG4gIH1cblxuICBnZXQgX3NoZWV0KCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLmFjdGlvbi1zaGVldCcpO1xuICB9XG5cbiAgZ2V0IF90aXRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCcuYWN0aW9uLXNoZWV0LXRpdGxlJyk7XG4gIH1cblxuICBfdXBkYXRlQW5pbWF0b3JGYWN0b3J5KCkge1xuICAgIHJldHVybiBuZXcgQW5pbWF0b3JGYWN0b3J5KHtcbiAgICAgIGFuaW1hdG9yczogX2FuaW1hdG9yRGljdCxcbiAgICAgIGJhc2VDbGFzczogQWN0aW9uU2hlZXRBbmltYXRvcixcbiAgICAgIGJhc2VDbGFzc05hbWU6ICdBY3Rpb25TaGVldEFuaW1hdG9yJyxcbiAgICAgIGRlZmF1bHRBbmltYXRpb246IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKVxuICAgIH0pO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG5cbiAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy5zdHlsZS56SW5kZXggPSAxMDAwMTtcblxuICAgIC8qIEV4cGVjdGVkIHJlc3VsdDpcbiAgICAgKiAgIDxvbnMtYWN0aW9uLXNoZWV0PlxuICAgICAqICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLXNoZWV0LW1hc2tcIj48L2Rpdj5cbiAgICAgKiAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1zaGVldFwiPlxuICAgICAqICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tc2hlZXQtdGl0bGU+PC9kaXY+XG4gICAgICogICAgICAgLi4uXG4gICAgICogICAgIDwvZGl2PlxuICAgICAqICAgPC9vbnMtYWN0aW9uLXNoZWV0PlxuICAgICAqL1xuXG4gICAgaWYgKCF0aGlzLl9zaGVldCkge1xuICAgICAgY29uc3Qgc2hlZXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHNoZWV0LmNsYXNzTGlzdC5hZGQoJ2FjdGlvbi1zaGVldCcpO1xuXG4gICAgICB3aGlsZSAodGhpcy5maXJzdENoaWxkKSB7XG4gICAgICAgIHNoZWV0LmFwcGVuZENoaWxkKHRoaXMuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoc2hlZXQpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fdGl0bGUpIHtcbiAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aXRsZS5jbGFzc0xpc3QuYWRkKCdhY3Rpb24tc2hlZXQtdGl0bGUnKTtcbiAgICAgIGlmICh0aGlzLnRpdGxlKSB7XG4gICAgICAgIHRpdGxlLmlubmVySFRNTCA9IHRoaXMudGl0bGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aXRsZS5oaWRkZW4gPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5fc2hlZXQuaW5zZXJ0QmVmb3JlKHRpdGxlLCB0aGlzLl9zaGVldC5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX21hc2spIHtcbiAgICAgIGNvbnN0IG1hc2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIG1hc2suY2xhc3NMaXN0LmFkZCgnYWN0aW9uLXNoZWV0LW1hc2snKTtcbiAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKG1hc2ssIHRoaXMuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2hlZXQuc3R5bGUuekluZGV4ID0gMjAwMDE7XG4gICAgdGhpcy5fbWFzay5zdHlsZS56SW5kZXggPSAyMDAwMDtcblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgdGhpcy5fc2NoZW1lKTtcbiAgfVxuXG4gIF91cGRhdGVUaXRsZSgpIHtcbiAgICBpZiAodGhpcy5fdGl0bGUpIHtcbiAgICAgIGlmICghdGhpcy50aXRsZSkge1xuICAgICAgICB0aGlzLl90aXRsZS5oaWRkZW4gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdGl0bGUuaW5uZXJIVE1MID0gdGhpcy50aXRsZTtcbiAgICAgICAgdGhpcy5fdGl0bGUuaGlkZGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRpdGxlKCkge1xuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgndGl0bGUnKTtcbiAgfVxuXG4gIHNldCB0aXRsZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgndGl0bGUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1CYWNrLWJ1dHRvbiBoYW5kbGVyLlsvZW5dXG4gICAqICAgW2phXeODkOODg+OCr+ODnOOCv+ODs+ODj+ODs+ODieODqeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgbWFza0NvbG9yXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IHJnYmEoMCwgMCwgMCwgMC4yKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZCBtYXNrLiBEZWZhdWx0IGlzIFwicmdiYSgwLCAwLCAwLCAwLjIpXCIuWy9lbl1cbiAgICogIFtqYV3og4zmma/jga7jg57jgrnjgq/jga7oibLjgpLmjIflrprjgZfjgb7jgZnjgIJcInJnYmEoMCwgMCwgMCwgMC4yKVwi44GM44OH44OV44Kp44Or44OI5YCk44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2hvd1xuICAgKiBAc2lnbmF0dXJlIHNob3coW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJub25lXCJgIGFuZCBgXCJzbGlkZVwiYC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJcIm5vbmVcIiwgXCJzbGlkZVwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gIFsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1UaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgYWN0aW9uIHNoZWV0IGhhcyBiZWVuIHJldmVhbGVkLlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOBjOihqOekuuOBleOCjOe1guOCj+OBo+OBn+W+jOOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNob3cgdGhlIGFjdGlvbiBzaGVldC5bL2VuXVxuICAgKiAgW2phXeODgOOCpOOCouODreOCsOOCkumWi+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IFJlc29sdmVzIHRvIHRoZSBkaXNwbGF5ZWQgZWxlbWVudC5cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaGlkZVxuICAgKiBAc2lnbmF0dXJlIGhpZGUoW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJub25lXCJgIGFuZCBgXCJzbGlkZVwiYC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJcIm5vbmVcIiwgXCJzbGlkZVwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXVRoaXMgZnVuY3Rpb25zIGlzIGNhbGxlZCBhZnRlciB0aGUgYWN0aW9uIHNoZWV0IGhhcyBiZWVuIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzpmqDjgozjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSGlkZSB0aGUgYWN0aW9uIHNoZWV0LlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOCkumWieOBmOOBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBoaWRkZW4gZWxlbWVudFsvZW5dXG4gICAqICAgW2phXemaoOOCjOOBn+imgee0oOOCkuino+axuuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmlzaWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGFjdGlvbiBzaGVldCBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgYWN0aW9uIHNoZWV0IGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGNhbmNlbGFibGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBhY3Rpb24gc2hlZXQgaXMgY2FuY2VsYWJsZSBvciBub3QuIEEgY2FuY2VsYWJsZSBhY3Rpb24gc2hlZXQgY2FuIGJlIGNsb3NlZCBieSB0YXBwaW5nIHRoZSBiYWNrZ3JvdW5kIG9yIGJ5IHByZXNzaW5nIHRoZSBiYWNrIGJ1dHRvbiBvbiBBbmRyb2lkIGRldmljZXMuWy9lbl1cbiAgICogICBbamFd44Ki44Kv44K344On44Oz44K344O844OI44GM44Kt44Oj44Oz44K744Or5Y+v6IO944GL44Gp44GG44GL44KS6Kit5a6a44GX44G+44GZ44CC44Kt44Oj44Oz44K744Or5Y+v6IO944Gq44Ki44Kv44K344On44Oz44K344O844OI44Gv44CB6IOM5pmv44KS44K/44OD44OX44GX44Gf44KKQW5kcm9pZOODh+ODkOOCpOOCueOBruODkOODg+OCr+ODnOOCv+ODs+OCkuaOqOOBmeOBk+OBqOOBp+mWieOBmOOCi+OCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbLi4uc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzLCAndGl0bGUnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgaWYgKG5hbWUgPT09ICd0aXRsZScpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVRpdGxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBY3Rpb25TaGVldEFuaW1hdG9yfSBBbmltYXRvclxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyQW5pbWF0b3IobmFtZSwgQW5pbWF0b3IpIHtcbiAgICBpZiAoIShBbmltYXRvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBBY3Rpb25TaGVldEFuaW1hdG9yKSkge1xuICAgICAgdXRpbC50aHJvd0FuaW1hdG9yKCdBY3Rpb25TaGVldCcpO1xuICAgIH1cbiAgICBfYW5pbWF0b3JEaWN0W25hbWVdID0gQW5pbWF0b3I7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGFuaW1hdG9ycygpIHtcbiAgICByZXR1cm4gX2FuaW1hdG9yRGljdDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgQWN0aW9uU2hlZXRBbmltYXRvcigpIHtcbiAgICByZXR1cm4gQWN0aW9uU2hlZXRBbmltYXRvcjtcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5BY3Rpb25TaGVldCA9IEFjdGlvblNoZWV0RWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWFjdGlvbi1zaGVldCcsIEFjdGlvblNoZWV0RWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNiBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgaW50ZXJuYWwgZnJvbSAnLi4vLi4vb25zL2ludGVybmFsL2luZGV4LmpzJztcblxuLyoqXG4gKiBAY2xhc3MgQW5pbWF0b3JDU1MgLSBpbXBsZW1lbnRhdGlvbiBvZiBBbmltYXRvciBjbGFzcyB1c2luZyBjc3MgdHJhbnNpdGlvbnNcbiAqL1xuY2xhc3MgQW5pbWF0b3JDU1Mge1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGFuaW1hdGVcbiAgICogQGRlc2MgbWFpbiBhbmltYXRpb24gZnVuY3Rpb25cbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBmaW5hbENTU1xuICAgKiBAcGFyYW0ge251bWJlcn0gW2R1cmF0aW9uPTIwMF0gLSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHNcbiAgICogQHJldHVybiB7T2JqZWN0fSByZXN1bHRcbiAgICogQHJldHVybiB7RnVuY3Rpb259IHJlc3VsdC50aGVuKGNhbGxiYWNrKSAtIHNldHMgYSBjYWxsYmFjayB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgYW5pbWF0aW9uIGhhcyBzdG9wcGVkXG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufSByZXN1bHQuc3RvcChvcHRpb25zKSAtIHN0b3BzIHRoZSBhbmltYXRpb247IGlmIG9wdGlvbnMuc3RvcE5leHQgaXMgdHJ1ZSB0aGVuIGl0IGRvZXNuJ3QgY2FsbCB0aGUgY2FsbGJhY2tcbiAgICogQHJldHVybiB7RnVuY3Rpb259IHJlc3VsdC5maW5pc2gobXMpIC0gZmluaXNoZXMgdGhlIGFuaW1hdGlvbiBpbiB0aGUgc3BlY2lmaWVkIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufSByZXN1bHQuc3BlZWQobXMpIC0gc2V0cyB0aGUgYW5pbWF0aW9uIHNwZWVkIHNvIHRoYXQgaXQgZmluaXNoZXMgYXMgaWYgdGhlIG9yaWdpbmFsIGR1cmF0aW9uIHdhcyB0aGUgb25lIHNwZWNpZmllZCBoZXJlXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYGBcbiAgICogIHZhciByZXN1bHQgPSBhbmltYXRvci5hbmltYXRlKGVsLCB7b3BhY2l0eTogMC41fSwgMTAwMCk7XG4gICAqXG4gICAqICBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpe1xuICAgKiAgICByZXN1bHQuc3BlZWQoMjAwKS50aGVuKGZ1bmN0aW9uKCl7XG4gICAqICAgICAgY29uc29sZS5sb2coJ2RvbmUnKTtcbiAgICogICAgfSk7XG4gICAqICB9LCAzMDApO1xuICAgKiBgYGBgXG4gICAqL1xuICBhbmltYXRlKGVsLCBmaW5hbCwgZHVyYXRpb24gPSAyMDApIHtcbiAgICB2YXIgc3RhcnQgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpLFxuICAgICAgICBpbml0aWFsID0ge30sXG4gICAgICAgIHN0b3BwZWQgPSBmYWxzZSxcbiAgICAgICAgbmV4dCA9IGZhbHNlLFxuICAgICAgICB0aW1lb3V0ID0gZmFsc2UsXG4gICAgICAgIHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhmaW5hbCk7XG5cbiAgICB2YXIgdXBkYXRlU3R5bGVzID0gKCkgPT4ge1xuICAgICAgbGV0IHMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG4gICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocy5nZXRQcm9wZXJ0eVZhbHVlLmJpbmQocykpO1xuICAgICAgcyA9IGVsLm9mZnNldEhlaWdodDtcbiAgICB9O1xuXG4gICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgIHN0b3A6IChvcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgdGltZW91dCAmJiBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIHZhciBrID0gTWF0aC5taW4oMSwgKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLSBzdGFydCkgLyBkdXJhdGlvbik7XG4gICAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICBlbC5zdHlsZVtpXSA9ICgxIC0gaykgKiBpbml0aWFsW2ldICsgayAqIGZpbmFsW2ldICsgKGkgPT0gJ29wYWNpdHknID8gJycgOiAncHgnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9ICcwcyc7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc3RvcE5leHQpIHtcbiAgICAgICAgICBuZXh0ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoIXN0b3BwZWQpIHtcbiAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICBuZXh0ICYmIG5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHRoZW46IChjYikgPT4ge1xuICAgICAgICBuZXh0ID0gY2I7XG4gICAgICAgIGlmIChzdG9wcGVkKSB7XG4gICAgICAgICAgbmV4dCAmJiBuZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICBzcGVlZDogKG5ld0R1cmF0aW9uKSA9PiB7XG4gICAgICAgIGlmIChpbnRlcm5hbC5jb25maWcuYW5pbWF0aW9uc0Rpc2FibGVkKSB7XG4gICAgICAgICAgbmV3RHVyYXRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3RvcHBlZCkge1xuICAgICAgICAgIHRpbWVvdXQgJiYgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXG4gICAgICAgICAgY29uc3QgcGFzc2VkID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAtIHN0YXJ0O1xuICAgICAgICAgIGNvbnN0ICBrID0gcGFzc2VkIC8gZHVyYXRpb247XG4gICAgICAgICAgY29uc3QgcmVtYWluaW5nID0gbmV3RHVyYXRpb24gKiAoMSAtIGspO1xuXG4gICAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgZWwuc3R5bGVbaV0gPSAoMSAtIGspICogaW5pdGlhbFtpXSArIGsgKiBmaW5hbFtpXSArIChpID09ICdvcGFjaXR5JyA/ICcnIDogJ3B4Jyk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB1cGRhdGVTdHlsZXMoKTtcblxuICAgICAgICAgIHN0YXJ0ID0gZWwuc3BlZWRVcFRpbWU7XG4gICAgICAgICAgZHVyYXRpb24gPSByZW1haW5pbmc7XG5cbiAgICAgICAgICBlbC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBkdXJhdGlvbiAvIDEwMDAgKyAncyc7XG5cbiAgICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBlbC5zdHlsZVtpXSA9IGZpbmFsW2ldICsgKGkgPT0gJ29wYWNpdHknID8gJycgOiAncHgnKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHJlc3VsdC5zdG9wLCByZW1haW5pbmcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAgZmluaXNoOiAobWlsbGlzZWNvbmRzID0gNTApID0+IHtcbiAgICAgICAgdmFyIGsgPSAoKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAtIHN0YXJ0KSAvIGR1cmF0aW9uO1xuXG4gICAgICAgIHJlc3VsdC5zcGVlZChtaWxsaXNlY29uZHMgLyAoMSAtIGspKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGVsLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCBzdG9wcGVkIHx8IGludGVybmFsLmNvbmZpZy5hbmltYXRpb25zRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xuICAgIHByb3BlcnRpZXMuZm9yRWFjaChlID0+IHtcbiAgICAgIGNvbnN0IHYgPSBwYXJzZUZsb2F0KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoZSkpO1xuICAgICAgaW5pdGlhbFtlXSA9IGlzTmFOKHYpID8gMCA6IHY7XG4gICAgfSk7XG5cblxuICAgIGlmICghc3RvcHBlZCkge1xuICAgICAgZWwuc3R5bGUudHJhbnNpdGlvblByb3BlcnR5ID0gcHJvcGVydGllcy5qb2luKCcsJyk7XG4gICAgICBlbC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBkdXJhdGlvbiAvIDEwMDAgKyAncyc7XG5cbiAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChlID0+IHtcbiAgICAgICAgZWwuc3R5bGVbZV0gPSBmaW5hbFtlXSArIChlID09ICdvcGFjaXR5JyA/ICcnIDogJ3B4Jyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aW1lb3V0ID0gc2V0VGltZW91dChyZXN1bHQuc3RvcCwgZHVyYXRpb24pO1xuICAgIHRoaXMuX29uU3RvcEFuaW1hdGlvbnMoZWwsIHJlc3VsdC5zdG9wKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9xdWV1ZSA9IFtdO1xuICAgIHRoaXMuX2luZGV4ID0gMDtcbiAgfVxuXG4gIF9vblN0b3BBbmltYXRpb25zKGVsLCBsaXN0ZW5lcikge1xuICAgIHZhciBxdWV1ZSA9IHRoaXMuX3F1ZXVlO1xuICAgIHZhciBpID0gdGhpcy5faW5kZXgrKztcbiAgICBxdWV1ZVtlbF0gPSBxdWV1ZVtlbF0gfHwgW107XG4gICAgcXVldWVbZWxdW2ldID0gKG9wdGlvbnMpID0+IHtcbiAgICAgIGRlbGV0ZSBxdWV1ZVtlbF1baV07XG4gICAgICBpZiAocXVldWVbZWxdICYmIHF1ZXVlW2VsXS5sZW5ndGggPT0gMCkge1xuICAgICAgICBkZWxldGUgcXVldWVbZWxdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxpc3RlbmVyKG9wdGlvbnMpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgKiBAbWV0aG9kIHN0b3BBbmltYXRpb25zXG4gICogQGRlc2Mgc3RvcHMgYWN0aXZlIGFuaW1hdGlvbnMgb24gYSBzcGVjaWZpZWQgZWxlbWVudFxuICAqIEBwYXJhbSB7RWxlbWVudHxBcnJheX0gZWxlbWVudCAtIGVsZW1lbnQgb3IgYXJyYXkgb2YgZWxlbWVudHNcbiAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dXG4gICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zdG9wTmV4dF0gLSB0aGUgY2FsbGJhY2tzIGFmdGVyIHRoZSBhbmltYXRpb25zIHdvbid0IGJlIGNhbGxlZCBpZiB0aGlzIG9wdGlvbiBpcyB0cnVlXG4gICovXG4gIHN0b3BBbmltYXRpb25zKGVsLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbCkpIHtcbiAgICAgIHJldHVybiBlbC5mb3JFYWNoKGVsID0+IHtcbiAgICAgICAgdGhpcy5zdG9wQW5pbWF0aW9ucyhlbCwgb3B0aW9ucyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAodGhpcy5fcXVldWVbZWxdIHx8IFtdKS5mb3JFYWNoKGUgPT4geyBlKG9wdGlvbnMgfHwge30pOyB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIEBtZXRob2Qgc3RvcEFsbFxuICAqIEBkZXNjIHN0b3BzIGFsbCBhY3RpdmUgYW5pbWF0aW9uc1xuICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cbiAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnN0b3BOZXh0XSAtIHRoZSBjYWxsYmFja3MgYWZ0ZXIgdGhlIGFuaW1hdGlvbnMgd29uJ3QgYmUgY2FsbGVkIGlmIHRoaXMgb3B0aW9uIGlzIHRydWVcbiAgKi9cbiAgc3RvcEFsbChvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLnN0b3BBbmltYXRpb25zKE9iamVjdC5rZXlzKHRoaXMuX3F1ZXVlKSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgKiBAbWV0aG9kIGZhZGVcbiAgKiBAZGVzYyBmYWRlcyB0aGUgZWxlbWVudCAoc2hvcnQgdmVyc2lvbiBmb3IgYW5pbWF0ZShlbCwge29wYWNpdHk6IDB9KSlcbiAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgKiBAcGFyYW0ge251bWJlcn0gW2R1cmF0aW9uPTIwMF1cbiAgKi9cbiAgZmFkZShlbCwgZHVyYXRpb24gPSAyMDApIHtcbiAgICByZXR1cm4gdGhpcy5hbmltYXRlKGVsLCB7b3BhY2l0eTogMH0sIGR1cmF0aW9uKTtcbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEFuaW1hdG9yQ1NTO1xuXG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBpbnRlcm5hbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvaW5kZXguanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IEFuaW1hdG9yIGZyb20gJy4vb25zLXJpcHBsZS9hbmltYXRvci1jc3MuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcblxuY29uc3QgZGVmYXVsdENsYXNzTmFtZSA9ICdyaXBwbGUnO1xuY29uc3Qgc2NoZW1lID0ge1xuICAnJzogJ3JpcHBsZS0tKicsXG4gICcucmlwcGxlX193YXZlJzogJ3JpcHBsZS0tKl9fd2F2ZScsXG4gICcucmlwcGxlX19iYWNrZ3JvdW5kJzogJ3JpcHBsZS0tKl9fYmFja2dyb3VuZCcsXG59O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1yaXBwbGVcbiAqIEBjYXRlZ29yeSB2aXN1YWxcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgQWRkcyBhIE1hdGVyaWFsIERlc2lnbiBcInJpcHBsZVwiIGVmZmVjdCB0byBhbiBlbGVtZW50LiBUaGUgcmlwcGxlIGVmZmVjdCB3aWxsIHNwcmVhZCBmcm9tIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgdXNlciB0YXBzLlxuICpcbiAqICAgICBTb21lIGVsZW1lbnRzIHN1Y2ggYXMgYDxvbnMtYnV0dG9uPmAgYW5kIGA8b25zLWZhYj5gICBzdXBwb3J0IGEgYHJpcHBsZWAgYXR0cmlidXRlLlxuICogICBbL2VuXVxuICogICBbamFd44Oe44OG44Oq44Ki44Or44OH44K244Kk44Oz44Gu44Oq44OD44OX44Or5Yq55p6c44KSRE9N6KaB57Sg44Gr6L+95Yqg44GX44G+44GZ44CCWy9qYV1cbiAqIEBjb2RlcGVuIHdLUVdkWlxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3JpcHBsZVxuICogQG1vZGlmaWVyIGxpZ2h0LWdyYXlcbiAqICAgW2VuXUNoYW5nZSB0aGUgY29sb3Igb2YgZWZmZWN0cyB0byBsaWdodCBncmF5LlsvZW5dXG4gKiAgIFtqYV3jgqjjg5Xjgqfjgq/jg4jjga7oibLjgYzmmI7jgovjgYTngbDoibLjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICogQGd1aWRlIHRoZW1pbmcuaHRtbCNjcm9zcy1wbGF0Zm9ybS1zdHlsaW5nLWF1dG9zdHlsaW5nXG4gKiAgW2VuXUNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2VuXVxuICogIFtqYV1Dcm9zcyBwbGF0Zm9ybSBzdHlsaW5nWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8ZGl2IGNsYXNzPVwibXktZGl2XCI+XG4gKiAgPG9ucy1yaXBwbGU+PC9vbnMtcmlwcGxlPlxuICogPC9kaXY+XG4gKlxuICogQGV4YW1wbGVcbiAqIDxvbnMtYnV0dG9uIHJpcHBsZT5DbGljayBtZSE8L29ucy1idXR0b24+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJpcHBsZUVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgY29sb3JcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUNvbG9yIG9mIHRoZSByaXBwbGUgZWZmZWN0LlsvZW5dXG4gICAqICAgW2phXeODquODg+ODl+ODq+OCqOODleOCp+OCr+ODiOOBruiJsuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgcmlwcGxlIGVmZmVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqjjg5Xjgqfjgq/jg4jjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBiYWNrZ3JvdW5kXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZC5bL2VuXVxuICAgKiAgIFtqYV3og4zmma/jga7oibLjgpLoqK3lrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzaXplXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaXppbmcgb2YgdGhlIHdhdmUgb24gcmlwcGxlIGVmZmVjdC4gU2V0IFwiY292ZXJcIiBvciBcImNvbnRhaW5cIi4gRGVmYXVsdCBpcyBcImNvdmVyXCIuWy9lbl1cbiAgICogICBbamFd44Ko44OV44Kn44Kv44OI44Gu44K144Kk44K644KS5oyH5a6a44GX44G+44GZ44CCXCJjb3Zlclwi44KC44GX44GP44GvXCJjb250YWluXCLjgpLmjIflrprjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjga9cImNvdmVyXCLjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBjZW50ZXJcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBwcmVzZW50cywgY2hhbmdlIHRoZSBwb3NpdGlvbiBvZiB3YXZlIGVmZmVjdCB0byBjZW50ZXIgb2YgdGhlIHRhcmdldCBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXeOBk+OBruimgee0oOOCkuioreWumuOBmeOCi+OBqOOAgeOCqOODleOCp+OCr+ODiOOBruS9jee9ruOBjOimgee0oOOBruecn+OCk+S4reOBi+OCieWni+OBvuOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgY2VudGVyXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgcHJlc2VudHMsIGNoYW5nZSB0aGUgcG9zaXRpb24gb2Ygd2F2ZSBlZmZlY3QgdG8gY2VudGVyIG9mIHRoZSB0YXJnZXQgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7opoHntKDjgpLoqK3lrprjgZnjgovjgajjgIHjgqjjg5Xjgqfjgq/jg4jjga7kvY3nva7jgYzopoHntKDjga7nnJ/jgpPkuK3jgYvjgonlp4vjgb7jgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgcmlwcGxlIGVmZmVjdCB3aWxsIGJlIGRpc2FibGVkLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOioreWumuOBleOCjOOBn+WgtOWQiOOAgeODquODg+ODl+ODq+OCqOODleOCp+OCr+ODiOOBr+eEoeWKueOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9vblRhcCA9IHRoaXMuX29uVGFwLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25Ib2xkID0gdGhpcy5fb25Ib2xkLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25EcmFnU3RhcnQgPSB0aGlzLl9vbkRyYWdTdGFydC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uUmVsZWFzZSA9IHRoaXMuX29uUmVsZWFzZS5iaW5kKHRoaXMpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG5cbiAgICB0aGlzLl9hbmltYXRvciA9IG5ldyBBbmltYXRvcigpO1xuXG4gICAgWydjb2xvcicsICdjZW50ZXInLCAnc3RhcnQtcmFkaXVzJywgJ2JhY2tncm91bmQnLCAnbW9kaWZpZXInXS5mb3JFYWNoKGUgPT4ge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSwgbnVsbCwgdGhpcy5nZXRBdHRyaWJ1dGUoZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKGRlZmF1bHRDbGFzc05hbWUpO1xuXG4gICAgdGhpcy5fd2F2ZSA9IHRoaXMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncmlwcGxlX193YXZlJylbMF07XG4gICAgdGhpcy5fYmFja2dyb3VuZCA9IHRoaXMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncmlwcGxlX19iYWNrZ3JvdW5kJylbMF07XG5cbiAgICBpZiAoISh0aGlzLl9iYWNrZ3JvdW5kICYmIHRoaXMuX3dhdmUpKSB7XG4gICAgICB0aGlzLl93YXZlID0gdXRpbC5jcmVhdGUoJy5yaXBwbGVfX3dhdmUnKTtcbiAgICAgIHRoaXMuX2JhY2tncm91bmQgPSB1dGlsLmNyZWF0ZSgnLnJpcHBsZV9fYmFja2dyb3VuZCcpO1xuXG4gICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuX3dhdmUpO1xuICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLl9iYWNrZ3JvdW5kKTtcbiAgICB9XG5cbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gIH1cblxuICBfZ2V0RWZmZWN0U2l6ZSgpIHtcbiAgICBjb25zdCBzaXplcyA9IFsnY292ZXInLCAnY29udGFpbiddO1xuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnc2l6ZScpKSB7XG4gICAgICBjb25zdCBzaXplID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3NpemUnKTtcbiAgICAgIGlmIChzaXplcy5pbmRleE9mKHNpemUpICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gc2l6ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJ2NvdmVyJztcbiAgfVxuXG4gIF9jYWxjdWxhdGVDb29yZHMoZSkge1xuICAgIGxldCB4LCB5LCBoLCB3LCByO1xuICAgIGNvbnN0IGIgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHNpemUgPSB0aGlzLl9nZXRFZmZlY3RTaXplKCk7XG4gICAgY29uc3QgZXJyb3IgPSAoKSA9PiB1dGlsLnRocm93KCdSaXBwbGUgaW52YWxpZCBzdGF0ZScpO1xuXG4gICAgaWYgKHRoaXMuX2NlbnRlcikge1xuICAgICAgeCA9IGIud2lkdGggLyAyO1xuICAgICAgeSA9IGIuaGVpZ2h0IC8gMjtcblxuICAgICAgaWYgKHNpemUgPT09ICdjb3ZlcicpIHtcbiAgICAgICAgciA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbiAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PT0gJ2NvbnRhaW4nKSB7XG4gICAgICAgIHIgPSBNYXRoLm1pbih4LCB5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHggPSAodHlwZW9mIGUuY2xpZW50WCA9PT0gJ251bWJlcicgPyBlLmNsaWVudFggOiBlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFgpIC0gYi5sZWZ0O1xuICAgICAgeSA9ICh0eXBlb2YgZS5jbGllbnRZID09PSAnbnVtYmVyJyA/IGUuY2xpZW50WSA6IGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSkgLSBiLnRvcDtcbiAgICAgIGggPSBNYXRoLm1heCh5LCBiLmhlaWdodCAtIHkpO1xuICAgICAgdyA9IE1hdGgubWF4KHgsIGIud2lkdGggLSB4KTtcblxuICAgICAgaWYgKHNpemUgPT09ICdjb3ZlcicpIHtcbiAgICAgICAgciA9IE1hdGguc3FydChoICogaCArIHcgKiB3KTtcbiAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PT0gJ2NvbnRhaW4nKSB7XG4gICAgICAgIHIgPSBNYXRoLm1pbihNYXRoLnJvdW5kKGggLyAyKSwgTWF0aC5yb3VuZCh3IC8gMikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge3gsIHksIHJ9O1xuICB9XG5cbiAgX3JpcHBsZUFuaW1hdGlvbihlLCBkdXJhdGlvbiA9IDMwMCkge1xuICAgIGNvbnN0IHtfYW5pbWF0b3IsIF93YXZlLCBfYmFja2dyb3VuZCwgX21pblJ9ID0gdGhpcztcbiAgICBjb25zdCB7eCwgeSwgcn0gPSB0aGlzLl9jYWxjdWxhdGVDb29yZHMoZSk7XG5cbiAgICBfYW5pbWF0b3Iuc3RvcEFsbCh7c3RvcE5leHQ6IDF9KTtcbiAgICBfYW5pbWF0b3IuYW5pbWF0ZShfYmFja2dyb3VuZCwge29wYWNpdHk6IDF9LCBkdXJhdGlvbik7XG5cbiAgICB1dGlsLmV4dGVuZChfd2F2ZS5zdHlsZSwge1xuICAgICAgb3BhY2l0eTogMSxcbiAgICAgIHRvcDogeSAtIF9taW5SICsgJ3B4JyxcbiAgICAgIGxlZnQ6IHggLSBfbWluUiArICdweCcsXG4gICAgICB3aWR0aDogMiAqIF9taW5SICsgJ3B4JyxcbiAgICAgIGhlaWdodDogMiAqIF9taW5SICsgJ3B4J1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF9hbmltYXRvci5hbmltYXRlKF93YXZlLCB7XG4gICAgICB0b3A6IHkgLSByLFxuICAgICAgbGVmdDogeCAtIHIsXG4gICAgICBoZWlnaHQ6IDIgKiByLFxuICAgICAgd2lkdGg6IDIgKiByXG4gICAgfSwgZHVyYXRpb24pO1xuICB9XG5cbiAgX3VwZGF0ZVBhcmVudCgpIHtcbiAgICBpZiAoIXRoaXMuX3BhcmVudFVwZGF0ZWQgJiYgdGhpcy5wYXJlbnROb2RlKSB7XG4gICAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5wYXJlbnROb2RlKTtcbiAgICAgIGlmIChjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSB7XG4gICAgICAgIHRoaXMucGFyZW50Tm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICB9XG4gICAgICB0aGlzLl9wYXJlbnRVcGRhdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBfb25UYXAoZSkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhZS5yaXBwbGUpIHtcbiAgICAgIGUucmlwcGxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3VwZGF0ZVBhcmVudCgpO1xuICAgICAgdGhpcy5fcmlwcGxlQW5pbWF0aW9uKGUuZ2VzdHVyZS5zcmNFdmVudCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX2FuaW1hdG9yLmZhZGUodGhpcy5fd2F2ZSk7XG4gICAgICAgIHRoaXMuX2FuaW1hdG9yLmZhZGUodGhpcy5fYmFja2dyb3VuZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBfb25Ib2xkKGUpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIWUucmlwcGxlKSB7XG4gICAgICBlLnJpcHBsZSA9IHRydWU7XG4gICAgICB0aGlzLl91cGRhdGVQYXJlbnQoKTtcbiAgICAgIHRoaXMuX2hvbGRpbmcgPSB0aGlzLl9yaXBwbGVBbmltYXRpb24oZS5nZXN0dXJlLnNyY0V2ZW50LCAyMDAwKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3JlbGVhc2UnLCB0aGlzLl9vblJlbGVhc2UpO1xuICAgIH1cbiAgfVxuXG4gIF9vblJlbGVhc2UoZSkge1xuICAgIGlmICh0aGlzLl9ob2xkaW5nICYmICFlLnJpcHBsZSkge1xuICAgICAgZS5yaXBwbGUgPSB0cnVlO1xuICAgICAgdGhpcy5faG9sZGluZy5zcGVlZCgzMDApLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl9hbmltYXRvci5zdG9wQWxsKHtzdG9wTmV4dDogdHJ1ZX0pO1xuICAgICAgICB0aGlzLl9hbmltYXRvci5mYWRlKHRoaXMuX3dhdmUpO1xuICAgICAgICB0aGlzLl9hbmltYXRvci5mYWRlKHRoaXMuX2JhY2tncm91bmQpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2hvbGRpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWxlYXNlJywgdGhpcy5fb25SZWxlYXNlKTtcbiAgfVxuXG4gIF9vbkRyYWdTdGFydChlKSB7XG4gICAgaWYgKHRoaXMuX2hvbGRpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vblJlbGVhc2UoZSk7XG4gICAgfVxuICAgIGlmIChbJ2xlZnQnLCAncmlnaHQnXS5pbmRleE9mKGUuZ2VzdHVyZS5kaXJlY3Rpb24pICE9IC0xKSB7XG4gICAgICB0aGlzLl9vblRhcChlKTtcbiAgICB9XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9wYXJlbnROb2RlID0gdGhpcy5wYXJlbnROb2RlO1xuXG4gICAgaWYgKGludGVybmFsLmNvbmZpZy5hbmltYXRpb25zRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9wYXJlbnROb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ3RhcCcsIHRoaXMuX29uVGFwKTtcbiAgICAgIHRoaXMuX3BhcmVudE5vZGUuYWRkRXZlbnRMaXN0ZW5lcignaG9sZCcsIHRoaXMuX29uSG9sZCk7XG4gICAgICB0aGlzLl9wYXJlbnROb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMuX29uRHJhZ1N0YXJ0KTtcbiAgICB9XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBjb25zdCBwbiA9IHRoaXMuX3BhcmVudE5vZGUgfHwgdGhpcy5wYXJlbnROb2RlO1xuICAgIHBuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RhcCcsIHRoaXMuX29uVGFwKTtcbiAgICBwbi5yZW1vdmVFdmVudExpc3RlbmVyKCdob2xkJywgdGhpcy5fb25Ib2xkKTtcbiAgICBwbi5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnc3RhcnQnLCB0aGlzLl9vbkRyYWdTdGFydCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydzdGFydC1yYWRpdXMnLCAnY29sb3InLCAnYmFja2dyb3VuZCcsICdjZW50ZXInLCAnY2xhc3MnLCAnbW9kaWZpZXInXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG5cbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgdXRpbC5yZXN0b3JlQ2xhc3ModGhpcywgZGVmYXVsdENsYXNzTmFtZSwgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzdGFydC1yYWRpdXMnOlxuICAgICAgICB0aGlzLl9taW5SID0gTWF0aC5tYXgoMCwgcGFyc2VGbG9hdChjdXJyZW50KSB8fCAwKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2NvbG9yJzpcbiAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2F2ZS5zdHlsZS5iYWNrZ3JvdW5kID0gY3VycmVudDtcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ2JhY2tncm91bmQnKSkge1xuICAgICAgICAgICAgICB0aGlzLl9iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmQgPSBjdXJyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdiYWNrZ3JvdW5kJzpcbiAgICAgICAgaWYgKGN1cnJlbnQgfHwgbGFzdCkge1xuICAgICAgICAgIGlmIChjdXJyZW50ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX2JhY2tncm91bmQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICB0aGlzLl9iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmQgPSAndHJhbnNwYXJlbnQnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9iYWNrZ3JvdW5kLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2JhY2tncm91bmQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuX2JhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZCA9IGN1cnJlbnQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgIGlmIChuYW1lID09PSAnY2VudGVyJykge1xuICAgICAgICAgIHRoaXMuX2NlbnRlciA9IGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50ICE9ICdmYWxzZSc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFd54Sh5Yq55YyW44GV44KM44Gm44GE44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoUmlwcGxlRWxlbWVudCwgWydkaXNhYmxlZCcsICdjZW50ZXInXSk7XG5cbm9uc0VsZW1lbnRzLlJpcHBsZSA9IFJpcHBsZUVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1yaXBwbGUnLCBSaXBwbGVFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi8uLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi8uLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi8uLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlLWVsZW1lbnQuanMnO1xuXG5pbXBvcnQgJy4uL29ucy1yaXBwbGUuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlQnV0dG9uRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICBnZXQgX3NjaGVtZSgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBnZXR0ZXItcmV0dXJuXG4gICAgdXRpbC50aHJvd01lbWJlcigpO1xuICB9XG5cbiAgZ2V0IF9kZWZhdWx0Q2xhc3NOYW1lKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGdldHRlci1yZXR1cm5cbiAgICB1dGlsLnRocm93TWVtYmVyKCk7XG4gIH1cblxuICBnZXQgX3JpcHBsZU9wdCgpIHtcbiAgICByZXR1cm4gW3RoaXNdO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yID09PSBCYXNlQnV0dG9uRWxlbWVudCkge1xuICAgICAgdXRpbC50aHJvd0Fic3RyYWN0KCk7XG4gICAgfVxuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG4gIH1cblxuICBnZXQgX2ljb24oKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICdvbnMtaWNvbicpO1xuICB9XG5cbiAgZ2V0IF9oaWRkZW5CdXR0b24oKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICdidXR0b24nKTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuXG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKHRoaXMuX2RlZmF1bHRDbGFzc05hbWUpO1xuXG4gICAgaWYgKCF0aGlzLl9pY29uICYmIHRoaXMuaGFzQXR0cmlidXRlKCdpY29uJykpIHtcbiAgICAgIHV0aWwuY2hlY2tNaXNzaW5nSW1wb3J0KCdJY29uJyk7XG4gICAgICBjb25zdCBpY29uID0gdXRpbC5jcmVhdGVFbGVtZW50KGA8b25zLWljb24gaWNvbj1cIiR7dGhpcy5nZXRBdHRyaWJ1dGUoJ2ljb24nKX1cIj48L29ucy1pY29uPmApO1xuICAgICAgaWNvbi5jbGFzc0xpc3QuYWRkKHRoaXMuX2RlZmF1bHRDbGFzc05hbWUucmVwbGFjZSgnYnV0dG9uJywgJ2ljb24nKSk7XG4gICAgICB0aGlzLmluc2VydEJlZm9yZShpY29uLCB0aGlzLmZpcnN0Q2hpbGQpO1xuICAgIH1cblxuICAgIC8vIEFkZCBoaWRkZW4gYnV0dG9uIHRvIGFsbG93IGZvcm0gc3VibWlzc2lvblxuICAgIGlmICghdGhpcy5faGlkZGVuQnV0dG9uKSB7XG4gICAgICBjb25zdCBidXR0b24gPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJzxidXR0b24gaGlkZGVuPjwvYnV0dG9uPicpO1xuICAgICAgdGhpcy5hcHBlbmRDaGlsZChidXR0b24pO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZVJpcHBsZSgpO1xuXG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCB0aGlzLl9zY2hlbWUpO1xuICB9XG5cbiAgX3VwZGF0ZUljb24oKSB7XG4gICAgaWYgKHRoaXMuX2ljb24pIHtcbiAgICAgIHRoaXMuX2ljb24uc2V0QXR0cmlidXRlKCdpY29uJywgdGhpcy5nZXRBdHRyaWJ1dGUoJ2ljb24nKSk7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZVJpcHBsZSgpIHtcbiAgICB0aGlzLl9yaXBwbGVPcHQgJiYgdXRpbC51cGRhdGVSaXBwbGUoLi4udGhpcy5fcmlwcGxlT3B0KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ2NsYXNzJywgJ2ljb24nLCAncmlwcGxlJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCB0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lLCB0aGlzLl9zY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHRoaXMuX3NjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaWNvbic6XG4gICAgICAgIHRoaXMuX3VwZGF0ZUljb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyaXBwbGUnOlxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lKSAmJiB0aGlzLl91cGRhdGVSaXBwbGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoQmFzZUJ1dHRvbkVsZW1lbnQsIFsncmlwcGxlJywgJ2Rpc2FibGVkJ10pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgQmFzZUJ1dHRvbkVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtYnV0dG9uLmpzJztcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtYWN0aW9uLXNoZWV0LWJ1dHRvblxuICogQGNhdGVnb3J5IGRpYWxvZ1xuICogQG1vZGlmaWVyIGRlc3RydWN0aXZlXG4gKiAgIFtlbl1TaG93cyBhIFwiZGVzdHJ1Y3RpdmVcIiBidXR0b24gKG9ubHkgZm9yIGlPUykuWy9lbl1cbiAqICAgW2phXVwiZGVzdHJ1Y3RpdmVcIuOBquODnOOCv+ODs+OCkuihqOekuuOBl+OBvuOBmShpT1Pjgafjga7jgb/mnInlirkp44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQ29tcG9uZW50IHRoYXQgcmVwcmVzZW50IGVhY2ggYnV0dG9uIG9mIHRoZSBhY3Rpb24gc2hlZXQuWy9lbl1cbiAqICAgW2phXeOCouOCr+OCt+ODp+ODs+OCt+ODvOODiOOBq+ihqOekuuOBleOCjOOCi+WQhOODnOOCv+ODs+OCkuihqOePvuOBmeOCi+OCs+ODs+ODneODvOODjeODs+ODiOOBp+OBmeOAglsvamFdXG4gKiBAc2VlYWxzbyBvbnMtYWN0aW9uLXNoZWV0XG4gKiAgIFtlbl1UaGUgYDxvbnMtYWN0aW9uLXNoZWV0PmAgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1hY3Rpb24tc2hlZXTjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWxpc3QtaXRlbVxuICogICBbZW5dVGhlIGA8b25zLWxpc3QtaXRlbT5gIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtbGlzdC1pdGVt44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1pY29uXG4gKiAgIFtlbl1UaGUgYDxvbnMtaWNvbj5gIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtaWNvbuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvYWN0aW9uLXNoZWV0XG4gKiBAZ3VpZGUgYXBwc2l6ZS5odG1sI3JlbW92aW5nLWljb24tcGFja3MgW2VuXVJlbW92aW5nIGljb24gcGFja3MuWy9lbl1bamFdWy9qYV1cbiAqIEBndWlkZSBmYXEuaHRtbCNob3ctY2FuLWktdXNlLWN1c3RvbS1pY29uLXBhY2tzIFtlbl1BZGRpbmcgY3VzdG9tIGljb24gcGFja3MuWy9lbl1bamFdWy9qYV1cbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogICBbZW5dRGlzcGxheSBhIE1hdGVyaWFsIERlc2lnbiBhY3Rpb24gc2hlZXQgYnV0dG9uLlsvZW5dXG4gKiAgIFtqYV3jg57jg4bjg6rjgqLjg6vjg4fjgrbjgqTjg7Pjga7jgqLjgq/jgrfjg6fjg7Pjgrfjg7zjg4jnlKjjga7jg5zjgr/jg7PjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtYWN0aW9uLXNoZWV0IGlkPVwic2hlZXRcIj5cbiAqICAgPG9ucy1hY3Rpb24tc2hlZXQtYnV0dG9uPkxhYmVsPC9vbnMtYWN0aW9uLXNoZWV0LWJ1dHRvbj5cbiAqICAgPG9ucy1hY3Rpb24tc2hlZXQtYnV0dG9uPkxhYmVsPC9vbnMtYWN0aW9uLXNoZWV0LWJ1dHRvbj5cbiAqIDwvb25zLWFjdGlvbi1zaGVldD5cbiAqXG4gKiA8c2NyaXB0PlxuICogICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hlZXQnKS5zaG93KCk7XG4gKiA8L3NjcmlwdD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWN0aW9uU2hlZXRCdXR0b25FbGVtZW50IGV4dGVuZHMgQmFzZUJ1dHRvbkVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGljb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ3JlYXRlcyBhbiBgb25zLWljb25gIGNvbXBvbmVudCB3aXRoIHRoaXMgc3RyaW5nLiBPbmx5IHZpc2libGUgb24gQW5kcm9pZC4gQ2hlY2sgW1NlZSBhbHNvXSgjc2VlYWxzbykgc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5bL2VuXVxuICAgKiAgW2phXWBvbnMtaWNvbmDjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgpLmgqrmgKfjgZfjgb7jgZnjgIJBbmRyb2lk44Gn44Gu44G/6KGo56S644GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBhY3Rpb24gc2hlZXQgYnV0dG9uLlsvZW5dXG4gICAqICAgW2phXeOCouOCr+OCt+ODp+ODs+OCt+ODvOODiOODnOOCv+ODs+OBruimi+OBn+ebruOCkuioreWumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGdldCBfc2NoZW1lKCkge1xuICAgIHJldHVybiB7XG4gICAgICAnJzogJ2FjdGlvbi1zaGVldC1idXR0b24tLSonLFxuICAgICAgJy5hY3Rpb24tc2hlZXQtaWNvbic6ICdhY3Rpb24tc2hlZXQtaWNvbi0tKidcbiAgICB9O1xuICB9XG5cbiAgZ2V0IF9kZWZhdWx0Q2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnYWN0aW9uLXNoZWV0LWJ1dHRvbic7XG4gIH1cblxuICBnZXQgX3JpcHBsZU9wdCgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLkFjdGlvblNoZWV0QnV0dG9uID0gQWN0aW9uU2hlZXRCdXR0b25FbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtYWN0aW9uLXNoZWV0LWJ1dHRvbicsIEFjdGlvblNoZWV0QnV0dG9uRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IEJhc2VBbmltYXRvciBmcm9tICcuLi8uLi9vbnMvYmFzZS1hbmltYXRvci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ0FuaW1hdG9yIGV4dGVuZHMgQmFzZUFuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2xpbmVhcicsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjJ9ID0ge30pIHtcbiAgICBzdXBlcih7IHRpbWluZywgZGVsYXksIGR1cmF0aW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAqL1xuICBzaG93KGRpYWxvZywgZG9uZSkge1xuICAgIGRvbmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgKi9cbiAgaGlkZShkaWFsb2csIGRvbmUpIHtcbiAgICBkb25lKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbmRyb2lkIHN0eWxlIGFuaW1hdG9yIGZvciBhbGVydCBkaWFsb2cuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbmRyb2lkQWxlcnREaWFsb2dBbmltYXRvciBleHRlbmRzIEFsZXJ0RGlhbG9nQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjQsIDEpJywgZHVyYXRpb24gPSAwLjIsIGRlbGF5ID0gMH0gPSB7fSkge1xuICAgIHN1cGVyKHtkdXJhdGlvbiwgdGltaW5nLCBkZWxheX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNob3coZGlhbG9nLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9tYXNrLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoeyBvcGFjaXR5OiAwIH0sIHsgb3BhY2l0eTogMSB9KSxcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fZGlhbG9nLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKSBzY2FsZTNkKC45LCAuOSwgMSknLCBvcGFjaXR5OiAwIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKSBzY2FsZTNkKDEsIDEsIDEpJywgb3BhY2l0eTogMSB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZShkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDEgfSwgeyBvcGFjaXR5OiAwIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2csIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApIHNjYWxlM2QoMSwgMSwgMSknLCBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKSBzY2FsZTNkKC45LCAuOSwgMSknLCBvcGFjaXR5OiAwIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIGlPUyBzdHlsZSBhbmltYXRvciBmb3IgYWxlcnQgZGlhbG9nLlxuICovXG5leHBvcnQgY2xhc3MgSU9TQWxlcnREaWFsb2dBbmltYXRvciBleHRlbmRzIEFsZXJ0RGlhbG9nQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjQsIDEpJywgZHVyYXRpb24gPSAwLjIsIGRlbGF5ID0gMH0gPSB7fSkge1xuICAgIHN1cGVyKHtkdXJhdGlvbiwgdGltaW5nLCBkZWxheX0pO1xuICB9XG5cbiAgLypcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgc2hvdyhkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDAgfSwgeyBvcGFjaXR5OiAxIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2csIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApIHNjYWxlM2QoMS4zLCAxLjMsIDEpJywgb3BhY2l0eTogMCB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCkgc2NhbGUzZCgxLCAxLCAxKScsIG9wYWNpdHk6IDEgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGhpZGUoZGlhbG9nLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9tYXNrLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoeyBvcGFjaXR5OiAxIH0sIHsgb3BhY2l0eTogMCB9KSxcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fZGlhbG9nLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoeyBvcGFjaXR5OiAxIH0sIHsgb3BhY2l0eTogMCB9KVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQW5pbWF0b3JGYWN0b3J5IGZyb20gJy4uL29ucy9pbnRlcm5hbC9hbmltYXRvci1mYWN0b3J5LmpzJztcbmltcG9ydCB7IEFsZXJ0RGlhbG9nQW5pbWF0b3IsIElPU0FsZXJ0RGlhbG9nQW5pbWF0b3IsIEFuZHJvaWRBbGVydERpYWxvZ0FuaW1hdG9yIH0gZnJvbSAnLi9vbnMtYWxlcnQtZGlhbG9nL2FuaW1hdG9yLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9vbnMvcGxhdGZvcm0uanMnO1xuaW1wb3J0IEJhc2VEaWFsb2dFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWRpYWxvZy5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuY29uc3Qgc2NoZW1lID0ge1xuICAnLmFsZXJ0LWRpYWxvZyc6ICdhbGVydC1kaWFsb2ctLSonLFxuICAnLmFsZXJ0LWRpYWxvZy1jb250YWluZXInOiAnYWxlcnQtZGlhbG9nLWNvbnRhaW5lci0tKicsXG4gICcuYWxlcnQtZGlhbG9nLXRpdGxlJzogJ2FsZXJ0LWRpYWxvZy10aXRsZS0tKicsXG4gICcuYWxlcnQtZGlhbG9nLWNvbnRlbnQnOiAnYWxlcnQtZGlhbG9nLWNvbnRlbnQtLSonLFxuICAnLmFsZXJ0LWRpYWxvZy1mb290ZXInOiAnYWxlcnQtZGlhbG9nLWZvb3Rlci0tKicsXG4gICcuYWxlcnQtZGlhbG9nLWZvb3Rlci0tcm93Zm9vdGVyJzogJ2FsZXJ0LWRpYWxvZy1mb290ZXItLXJvd2Zvb3Rlci0tKicsXG4gICcuYWxlcnQtZGlhbG9nLWJ1dHRvbi0tcm93Zm9vdGVyJzogJ2FsZXJ0LWRpYWxvZy1idXR0b24tLXJvd2Zvb3Rlci0tKicsXG4gICcuYWxlcnQtZGlhbG9nLWJ1dHRvbi0tcHJpbWFsJzogJ2FsZXJ0LWRpYWxvZy1idXR0b24tLXByaW1hbC0tKicsXG4gICcuYWxlcnQtZGlhbG9nLWJ1dHRvbic6ICdhbGVydC1kaWFsb2ctYnV0dG9uLS0qJyxcbiAgJ29ucy1hbGVydC1kaWFsb2ctYnV0dG9uJzogJ2FsZXJ0LWRpYWxvZy1idXR0b24tLSonLFxuICAnLmFsZXJ0LWRpYWxvZy1tYXNrJzogJ2FsZXJ0LWRpYWxvZy1tYXNrLS0qJyxcbiAgJy50ZXh0LWlucHV0JzogJ3RleHQtaW5wdXQtLSonXG59O1xuXG5jb25zdCBfYW5pbWF0b3JEaWN0ID0ge1xuICAnbm9uZSc6IEFsZXJ0RGlhbG9nQW5pbWF0b3IsXG4gICdkZWZhdWx0JzogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBBbmRyb2lkQWxlcnREaWFsb2dBbmltYXRvciA6IElPU0FsZXJ0RGlhbG9nQW5pbWF0b3I7IH0sXG4gICdmYWRlJzogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBBbmRyb2lkQWxlcnREaWFsb2dBbmltYXRvciA6IElPU0FsZXJ0RGlhbG9nQW5pbWF0b3I7IH1cbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWFsZXJ0LWRpYWxvZ1xuICogQGNhdGVnb3J5IGRpYWxvZ1xuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBBbGVydCBkaWFsb2cgdGhhdCBpcyBkaXNwbGF5ZWQgb24gdG9wIG9mIHRoZSBjdXJyZW50IHNjcmVlbi4gVXNlZnVsIGZvciBkaXNwbGF5aW5nIHF1ZXN0aW9ucywgd2FybmluZ3Mgb3IgZXJyb3IgbWVzc2FnZXMgdG8gdGhlIHVzZXIuIFRoZSB0aXRsZSwgY29udGVudCBhbmQgYnV0dG9ucyBjYW4gYmUgZWFzaWx5IGN1c3RvbWl6ZWQgYW5kIGl0IHdpbGwgYXV0b21hdGljYWxseSBzd2l0Y2ggc3R5bGUgYmFzZWQgb24gdGhlIHBsYXRmb3JtLlxuICpcbiAqICAgICBUbyB1c2UgdGhlIGVsZW1lbnQgaXQgY2FuIGVpdGhlciBiZSBhdHRhY2hlZCBkaXJlY3RseSB0byB0aGUgYDxib2R5PmAgZWxlbWVudCBvciBkeW5hbWljYWxseSBjcmVhdGVkIGZyb20gYSB0ZW1wbGF0ZSB1c2luZyB0aGUgYG9ucy5jcmVhdGVBbGVydERpYWxvZyh0ZW1wbGF0ZSlgIHV0aWxpdHkgZnVuY3Rpb24gYW5kIHRoZSBgPHRlbXBsYXRlPmAgdGFnLlxuICogICBbL2VuXVxuICogICBbamFdXG4gKiAgICAg54++5Zyo44Gu44K544Kv44Oq44O844Oz44Gu5LiK44Gr6KGo56S644GZ44KL44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44Gn44GZ44CC44Om44O844K244Gr5a++44GZ44KL5ZWP44GE44GL44GR44CB6K2m5ZGK44CB44Ko44Op44O844Oh44OD44K744O844K444KS6KGo56S644GZ44KL44Gu44Gr5Yip55So44Gn44GN44G+44GZ44CC44K/44Kk44OI44Or44KE44Kz44Oz44OG44Oz44OE44KE44Oc44K/44Oz44Gv57Ch5Y2Y44Gr44Kr44K544K/44Oe44Kk44K644Gn44GN44CB5a6f6KGM44GX44Gm44GE44KL44OX44Op44OD44OI44OV44Kp44O844Og44Gr5L2144Gb44Gm44K544K/44Kk44Or44GM6Ieq5YuV55qE44Gr5YiH44KK5pu/44KP44KK44G+44GZ44CCXG4gKiAgIFsvamFdXG4gKiBAY29kZXBlbiBRd3d4eXBcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9hbGVydC1kaWFsb2dcbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogICBbZW5dTWF0ZXJpYWwgRGVzaWduIHN0eWxlWy9lbl1cbiAqICAgW2phXeODnuODhuODquOCouODq+ODh+OCtuOCpOODs+OBruOCueOCv+OCpOODq1svamFdXG4gKiBAbW9kaWZpZXIgcm93Zm9vdGVyXG4gKiAgIFtlbl1Ib3Jpem9udGFsbHkgYWxpZ25zIHRoZSBmb290ZXIgYnV0dG9ucy5bL2VuXVxuICogICBbamFd44OV44OD44K/44O844Gu6KSH5pWw44Gu44Oc44K/44Oz44KS5rC05bmz44Gr6YWN572uWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1kaWFsb2dcbiAqICAgW2VuXW9ucy1kaWFsb2cgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1kaWFsb2fjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLXBvcG92ZXJcbiAqICAgW2VuXW9ucy1wb3BvdmVyIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtZGlhbG9n44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy5ub3RpZmljYXRpb25cbiAqICAgW2VuXVVzaW5nIG9ucy5ub3RpZmljYXRpb24gdXRpbGl0eSBmdW5jdGlvbnMuWy9lbl1cbiAqICAgW2phXeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOCkuihqOekuuOBmeOCi+OBq+OBr+OAgW9ucy5ub3RpZmljYXRpb27jgqrjg5bjgrjjgqfjgq/jg4jjga7jg6Hjgr3jg4Pjg4njgpLkvb/jgYbjgZPjgajjgoLjgafjgY3jgb7jgZnjgIJbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtYWxlcnQtZGlhbG9nIGlkPVwiYWxlcnQtZGlhbG9nXCI+XG4gKiAgIDxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2ctdGl0bGVcIj5XYXJuaW5nITwvZGl2PlxuICogICA8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nLWNvbnRlbnRcIj5cbiAqICAgICBBbiBlcnJvciBoYXMgb2NjdXJyZWQhXG4gKiAgIDwvZGl2PlxuICogICA8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nLWZvb3RlclwiPlxuICogICAgIDxidXR0b24gaWQ9XCJhbGVydC1kaWFsb2ctYnV0dG9uXCIgY2xhc3M9XCJhbGVydC1kaWFsb2ctYnV0dG9uXCI+T0s8L2J1dHRvbj5cbiAqICAgPC9kaXY+XG4gKiA8L29ucy1hbGVydC1kaWFsb2c+XG4gKiA8c2NyaXB0PlxuICogICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWxlcnQtZGlhbG9nJykuc2hvdygpO1xuICogPC9zY3JpcHQ+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFsZXJ0RGlhbG9nRWxlbWVudCBleHRlbmRzIEJhc2VEaWFsb2dFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IHByZXNob3dcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYmVmb3JlIHRoZSBhbGVydCBkaWFsb2cgaXMgZGlzcGxheWVkLlsvZW5dXG4gICAqICAgW2phXeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOBjOihqOekuuOBleOCjOOCi+ebtOWJjeOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5hbGVydERpYWxvZ1xuICAgKiAgIFtlbl1BbGVydCBkaWFsb2cgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNhbmNlbFxuICAgKiAgIFtlbl1FeGVjdXRlIHRvIHN0b3AgdGhlIGRpYWxvZyBmcm9tIHNob3dpbmcuWy9lbl1cbiAgICogICBbamFd44GT44Gu6Zai5pWw44KS5a6f6KGM44GZ44KL44Go44CB44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44Gu6KGo56S644KS5q2i44KB44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0c2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBhZnRlciB0aGUgYWxlcnQgZGlhbG9nIGlzIGRpc3BsYXllZC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjgYzooajnpLrjgZXjgozjgZ/nm7TlvozjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuYWxlcnREaWFsb2dcbiAgICogICBbZW5dQWxlcnQgZGlhbG9nIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHByZWhpZGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYmVmb3JlIHRoZSBhbGVydCBkaWFsb2cgaXMgaGlkZGVuLlsvZW5dXG4gICAqICAgW2phXeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOBjOmaoOOCjOOCi+ebtOWJjeOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5hbGVydERpYWxvZ1xuICAgKiAgIFtlbl1BbGVydCBkaWFsb2cgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCouODqeODvOODiOODgOOCpOOCouODreOCsOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNhbmNlbFxuICAgKiAgIFtlbl1FeGVjdXRlIHRvIHN0b3AgdGhlIGRpYWxvZyBmcm9tIGhpZGluZy5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7plqLmlbDjgpLlrp/ooYzjgZnjgovjgajjgIHjgqLjg6njg7zjg4jjg4DjgqTjgqLjg63jgrDjgYzplonjgZjjgojjgYbjgajjgZnjgovjga7jgpLmraLjgoHjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3RoaWRlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBbZW5dRmlyZWQganVzdCBhZnRlciB0aGUgYWxlcnQgZGlhbG9nIGlzIGhpZGRlbi5bL2VuXVxuICAgKiBbamFd44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44GM6Zqg44KM44Gf5b6M44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmFsZXJ0RGlhbG9nXG4gICAqICAgW2VuXUFsZXJ0IGRpYWxvZyBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBkaWFsb2djYW5jZWxcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCB3aGVuIHRoZSBkaWFsb2cgaXMgY2FuY2VsZWQuWy9lbl1cbiAgICogW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBkaWFsb2cuWy9lbl1cbiAgICogIFtqYV3jg4DjgqTjgqLjg63jgrDjga7opovjgZ/nm67jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBjYW5jZWxhYmxlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgZGlhbG9nIGNhbiBiZSBjbG9zZWQgYnkgdGFwcGluZyB0aGUgYmFja2dyb3VuZCBvciBieSBwcmVzc2luZyB0aGUgYmFjayBidXR0b24gb24gQW5kcm9pZCBkZXZpY2VzLlsvZW5dXG4gICAqICBbamFd44GT44Gu5bGe5oCn44KS6Kit5a6a44GZ44KL44Go44CB44OA44Kk44Ki44Ot44Kw44Gu6IOM5pmv44KS44K/44OD44OX44GX44Gf44KKQW5kcm9pZOODh+ODkOOCpOOCueOBruODkOODg+OCr+ODnOOCv+ODs+OCkuaKvOOBmeOBqOODgOOCpOOCouODreOCsOOBjOmWieOBmOOCi+OCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGRpc2FibGVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgZGlhbG9nIGlzIGRpc2FibGVkLlsvZW5dXG4gICAqICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL5pmC44CB44Ki44Op44O844OI44OA44Kk44Ki44Ot44Kw44GvZGlzYWJsZWTnirbmhYvjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlZmF1bHQgZGVmYXVsdFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBzaG93aW5nIGFuZCBoaWRpbmcgdGhlIGRpYWxvZy4gQ2FuIGJlIGVpdGhlciBgXCJub25lXCJgIG9yIGBcImRlZmF1bHRcImAuWy9lbl1cbiAgICogIFtqYV3jg4DjgqTjgqLjg63jgrDjgpLooajnpLrjgZnjgovpmpvjga7jgqLjg4vjg6Hjg7zjgrfjg6fjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjgafjga9cIm5vbmVcIuOBi1wiZGVmYXVsdFwi44GM5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uLW9wdGlvbnNcbiAgICogQHR5cGUge0V4cHJlc3Npb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CC5L6L77yae2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtYXNrLWNvbG9yXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IHJnYmEoMCwgMCwgMCwgMC4yKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZCBtYXNrLiBEZWZhdWx0IGlzIFwicmdiYSgwLCAwLCAwLCAwLjIpXCIuWy9lbl1cbiAgICogIFtqYV3og4zmma/jga7jg57jgrnjgq/jga7oibLjgpLmjIflrprjgZfjgb7jgZnjgIJcInJnYmEoMCwgMCwgMCwgMC4yKVwi44GM44OH44OV44Kp44Or44OI5YCk44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdmlzaWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGFsZXJ0IGRpYWxvZyBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG4gIH1cblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4gc2NoZW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqL1xuICBnZXQgX21hc2soKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICcuYWxlcnQtZGlhbG9nLW1hc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKi9cbiAgZ2V0IF9kaWFsb2coKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICcuYWxlcnQtZGlhbG9nJyk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKi9cbiAgZ2V0IF90aXRsZUVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMuX2RpYWxvZy5jaGlsZHJlblswXSwgJy5hbGVydC1kaWFsb2ctdGl0bGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKi9cbiAgZ2V0IF9jb250ZW50RWxlbWVudCgpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcy5fZGlhbG9nLmNoaWxkcmVuWzBdLCAnLmFsZXJ0LWRpYWxvZy1jb250ZW50Jyk7XG4gIH1cblxuICBfdXBkYXRlQW5pbWF0b3JGYWN0b3J5KCkge1xuICAgIHJldHVybiBuZXcgQW5pbWF0b3JGYWN0b3J5KHtcbiAgICAgIGFuaW1hdG9yczogX2FuaW1hdG9yRGljdCxcbiAgICAgIGJhc2VDbGFzczogQWxlcnREaWFsb2dBbmltYXRvcixcbiAgICAgIGJhc2VDbGFzc05hbWU6ICdBbGVydERpYWxvZ0FuaW1hdG9yJyxcbiAgICAgIGRlZmF1bHRBbmltYXRpb246IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKVxuICAgIH0pO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG5cbiAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy5zdHlsZS56SW5kZXggPSAxMDAwMTtcblxuICAgIC8qKlxuICAgICAqIEV4cGVjdGVkIHJlc3VsdCBhZnRlciBjb21waWxlOlxuICAgICAqXG4gICAgICogPG9ucy1hbGVydC1kaWFsb2cgc3R5bGU9XCJub25lXCI+XG4gICAgICogICA8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nLW1hc2tcIj48L2Rpdj5cbiAgICAgKiAgIDxkaXYgY2xhc3M9XCJhbGVydC1kaWFsb2dcIj5cbiAgICAgKiAgICAgPGRpdiBjbGFzcz1cImFsZXJ0LWRpYWxvZy1jb250YWluZXJcIj4uLi48L2Rpdj5cbiAgICAgKiAgIDwvZGl2PlxuICAgICAqIDwvb25zLWFsZXJ0LWRpYWxvZz5cbiAgICAgKi9cblxuICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG5cbiAgICBpZiAoIXRoaXMuX21hc2sgJiYgIXRoaXMuX2RpYWxvZykge1xuICAgICAgd2hpbGUgKHRoaXMuZmlyc3RDaGlsZCkge1xuICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKHRoaXMuZmlyc3RDaGlsZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9tYXNrKSB7XG4gICAgICBjb25zdCBtYXNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBtYXNrLmNsYXNzTGlzdC5hZGQoJ2FsZXJ0LWRpYWxvZy1tYXNrJyk7XG4gICAgICB0aGlzLmluc2VydEJlZm9yZShtYXNrLCB0aGlzLmNoaWxkcmVuWzBdKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2RpYWxvZykge1xuICAgICAgY29uc3QgZGlhbG9nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBkaWFsb2cuY2xhc3NMaXN0LmFkZCgnYWxlcnQtZGlhbG9nJyk7XG4gICAgICB0aGlzLmluc2VydEJlZm9yZShkaWFsb2csIG51bGwpO1xuICAgIH1cblxuICAgIGlmICghdXRpbC5maW5kQ2hpbGQodGhpcy5fZGlhbG9nLCAnLmFsZXJ0LWRpYWxvZy1jb250YWluZXInKSkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnYWxlcnQtZGlhbG9nLWNvbnRhaW5lcicpO1xuICAgICAgdGhpcy5fZGlhbG9nLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgdGhpcy5fZGlhbG9nLmNoaWxkcmVuWzBdLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuXG4gICAgdGhpcy5fZGlhbG9nLnN0eWxlLnpJbmRleCA9IDIwMDAxO1xuICAgIHRoaXMuX21hc2suc3R5bGUuekluZGV4ID0gMjAwMDA7XG5cbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHRoaXMuX3NjaGVtZSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFd54Sh5Yq55YyW44GV44KM44Gm44GE44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBjYW5jZWxhYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZGlhbG9nIGlzIGNhbmNlbGFibGUgb3Igbm90LiBBIGNhbmNlbGFibGUgZGlhbG9nIGNhbiBiZSBjbG9zZWQgYnkgdGFwcGluZyB0aGUgYmFja2dyb3VuZCBvciBieSBwcmVzc2luZyB0aGUgYmFjayBidXR0b24gb24gQW5kcm9pZCBkZXZpY2VzLlsvZW5dXG4gICAqICAgW2phXeOBneOBruODgOOCpOOCouODreOCsOOBjOOCreODo+ODs+OCu+ODq+WPr+iDveOBi+OBqeOBhuOBi+OCkuihqOOBl+OBvuOBmeOAguOCreODo+ODs+OCu+ODq+WPr+iDveOBquODgOOCpOOCouODreOCsOOBr+OAgeiDjOaZr+OCkuOCv+ODg+ODl+OBmeOCi+OBi0FuZHJvaWTjg4fjg5DjgqTjgrnjga7jg5Djg4Pjgq/jg5zjgr/jg7PjgpLmirzjgZnjgZPjgajjgafplonjgZjjgovjgZPjgajjgYzlh7rmnaXjgovjgojjgYbjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IG1hc2tDb2xvclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCByZ2JhKDAsIDAsIDAsIDAuMilcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ29sb3Igb2YgdGhlIGJhY2tncm91bmQgbWFzay4gRGVmYXVsdCBpcyBcInJnYmEoMCwgMCwgMCwgMC4yKVwiLlsvZW5dXG4gICAqICBbamFd6IOM5pmv44Gu44Oe44K544Kv44Gu6Imy44KS5oyH5a6a44GX44G+44GZ44CCXCJyZ2JhKDAsIDAsIDAsIDAuMilcIuOBjOODh+ODleOCqeODq+ODiOWApOOBp+OBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNob3dcbiAgICogQHNpZ25hdHVyZSBzaG93KFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYFwiZmFkZVwiYCBhbmQgYFwibm9uZVwiYC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgILmjIflrprjgafjgY3jgovjga7jga/jgIFcImZhZGVcIiwgXCJub25lXCLjga7jgYTjgZrjgozjgYvjgafjgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4gPGNvZGU+e2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfTwvY29kZT4gWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXUZ1bmN0aW9uIHRvIGV4ZWN1dGUgYWZ0ZXIgdGhlIGRpYWxvZyBoYXMgYmVlbiByZXZlYWxlZC5bL2VuXVxuICAgKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzooajnpLrjgZXjgozntYLjgo/jgaPjgZ/mmYLjgavlkbzjgbPlh7rjgZXjgozjgovjgrPjg7zjg6vjg5Djg4Pjgq/jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU2hvdyB0aGUgYWxlcnQgZGlhbG9nLlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXUEgYFByb21pc2VgIG9iamVjdCB0aGF0IHJlc29sdmVzIHRvIHRoZSBkaXNwbGF5ZWQgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV3ooajnpLrjgZXjgozjgovopoHntKDjgpLop6PmsbrjgZnjgotgUHJvbWlzZWDjgqrjg5bjgrjjgqfjgq/jg4jjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBoaWRlXG4gICAqIEBzaWduYXR1cmUgaGlkZShbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1BbmltYXRpb24gbmFtZS4gQXZhaWxhYmxlIGFuaW1hdGlvbnMgYXJlIGBcImZhZGVcImAgYW5kIGBcIm5vbmVcImAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCXCJmYWRlXCIsIFwibm9uZVwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuICA8Y29kZT57ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9PC9jb2RlPlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCBkZWxheSwgdGltaW5n44KS5oyH5a6a44GX44G+44GZ44CCZS5nLiA8Y29kZT57ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9PC9jb2RlPiBbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dRnVuY3Rpb24gdG8gZXhlY3V0ZSBhZnRlciB0aGUgZGlhbG9nIGhhcyBiZWVuIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7jg4DjgqTjgqLjg63jgrDjgYzplonjgZjjgZ/mmYLjgavlkbzjgbPlh7rjgZXjgozjgovjgrPjg7zjg6vjg5Djg4Pjgq/jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSGlkZSB0aGUgYWxlcnQgZGlhbG9nLlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOCkumWieOBmOOBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBoaWRkZW4gZWxlbWVudFsvZW5dXG4gICAqICAgW2phXemaoOOCjOOBn+imgee0oOOCkuino+axuuOBmeOCi2BQcm9taXNlYOOCquODluOCuOOCp+OCr+ODiOOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmlzaWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGRpYWxvZyBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IG9uRGV2aWNlQmFja0J1dHRvblxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQmFjay1idXR0b24gaGFuZGxlci5bL2VuXVxuICAgKiAgIFtqYV3jg5Djg4Pjgq/jg5zjgr/jg7Pjg4/jg7Pjg4njg6njgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAguS+i++8mntkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7RGlhbG9nQW5pbWF0b3J9IEFuaW1hdG9yXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJBbmltYXRvcihuYW1lLCBBbmltYXRvcikge1xuICAgIGlmICghKEFuaW1hdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIEFsZXJ0RGlhbG9nQW5pbWF0b3IpKSB7XG4gICAgICB1dGlsLnRocm93QW5pbWF0b3IoJ0FsZXJ0RGlhbG9nJyk7XG4gICAgfVxuICAgIF9hbmltYXRvckRpY3RbbmFtZV0gPSBBbmltYXRvcjtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgYW5pbWF0b3JzKCkge1xuICAgIHJldHVybiBfYW5pbWF0b3JEaWN0O1xuICB9XG5cbiAgc3RhdGljIGdldCBBbGVydERpYWxvZ0FuaW1hdG9yKCkge1xuICAgIHJldHVybiBBbGVydERpYWxvZ0FuaW1hdG9yO1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLkFsZXJ0RGlhbG9nID0gQWxlcnREaWFsb2dFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtYWxlcnQtZGlhbG9nJywgQWxlcnREaWFsb2dFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IEJhc2VCdXR0b25FbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWJ1dHRvbi5qcyc7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWFsZXJ0LWRpYWxvZy1idXR0b25cbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogICBbZW5dTWF0ZXJpYWwgRGVzaWduIGFsZXJ0LWRpYWxvZyBidXR0b24uWy9lbl1cbiAqICAgW2phXeODnuODhuODquOCouODq+ODh+OCtuOCpOODs+OBruODnOOCv+ODs+OCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLWFsZXJ0LWRpYWxvZ1xuICogICBbZW5dVGhlIGA8b25zLWFsZXJ0LWRpYWxvZz5gIGNvbXBvbmVudCBkaXNwbGF5cyBhIGFsZXJ0IGRpYWxvZy5bL2VuXVxuICogICBbamFdb25zLWFsZXJ0LWRpYWxvZ+OCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogIDxvbnMtYWxlcnQtZGlhbG9nPlxuICogICAgPGRpdiBjbGFzcz1cImFsZXJ0LWRpYWxvZy10aXRsZVwiPldhcm5pbmchPC9kaXY+XG4gKiAgICA8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nLWNvbnRlbnRcIj5cbiAqICAgICAgQW4gZXJyb3IgaGFzIG9jY3VycmVkIVxuICogICAgPC9kaXY+XG4gKiAgICA8ZGl2IGNsYXNzPVwiYWxlcnQtZGlhbG9nLWZvb3RlclwiPlxuICogICAgICA8YWxlcnQtZGlhbG9nLWJ1dHRvbiBvbmNsaWNrPVwiYXBwLmNsb3NlKClcIj5DYW5jZWw8L2FsZXJ0LWRpYWxvZy1idXR0b24+XG4gKiAgICAgIDxhbGVydC1kaWFsb2ctYnV0dG9uIGNsYXNzPVwiYWxlcnQtZGlhbG9nLWJ1dHRvblwiIG9uY2xpY2s9XCJhcHAuY2xvc2UoKVwiPk9LPC9hbGVydC1kaWFsb2ctYnV0dG9uPlxuICogICAgPC9kaXY+XG4gKiAgPC9vbnMtYWxlcnQtZGlhbG9nPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBbGVydERpYWxvZ0J1dHRvbkVsZW1lbnQgZXh0ZW5kcyBCYXNlQnV0dG9uRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBidXR0b24uWy9lbl1cbiAgICogICBbamFd44Oc44K/44Oz44Gu6KGo54++44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgaWYgYnV0dG9uIHNob3VsZCBiZSBkaXNhYmxlZC5bL2VuXVxuICAgKiAgIFtqYV3jg5zjgr/jg7PjgpLnhKHlirnljJbjgZnjgovloLTlkIjjga/mjIflrprjgZfjgabjgY/jgaDjgZXjgYTjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFd54Sh5Yq55YyW44GV44KM44Gm44GE44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgZ2V0IF9zY2hlbWUoKSB7XG4gICAgcmV0dXJuIHsgJyc6ICdhbGVydC1kaWFsb2ctYnV0dG9uLS0qJyB9O1xuICB9XG5cbiAgZ2V0IF9kZWZhdWx0Q2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnYWxlcnQtZGlhbG9nLWJ1dHRvbic7XG4gIH1cblxuICBnZXQgX3JpcHBsZU9wdCgpIHtcbiAgICByZXR1cm4gW3RoaXMsIHVuZGVmaW5lZCwgeyAnbW9kaWZpZXInOiAnbGlnaHQtZ3JheScgfV07XG4gIH1cbn1cblxub25zRWxlbWVudHMuQWxlcnREaWFsb2dCdXR0b24gPSBBbGVydERpYWxvZ0J1dHRvbkVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1hbGVydC1kaWFsb2ctYnV0dG9uJywgQWxlcnREaWFsb2dCdXR0b25FbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnYmFjay1idXR0b24nO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcnOiAnYmFjay1idXR0b24tLSonLFxuICAnLmJhY2stYnV0dG9uX19pY29uJzogJ2JhY2stYnV0dG9uLS0qX19pY29uJyxcbiAgJy5iYWNrLWJ1dHRvbl9fbGFiZWwnOiAnYmFjay1idXR0b24tLSpfX2xhYmVsJ1xufTtcblxuLy8gb3JpZ2luYWwgaW1hZ2UgZmlsZSBhdCBtaXNjL2ltYWdlcy9pb3MtYmFjay1idXR0b24taWNvbi5zdmdcbmNvbnN0IGlvc0JhY2tCdXR0b25JY29uID0gYFxuICA8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiAgPHN2ZyB3aWR0aD1cIjEzcHhcIiBoZWlnaHQ9XCIyMXB4XCIgdmlld0JveD1cIjAgMCAxMyAyMVwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+XG4gICAgICA8dGl0bGU+aW9zLWJhY2stYnV0dG9uLWljb248L3RpdGxlPlxuICAgICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+XG4gICAgICA8ZGVmcz48L2RlZnM+XG4gICAgICA8ZyBpZD1cInRvb2xiYXItYmFjay1idXR0b25cIiBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cbiAgICAgICAgICA8ZyBpZD1cImlvc1wiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtMzQuMDAwMDAwLCAtMzAuMDAwMDAwKVwiPlxuICAgICAgICAgICAgICA8cG9seWdvbiBpZD1cImlvcy1iYWNrLWJ1dHRvbi1pY29uXCIgcG9pbnRzPVwiMzQgNDAuNSA0NC41IDMwIDQ2LjUgMzIgMzggNDAuNSA0Ni41IDQ5IDQ0LjUgNTFcIj48L3BvbHlnb24+XG4gICAgICAgICAgPC9nPlxuICAgICAgPC9nPlxuICA8L3N2Zz5cbmA7XG5cbi8vIG9yaWdpbmFsIGltYWdlIGZpbGUgYXQgbWlzYy9pbWFnZXMvbWQtYmFjay1idXR0b24taWNvbi5zdmdcbmNvbnN0IG1kQmFja0J1dHRvbkljb24gPSBgXG4gIDw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuICA8c3ZnIHdpZHRoPVwiMTZweFwiIGhlaWdodD1cIjE2cHhcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIj5cbiAgICAgIDx0aXRsZT5tZC1iYWNrLWJ1dHRvbi1pY29uPC90aXRsZT5cbiAgICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPlxuICAgICAgPGRlZnM+PC9kZWZzPlxuICAgICAgPGcgaWQ9XCJ0b29sYmFyLWJhY2stYnV0dG9uXCIgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+XG4gICAgICAgICAgPGcgaWQ9XCJhbmRyb2lkXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0zMi4wMDAwMDAsIC0zMi4wMDAwMDApXCIgZmlsbC1ydWxlPVwibm9uemVyb1wiPlxuICAgICAgICAgICAgICA8cG9seWdvbiBpZD1cIm1kLWJhY2stYnV0dG9uLWljb25cIiBwb2ludHM9XCI0OCAzOSAzNS44MyAzOSA0MS40MiAzMy40MSA0MCAzMiAzMiA0MCA0MCA0OCA0MS40MSA0Ni41OSAzNS44MyA0MSA0OCA0MVwiPjwvcG9seWdvbj5cbiAgICAgICAgICA8L2c+XG4gICAgICA8L2c+XG4gIDwvc3ZnPlxuYDtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtYmFjay1idXR0b25cbiAqIEBjYXRlZ29yeSBuYXZpZ2F0aW9uXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIEJhY2sgYnV0dG9uIGNvbXBvbmVudCBmb3IgYDxvbnMtdG9vbGJhcj5gLiBQdXQgaXQgaW4gdGhlIGxlZnQgcGFydCBvZiB0aGUgYDxvbnMtdG9vbGJhcj5gLlxuICpcbiAqICAgICBJdCB3aWxsIGZpbmQgdGhlIHBhcmVudCBgPG9ucy1uYXZpZ2F0b3I+YCBlbGVtZW50IGFuZCBwb3AgYSBwYWdlIHdoZW4gY2xpY2tlZC4gVGhpcyBiZWhhdmlvciBjYW4gYmUgb3ZlcnJpZGVuIGJ5IHNwZWNpZnlpbmcgdGhlIGBvbkNsaWNrYCBwcm9wZXJ0eSBhbmQgY2FsbGluZyBldmVudC5wcmV2ZW50RGVmYXVsdCBpbiBpdHMgY2FsbGJhY2suXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGNvZGVwZW4gYUhtR0xcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9iYWNrLWJ1dHRvblxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1NYXRlcmlhbCBEZXNpZ24gc3R5bGVbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy10b29sYmFyXG4gKiAgIFtlbl1vbnMtdG9vbGJhciBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLXRvb2xiYXLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLW5hdmlnYXRvclxuICogICBbZW5db25zLW5hdmlnYXRvciBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLW5hdmlnYXRvcuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy10b29sYmFyPlxuICogICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxuICogICAgIDxvbnMtYmFjay1idXR0b24+QmFjazwvb25zLWJhY2stYnV0dG9uPlxuICogICA8L2Rpdj5cbiAqICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICogICAgIFRpdGxlXG4gKiAgIDxkaXY+XG4gKiA8L29ucy10b29sYmFyPlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhY2tCdXR0b25FbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgYmFjayBidXR0b24uWy9lbl1cbiAgICogIFtqYV3jg5Djg4Pjgq/jg5zjgr/jg7Pjga7opovjgZ/nm67jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX29wdGlvbnMgPSB7fTtcbiAgICB0aGlzLl9ib3VuZE9uQ2xpY2sgPSB0aGlzLl9vbkNsaWNrLmJpbmQodGhpcyk7XG5cbiAgICBjb25zdCB7b25Db25uZWN0ZWQsIG9uRGlzY29ubmVjdGVkfSA9IHV0aWwuZGVmaW5lTGlzdGVuZXJQcm9wZXJ0eSh0aGlzLCAnY2xpY2snKTtcbiAgICB0aGlzLl9jb25uZWN0T25DbGljayA9IG9uQ29ubmVjdGVkO1xuICAgIHRoaXMuX2Rpc2Nvbm5lY3RPbkNsaWNrID0gb25EaXNjb25uZWN0ZWQ7XG4gIH1cblxuICBfdXBkYXRlSWNvbihpY29uID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5iYWNrLWJ1dHRvbl9faWNvbicpKSB7XG4gICAgaWNvbi5pbm5lckhUTUwgPSBhdXRvU3R5bGUuZ2V0UGxhdGZvcm0odGhpcykgPT09ICdhbmRyb2lkJyB8fCB1dGlsLmhhc01vZGlmaWVyKHRoaXMsICdtYXRlcmlhbCcpID8gbWRCYWNrQnV0dG9uSWNvbiA6IGlvc0JhY2tCdXR0b25JY29uO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG5cbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG5cbiAgICBpZiAoIXV0aWwuZmluZENoaWxkKHRoaXMsICcuYmFjay1idXR0b25fX2xhYmVsJykpIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gdXRpbC5jcmVhdGUoJ3NwYW4uYmFjay1idXR0b25fX2xhYmVsJyk7XG5cbiAgICAgIHdoaWxlICh0aGlzLmNoaWxkTm9kZXNbMF0pIHtcbiAgICAgICAgbGFiZWwuYXBwZW5kQ2hpbGQodGhpcy5jaGlsZE5vZGVzWzBdKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQobGFiZWwpO1xuICAgIH1cblxuICAgIGlmICghdXRpbC5maW5kQ2hpbGQodGhpcywgJy5iYWNrLWJ1dHRvbl9faWNvbicpKSB7XG4gICAgICBjb25zdCBpY29uID0gdXRpbC5jcmVhdGUoJ3NwYW4uYmFjay1idXR0b25fX2ljb24nKTtcbiAgICAgIHRoaXMuX3VwZGF0ZUljb24oaWNvbik7XG5cbiAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKGljb24sIHRoaXMuY2hpbGRyZW5bMF0pO1xuICAgIH1cblxuICAgIHV0aWwudXBkYXRlUmlwcGxlKHRoaXMsIHVuZGVmaW5lZCwge2NlbnRlcjogJycsICdzaXplJzogJ2NvbnRhaW4nLCAnYmFja2dyb3VuZCc6ICd0cmFuc3BhcmVudCd9KTtcblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb3B0aW9uc1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dT3B0aW9ucyBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvcHRpb25zLmFuaW1hdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBcInNsaWRlXCIsIFwibGlmdFwiLCBcImZhZGVcIiBhbmQgXCJub25lXCIuXG4gICAqICAgICBUaGVzZSBhcmUgcGxhdGZvcm0gYmFzZWQgYW5pbWF0aW9ucy4gRm9yIGZpeGVkIGFuaW1hdGlvbnMsIGFkZCBcIi1pb3NcIiBvciBcIi1tZFwiXG4gICAqICAgICBzdWZmaXggdG8gdGhlIGFuaW1hdGlvbiBuYW1lLiBFLmcuIFwibGlmdC1pb3NcIiwgXCJsaWZ0LW1kXCIuIERlZmF1bHRzIHZhbHVlcyBhcmUgXCJzbGlkZS1pb3NcIiBhbmQgXCJmYWRlLW1kXCIuXG4gICAqICAgWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuICBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWBbL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gIFsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb3B0aW9ucy5jYWxsYmFja1xuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdHJhbnNpdGlvbiBoYXMgZW5kZWQuWy9lbl1cbiAgICogICBbamFd44GT44Gu44Oh44K944OD44OJ44Gr44KI44KL55S76Z2i6YG356e744GM57WC5LqG44GX44Gf6Zqb44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gIH1cblxuICBzZXQgb3B0aW9ucyhvYmplY3QpIHtcbiAgICB0aGlzLl9vcHRpb25zID0gb2JqZWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvbkNsaWNrXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmFjayBidXR0b24gYmVoYXZpb3IuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgX29uQ2xpY2soZXZlbnQpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBjb25zdCBuYXZpZ2F0b3IgPSB1dGlsLmZpbmRQYXJlbnQodGhpcywgJ29ucy1uYXZpZ2F0b3InKTtcbiAgICAgICAgaWYgKG5hdmlnYXRvcikge1xuICAgICAgICAgIG5hdmlnYXRvci5wb3BQYWdlKHsuLi50aGlzLm9wdGlvbnMsIG9uc0JhY2tCdXR0b246IHRydWV9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kT25DbGljaywgZmFsc2UpO1xuICAgIHRoaXMuX2Nvbm5lY3RPbkNsaWNrKCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydtb2RpZmllcicsICdjbGFzcyddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgdXRpbC5yZXN0b3JlQ2xhc3ModGhpcywgZGVmYXVsdENsYXNzTmFtZSwgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ21vZGlmaWVyJzoge1xuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKSAmJiB0aGlzLl91cGRhdGVJY29uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ib3VuZE9uQ2xpY2ssIGZhbHNlKTtcbiAgICB0aGlzLl9kaXNjb25uZWN0T25DbGljaygpO1xuICB9XG5cbiAgc2hvdygpIHtcbiAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLkJhY2tCdXR0b24gPSBCYWNrQnV0dG9uRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWJhY2stYnV0dG9uJywgQmFja0J1dHRvbkVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnYm90dG9tLWJhcic7XG5jb25zdCBzY2hlbWUgPSB7Jyc6ICdib3R0b20tYmFyLS0qJ307XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWJvdHRvbS10b29sYmFyXG4gKiBAY2F0ZWdvcnkgcGFnZVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1Ub29sYmFyIGNvbXBvbmVudCB0aGF0IGlzIHBvc2l0aW9uZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZS4gU2luY2UgYm90dG9tIHRvb2xiYXJzIGFyZSB2ZXJ5IHZlcnNhdGlsZSBlbGVtZW50cywgYG9ucy1ib3R0b20tdG9vbGJhcmAgZG9lcyBub3QgcHJvdmlkZSBhbnkgc3BlY2lmaWMgbGF5b3V0IHN5bnRheCBmb3IgaXRzIGNoaWxkcmVuLiBNb2RpZmllcnMgb3IgY3VzdG9tIENTUyBtdXN0IGJlIHVzZWQuWy9lbl1cbiAqICAgW2phXeODmuODvOOCuOS4i+mDqOOBq+mFjee9ruOBleOCjOOCi+ODhOODvOODq+ODkOODvOeUqOOCs+ODs+ODneODvOODjeODs+ODiOOBp+OBmeOAglsvamFdXG4gKiBAbW9kaWZpZXIgdHJhbnNwYXJlbnRcbiAqICAgW2VuXU1ha2UgdGhlIHRvb2xiYXIgdHJhbnNwYXJlbnQuWy9lbl1cbiAqICAgW2phXeODhOODvOODq+ODkOODvOOBruiDjOaZr+OCkumAj+aYjuOBq+OBl+OBpuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAbW9kaWZpZXIgYWxpZ25lZFxuICogICBbZW5dVmVydGljYWxseSBhbGlnbnMgaXRzIGNoaWxkcmVuIGFuZCBhcHBsaWVzIGZsZXhib3ggZm9yIGJsb2NrIGVsZW1lbnRzLiBganVzdGlmeS1jb250ZW50YCBDU1MgcnVsZSBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgaG9yaXpvbnRhbCBhbGlnbi5bL2VuXVxuICogICBbamFd44OE44O844Or44OQ44O844Gu6IOM5pmv44KS6YCP5piO44Gr44GX44Gm6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy10b29sYmFyIFtlbl1vbnMtdG9vbGJhciBjb21wb25lbnRbL2VuXVtqYV1vbnMtdG9vbGJhcuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1ib3R0b20tdG9vbGJhcj5cbiAqICAgQ29udGVudFxuICogPC9vbnMtYm90dG9tLXRvb2xiYXI+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvdHRvbVRvb2xiYXJFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHRvb2xiYXIuWy9lbl1cbiAgICogICBbamFd44OE44O844Or44OQ44O844Gu6KaL44Gf55uu44Gu6KGo54++44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChkZWZhdWx0Q2xhc3NOYW1lKTtcbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydtb2RpZmllcicsICdjbGFzcyddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgdXRpbC5yZXN0b3JlQ2xhc3ModGhpcywgZGVmYXVsdENsYXNzTmFtZSwgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtb2RpZmllcic6XG4gICAgICAgIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxufVxuXG5vbnNFbGVtZW50cy5Cb3R0b21Ub29sYmFyID0gQm90dG9tVG9vbGJhckVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1ib3R0b20tdG9vbGJhcicsIEJvdHRvbVRvb2xiYXJFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IEJhc2VCdXR0b25FbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWJ1dHRvbi5qcyc7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWJ1dHRvblxuICogQGNhdGVnb3J5IGZvcm1cbiAqIEBtb2RpZmllciBvdXRsaW5lXG4gKiAgIFtlbl1CdXR0b24gd2l0aCBvdXRsaW5lIGFuZCB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kWy9lbl1cbiAqICAgW2phXeOCouOCpuODiOODqeOCpOODs+OCkuaMgeOBo+OBn+ODnOOCv+ODs+OCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAbW9kaWZpZXIgbGlnaHRcbiAqICAgW2VuXUJ1dHRvbiB0aGF0IGRvZXNuJ3Qgc3RhbmQgb3V0LlsvZW5dXG4gKiAgIFtqYV3nm67nq4vjgZ/jgarjgYTjg5zjgr/jg7PjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQG1vZGlmaWVyIHF1aWV0XG4gKiAgIFtlbl1CdXR0b24gd2l0aCBubyBvdXRsaW5lIGFuZCBvciBiYWNrZ3JvdW5kLi5bL2VuXVxuICogICBbamFd5p6g57ea44KE6IOM5pmv44GM54Sh44GE5paH5a2X44Gg44GR44Gu44Oc44K/44Oz44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBtb2RpZmllciBjdGFcbiAqICAgW2VuXUJ1dHRvbiB0aGF0IHJlYWxseSBzdGFuZHMgb3V0LlsvZW5dXG4gKiAgIFtqYV3nm67nq4vjgaTjg5zjgr/jg7PjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQG1vZGlmaWVyIGxhcmdlXG4gKiAgIFtlbl1MYXJnZSBidXR0b24gdGhhdCBjb3ZlcnMgdGhlIHdpZHRoIG9mIHRoZSBzY3JlZW4uWy9lbl1cbiAqICAgW2phXeaoquOBhOOBo+OBseOBhOOBq+W6g+OBjOOCi+Wkp+OBjeOBquODnOOCv+ODs+OCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAbW9kaWZpZXIgbGFyZ2UtLXF1aWV0XG4gKiAgIFtlbl1MYXJnZSBxdWlldCBidXR0b24uWy9lbl1cbiAqICAgW2phXeaoquOBhOOBo+OBseOBhOOBq+W6g+OBjOOCi3F1aWV044Oc44K/44Oz44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBtb2RpZmllciBsYXJnZS0tY3RhXG4gKiAgIFtlbl1MYXJnZSBjYWxsIHRvIGFjdGlvbiBidXR0b24uWy9lbl1cbiAqICAgW2phXeaoquOBhOOBo+OBseOBhOOBq+W6g+OBjOOCi2N0YeODnOOCv+ODs+OCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICAgW2VuXU1hdGVyaWFsIERlc2lnbiBidXR0b25bL2VuXVxuICogICBbamFd44Oe44OG44Oq44Ki44Or44OH44K244Kk44Oz44Gu44Oc44K/44OzWy9qYV1cbiAqIEBtb2RpZmllciBtYXRlcmlhbC0tZmxhdFxuICogICBbZW5dTWF0ZXJpYWwgRGVzaWduIGZsYXQgYnV0dG9uWy9lbl1cbiAqICAgW2phXeODnuODhuODquOCouODq+ODh+OCtuOCpOODs+OBruODleODqeODg+ODiOODnOOCv+ODs1svamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIEJ1dHRvbiBjb21wb25lbnQuIElmIHlvdSB3YW50IHRvIHBsYWNlIGEgYnV0dG9uIGluIGEgdG9vbGJhciwgdXNlIGA8b25zLXRvb2xiYXItYnV0dG9uPmAgb3IgYDxvbnMtYmFjay1idXR0b24+YCBpbnN0ZWFkLlxuICpcbiAqICAgICBXaWxsIGF1dG9tYXRpY2FsbHkgZGlzcGxheSBhcyBhIE1hdGVyaWFsIERlc2lnbiBidXR0b24gd2l0aCBhIHJpcHBsZSBlZmZlY3Qgb24gQW5kcm9pZC5cbiAqICAgWy9lbl1cbiAqICAgW2phXeODnOOCv+ODs+eUqOOCs+ODs+ODneODvOODjeODs+ODiOOAguODhOODvOODq+ODkOODvOOBq+ODnOOCv+ODs+OCkuioree9ruOBmeOCi+WgtOWQiOOBr+OAgW9ucy10b29sYmFyLWJ1dHRvbuOCguOBl+OBj+OBr29ucy1iYWNrLWJ1dHRvbuOCs+ODs+ODneODvOODjeODs+ODiOOCkuS9v+eUqOOBl+OBvuOBmeOAglsvamFdXG4gKiBAY29kZXBlbiBoTGF5eFxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL2J1dHRvblxuICogQGd1aWRlIHRoZW1pbmcuaHRtbCNtb2RpZmllcnMgW2VuXU1vcmUgZGV0YWlscyBhYm91dCB0aGUgYG1vZGlmaWVyYCBhdHRyaWJ1dGVbL2VuXVtqYV1tb2RpZmllcuWxnuaAp+OBruS9v+OBhOaWuVsvamFdXG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI2Nyb3NzLXBsYXRmb3JtLXN0eWxpbmctYXV0b3N0eWxpbmcgW2VuXUluZm9ybWF0aW9uIGFib3V0IGNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2VuXVtqYV1JbmZvcm1hdGlvbiBhYm91dCBjcm9zcyBwbGF0Zm9ybSBzdHlsaW5nWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLWJ1dHRvbiBtb2RpZmllcj1cImxhcmdlLS1jdGFcIj5cbiAqICAgVGFwIE1lXG4gKiA8L29ucy1idXR0b24+XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnV0dG9uRWxlbWVudCBleHRlbmRzIEJhc2VCdXR0b25FbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgYnV0dG9uLlsvZW5dXG4gICAqICBbamFd44Oc44K/44Oz44Gu6KGo54++44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgcmlwcGxlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIGRlZmluZWQsIHRoZSBidXR0b24gd2lsbCBoYXZlIGEgcmlwcGxlIGVmZmVjdC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgcmlwcGxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1XaGV0aGVyIHRoZSBidXR0b24gaGFzIGEgcmlwcGxlIGVmZmVjdCBvciBub3QuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSBpZiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLlsvZW5dXG4gICAqICAgW2phXeODnOOCv+ODs+OCkueEoeWKueWMluOBmeOCi+WgtOWQiOOBr+aMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBidXR0b24gaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIGdldCBfc2NoZW1lKCkge1xuICAgIHJldHVybiB7ICcnOiAnYnV0dG9uLS0qJyB9O1xuICB9XG5cbiAgZ2V0IF9kZWZhdWx0Q2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnYnV0dG9uJztcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5CdXR0b24gPSBCdXR0b25FbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtYnV0dG9uJywgQnV0dG9uRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ2NhcmQnO1xuY29uc3Qgc2NoZW1lID0ge1xuICAnJzogJ2NhcmQtLSonLFxuICAnLmNhcmRfX3RpdGxlJzogJ2NhcmQtLSpfX3RpdGxlJyxcbiAgJy5jYXJkX19jb250ZW50JzogJ2NhcmQtLSpfX2NvbnRlbnQnXG59O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1jYXJkXG4gKiBAY2F0ZWdvcnkgdmlzdWFsXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICAgW2VuXUEgY2FyZCB3aXRoIG1hdGVyaWFsIGRlc2lnbi5bL2VuXVxuICogICBbamFd44Oq44K544OI44Gu5LiK5LiL44Gu44Oc44O844OA44O844GM54Sh44GE44Oq44K544OI44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICBDb21wb25lbnQgdG8gY3JlYXRlIGEgY2FyZCB0aGF0IGRpc3BsYXlzIHNvbWUgaW5mb3JtYXRpb24uXG4gKlxuICogICAgVGhlIGNhcmQgbWF5IGJlIGNvbXBvc2VkIGJ5IGRpdnMgd2l0aCBzcGVjaWFsbHkgcHJlcGFyZWQgY2xhc3NlcyBgdGl0bGVgIGFuZC9vciBgY29udGVudGAuIFlvdSBjYW4gYWxzbyBhZGQgeW91ciBvd24gY29udGVudCBhcyB5b3UgcGxlYXNlLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL2NhcmRcbiAqIEBleGFtcGxlXG4gKiA8b25zLWNhcmQ+XG4gKiAgIDxwPlNvbWUgY29udGVudDwvcD5cbiAqIDwvb25zLWNhcmQ+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhcmRFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgY2FyZC5bL2VuXVxuICAgKiAgIFtqYV3jg6rjgrnjg4jjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGxldCB0aXRsZSwgY29udGVudDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWwgPSB0aGlzLmNoaWxkcmVuW2ldO1xuXG4gICAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCd0aXRsZScpKSB7XG4gICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2NhcmRfX3RpdGxlJyk7XG4gICAgICAgIHRpdGxlID0gZWw7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2NvbnRlbnQnKSkge1xuICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCdjYXJkX19jb250ZW50Jyk7XG4gICAgICAgIGNvbnRlbnQgPSBlbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInLCAnY2xhc3MnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIGRlZmF1bHRDbGFzc05hbWUsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbm9uc0VsZW1lbnRzLkNhcmQgPSBDYXJkRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWNhcmQnLCBDYXJkRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuY29uc3Qgc2NoZW1lID0geycnOiAnY2Fyb3VzZWwtaXRlbS0tKid9O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1jYXJvdXNlbC1pdGVtXG4gKiBAY2F0ZWdvcnkgY2Fyb3VzZWxcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgQ2Fyb3VzZWwgaXRlbSBjb21wb25lbnQuIFVzZWQgYXMgYSBjaGlsZCBvZiB0aGUgYDxvbnMtY2Fyb3VzZWw+YCBlbGVtZW50LlxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBjb2RlcGVuIHhiYnpPUVxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL2Nhcm91c2VsXG4gKiBAc2VlYWxzbyBvbnMtY2Fyb3VzZWxcbiAqICAgW2VuXWA8b25zLWNhcm91c2VsPmAgY29tcG9uZW50c1svZW5dXG4gKiAgIFtqYV08b25zLWNhcm91c2VsPuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1jYXJvdXNlbCBzdHlsZT1cIndpZHRoOiAxMDAlOyBoZWlnaHQ6IDIwMHB4XCI+XG4gKiAgIDxvbnMtY2Fyb3VzZWwtaXRlbT5cbiAqICAgIC4uLlxuICogICA8L29ucy1jYXJvdXNlbC1pdGVtPlxuICogICA8b25zLWNhcm91c2VsLWl0ZW0+XG4gKiAgICAuLi5cbiAqICAgPC9vbnMtY2Fyb3VzZWwtaXRlbT5cbiAqIDwvb25zLWNhcm91c2VsPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXJvdXNlbEl0ZW1FbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIGlmIChuYW1lID09PSAnbW9kaWZpZXInKSB7XG4gICAgICByZXR1cm4gTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgfVxuICB9XG59XG5cbm9uc0VsZW1lbnRzLkNhcm91c2VsSXRlbSA9IENhcm91c2VsSXRlbUVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1jYXJvdXNlbC1pdGVtJywgQ2Fyb3VzZWxJdGVtRWxlbWVudCk7XG4iLCJpbXBvcnQgdXRpbCBmcm9tICcuLi91dGlsLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS5qcyc7XG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uL2FuaW1pdC5qcyc7XG5pbXBvcnQgR2VzdHVyZURldGVjdG9yIGZyb20gJy4uL2dlc3R1cmUtZGV0ZWN0b3IuanMnO1xuXG5jb25zdCBkaXJlY3Rpb25NYXAgPSB7XG4gIHZlcnRpY2FsOiB7XG4gICAgYXhpczogJ1knLFxuICAgIHNpemU6ICdIZWlnaHQnLFxuICAgIGRpcjogWyd1cCcsICdkb3duJ10sXG4gICAgdDNkOiBbJzBweCwgJywgJ3B4LCAwcHgnXVxuICB9LFxuICBob3Jpem9udGFsOiB7XG4gICAgYXhpczogJ1gnLFxuICAgIHNpemU6ICdXaWR0aCcsXG4gICAgZGlyOiBbJ2xlZnQnLCAncmlnaHQnXSxcbiAgICB0M2Q6IFsnJywgJ3B4LCAwcHgsIDBweCddXG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXBlciB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcykge1xuICAgIC8vIFBhcmFtZXRlcnNcbiAgICBjb25zdCBGQUxTRSA9ICgoKSA9PiBmYWxzZSk7XG4gICAgYGdldEluaXRpYWxJbmRleCBnZXRCdWJibGVXaWR0aCBpc1ZlcnRpY2FsIGlzT3ZlclNjcm9sbGFibGUgaXNDZW50ZXJlZFxuICAgIGlzQXV0b1Njcm9sbGFibGUgcmVmcmVzaEhvb2sgcHJlQ2hhbmdlSG9vayBwb3N0Q2hhbmdlSG9vayBvdmVyU2Nyb2xsSG9va2BcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAuZm9yRWFjaChrZXkgPT4gdGhpc1trZXldID0gcGFyYW1zW2tleV0gfHwgRkFMU0UpO1xuXG4gICAgdGhpcy5nZXRFbGVtZW50ID0gcGFyYW1zLmdldEVsZW1lbnQ7IC8vIFJlcXVpcmVkXG4gICAgdGhpcy5zY3JvbGxIb29rID0gcGFyYW1zLnNjcm9sbEhvb2s7IC8vIE9wdGlvbmFsXG4gICAgdGhpcy5pdGVtU2l6ZSA9IHBhcmFtcy5pdGVtU2l6ZSB8fCAnMTAwJSc7XG5cbiAgICB0aGlzLmdldEF1dG9TY3JvbGxSYXRpbyA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBsZXQgcmF0aW8gPSBwYXJhbXMuZ2V0QXV0b1Njcm9sbFJhdGlvICYmIHBhcmFtcy5nZXRBdXRvU2Nyb2xsUmF0aW8oLi4uYXJncyk7XG4gICAgICByYXRpbyA9IHR5cGVvZiByYXRpbyA9PT0gJ251bWJlcicgJiYgcmF0aW8gPT09IHJhdGlvID8gcmF0aW8gOiAuNTtcbiAgICAgIGlmIChyYXRpbyA8IDAuMCB8fCByYXRpbyA+IDEuMCkge1xuICAgICAgICB1dGlsLnRocm93KCdJbnZhbGlkIGF1dG8tc2Nyb2xsLXJhdGlvICcgKyByYXRpbyArICcuIE11c3QgYmUgYmV0d2VlbiAwIGFuZCAxJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmF0aW87XG4gICAgfTtcblxuICAgIC8vIFByZXZlbnQgY2xpY2tzIG9ubHkgb24gZGVza3RvcFxuICAgIHRoaXMuc2hvdWxkQmxvY2sgPSB1dGlsLmdsb2JhbHMuYWN0dWFsTW9iaWxlT1MgPT09ICdvdGhlcic7XG5cbiAgICAvLyBCaW5kIGhhbmRsZXJzXG4gICAgdGhpcy5vbkRyYWdTdGFydCA9IHRoaXMub25EcmFnU3RhcnQuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uRHJhZyA9IHRoaXMub25EcmFnLmJpbmQodGhpcyk7XG4gICAgdGhpcy5vbkRyYWdFbmQgPSB0aGlzLm9uRHJhZ0VuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25SZXNpemUgPSB0aGlzLm9uUmVzaXplLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLl9zaG91bGRGaXhTY3JvbGwgPSB1dGlsLmdsb2JhbHMuYWN0dWFsTW9iaWxlT1MgPT09ICdpb3MnO1xuICB9XG5cbiAgaW5pdCh7IHN3aXBlYWJsZSwgYXV0b1JlZnJlc2ggfSA9IHt9KSB7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgdGhpcy50YXJnZXQgPSB0aGlzLmdldEVsZW1lbnQoKS5jaGlsZHJlblswXTtcbiAgICB0aGlzLmJsb2NrZXIgPSB0aGlzLmdldEVsZW1lbnQoKS5jaGlsZHJlblsxXTtcbiAgICBpZiAoIXRoaXMudGFyZ2V0IHx8ICF0aGlzLmJsb2NrZXIpIHtcbiAgICAgIHV0aWwudGhyb3coJ0V4cGVjdGVkIFwidGFyZ2V0XCIgYW5kIFwiYmxvY2tlclwiIGVsZW1lbnRzIHRvIGV4aXN0IGJlZm9yZSBpbml0aWFsaXppbmcgU3dpcGVyJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNob3VsZEJsb2NrKSB7XG4gICAgICB0aGlzLmJsb2NrZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBBZGQgY2xhc3Nlc1xuICAgIHRoaXMuZ2V0RWxlbWVudCgpLmNsYXNzTGlzdC5hZGQoJ29ucy1zd2lwZXInKTtcbiAgICB0aGlzLnRhcmdldC5jbGFzc0xpc3QuYWRkKCdvbnMtc3dpcGVyLXRhcmdldCcpO1xuICAgIHRoaXMuYmxvY2tlci5jbGFzc0xpc3QuYWRkKCdvbnMtc3dpcGVyLWJsb2NrZXInKTtcblxuICAgIC8vIFNldHVwIGxpc3RlbmVyc1xuICAgIHRoaXMuX2dlc3R1cmVEZXRlY3RvciA9IG5ldyBHZXN0dXJlRGV0ZWN0b3IodGhpcy5nZXRFbGVtZW50KCksXG4gICAgICB7IGRyYWdNaW5EaXN0YW5jZTogMSwgZHJhZ0xvY2tUb0F4aXM6IHRydWUsIHBhc3NpdmU6ICF0aGlzLl9zaG91bGRGaXhTY3JvbGwgfVxuICAgICk7XG4gICAgdGhpcy5fbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHRoaXMucmVmcmVzaCgpKTtcbiAgICB0aGlzLnVwZGF0ZVN3aXBlYWJsZShzd2lwZWFibGUpO1xuICAgIHRoaXMudXBkYXRlQXV0b1JlZnJlc2goYXV0b1JlZnJlc2gpO1xuXG4gICAgLy8gU2V0dXAgaW5pdGlhbCBsYXlvdXRcbiAgICB0aGlzLl9zY3JvbGwgPSB0aGlzLl9vZmZzZXQgPSB0aGlzLl9sYXN0QWN0aXZlSW5kZXggPSAwO1xuICAgIHRoaXMuX3VwZGF0ZUxheW91dCgpO1xuICAgIHRoaXMuX3NldHVwSW5pdGlhbEluZGV4KCk7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuaW5pdGlhbGl6ZWQgJiYgdGhpcy5fc2V0dXBJbml0aWFsSW5kZXgoKSk7XG5cbiAgICAvLyBGaXggcmVuZGVyaW5nIGdsaXRjaCBvbiBBbmRyb2lkIDQuMVxuICAgIC8vIEZpeCBmb3IgaWZyYW1lcyB3aGVyZSB0aGUgd2lkdGggaXMgaW5jb25zaXN0ZW50IGF0IHRoZSBiZWdpbm5pbmdcbiAgICBpZiAod2luZG93ICE9PSB3aW5kb3cucGFyZW50IHx8IHRoaXMub2Zmc2V0SGVpZ2h0ID09PSAwKSB7XG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuaW5pdGlhbGl6ZWQgJiYgdGhpcy5vblJlc2l6ZSgpKTtcbiAgICB9XG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZVN3aXBlYWJsZShmYWxzZSk7XG4gICAgdGhpcy51cGRhdGVBdXRvUmVmcmVzaChmYWxzZSk7XG5cbiAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3IgJiYgdGhpcy5fZ2VzdHVyZURldGVjdG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLnRhcmdldCA9IHRoaXMuYmxvY2tlciA9IHRoaXMuX2dlc3R1cmVEZXRlY3RvciA9IHRoaXMuX211dGF0aW9uT2JzZXJ2ZXIgPSBudWxsO1xuXG4gICAgdGhpcy5zZXR1cFJlc2l6ZShmYWxzZSk7XG4gIH1cblxuICBvblJlc2l6ZSgpIHtcbiAgICBjb25zdCBpID0gdGhpcy5fc2Nyb2xsIC8gdGhpcy5pdGVtTnVtU2l6ZTtcbiAgICB0aGlzLl9yZXNldCgpO1xuICAgIHRoaXMuc2V0QWN0aXZlSW5kZXgoaSk7XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICBnZXQgaXRlbUNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLnRhcmdldC5jaGlsZHJlbi5sZW5ndGg7XG4gIH1cblxuICBnZXQgaXRlbU51bVNpemUoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9pdGVtTnVtU2l6ZSAhPT0gJ251bWJlcicgfHwgdGhpcy5faXRlbU51bVNpemUgIT09IHRoaXMuX2l0ZW1OdW1TaXplKSB7XG4gICAgICB0aGlzLl9pdGVtTnVtU2l6ZSA9IHRoaXMuX2NhbGN1bGF0ZUl0ZW1TaXplKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9pdGVtTnVtU2l6ZTtcbiAgfVxuXG4gIGdldCBtYXhTY3JvbGwoKSB7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5pdGVtQ291bnQgKiB0aGlzLml0ZW1OdW1TaXplIC0gdGhpcy50YXJnZXRTaXplO1xuICAgIHJldHVybiBNYXRoLmNlaWwobWF4IDwgMCA/IDAgOiBtYXgpOyAvLyBOZWVkIHRvIHJldHVybiBhbiBpbnRlZ2VyIHZhbHVlLlxuICB9XG5cbiAgX2NhbGN1bGF0ZUl0ZW1TaXplKCkge1xuICAgIGNvbnN0IG1hdGNoZXMgPSB0aGlzLml0ZW1TaXplLm1hdGNoKC9eKFxcZCspKHB4fCUpLyk7XG5cbiAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgIHV0aWwudGhyb3coYEludmFsaWQgc3RhdGU6IHN3aXBlcidzIHNpemUgdW5pdCBtdXN0IGJlICclJyBvciAncHgnYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBwYXJzZUludChtYXRjaGVzWzFdLCAxMCk7XG4gICAgcmV0dXJuIG1hdGNoZXNbMl0gPT09ICclJyA/IE1hdGgucm91bmQodmFsdWUgLyAxMDAgKiB0aGlzLnRhcmdldFNpemUpIDogdmFsdWU7XG4gIH1cblxuICBfc2V0dXBJbml0aWFsSW5kZXgoKSB7XG4gICAgdGhpcy5fcmVzZXQoKTtcbiAgICB0aGlzLl9sYXN0QWN0aXZlSW5kZXggPSBNYXRoLm1heChNYXRoLm1pbihOdW1iZXIodGhpcy5nZXRJbml0aWFsSW5kZXgoKSksIHRoaXMuaXRlbUNvdW50KSwgMCk7XG4gICAgdGhpcy5fc2Nyb2xsID0gdGhpcy5fb2Zmc2V0ICsgdGhpcy5pdGVtTnVtU2l6ZSAqIHRoaXMuX2xhc3RBY3RpdmVJbmRleDtcbiAgICB0aGlzLl9zY3JvbGxUbyh0aGlzLl9zY3JvbGwpO1xuICB9XG5cbiAgX3NldFN3aXBpbmcodG9nZ2xlKSB7XG4gICAgdGhpcy50YXJnZXQuY2xhc3NMaXN0LnRvZ2dsZSgnc3dpcGluZycsIHRvZ2dsZSk7IC8vIEhpZGVzIGV2ZXJ5dGhpbmcgZXhjZXB0IHNob3duIHBhZ2VzXG4gIH1cblxuICBzZXRBY3RpdmVJbmRleChpbmRleCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5fc2V0U3dpcGluZyh0cnVlKTtcbiAgICBpbmRleCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGluZGV4LCB0aGlzLml0ZW1Db3VudCAtIDEpKTtcbiAgICBjb25zdCBzY3JvbGwgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLm1heFNjcm9sbCwgdGhpcy5fb2Zmc2V0ICsgdGhpcy5pdGVtTnVtU2l6ZSAqIGluZGV4KSk7XG5cbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlVG8oc2Nyb2xsLCBvcHRpb25zKTtcbiAgfVxuXG4gIGdldEFjdGl2ZUluZGV4KHNjcm9sbCA9IHRoaXMuX3Njcm9sbCkge1xuICAgIHNjcm9sbCAtPSB0aGlzLl9vZmZzZXQ7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLml0ZW1Db3VudCxcbiAgICAgIHNpemUgPSB0aGlzLml0ZW1OdW1TaXplO1xuXG4gICAgaWYgKHRoaXMuaXRlbU51bVNpemUgPT09IDAgfHwgIXV0aWwuaXNJbnRlZ2VyKHNjcm9sbCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sYXN0QWN0aXZlSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKHNjcm9sbCA8PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgIGlmIChzaXplICogaSA8PSBzY3JvbGwgJiYgc2l6ZSAqIChpICsgMSkgPiBzY3JvbGwpIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50IC0gMTtcbiAgfVxuXG4gIHNldHVwUmVzaXplKGFkZCkge1xuICAgIHdpbmRvd1soYWRkID8gJ2FkZCcgOiAncmVtb3ZlJykgKyAnRXZlbnRMaXN0ZW5lciddKCdyZXNpemUnLCB0aGlzLm9uUmVzaXplLCB0cnVlKTtcbiAgfVxuXG4gIHNob3coKSB7XG4gICAgdGhpcy5zZXR1cFJlc2l6ZSh0cnVlKTtcbiAgICB0aGlzLm9uUmVzaXplKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRhcmdldCAmJiB0aGlzLnRhcmdldC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKSwgMTAwMC82MCk7IC8vIEhpZGUgZWxlbWVudHMgYWZ0ZXIgYW5pbWF0aW9uc1xuICB9XG5cbiAgaGlkZSgpIHtcbiAgICB0aGlzLnNldHVwUmVzaXplKGZhbHNlKTtcbiAgICB0aGlzLnRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsgLy8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW9uc1xuICB9XG5cbiAgdXBkYXRlU3dpcGVhYmxlKHNob3VsZFVwZGF0ZSkge1xuICAgIGlmICh0aGlzLl9nZXN0dXJlRGV0ZWN0b3IpIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IHNob3VsZFVwZGF0ZSA/ICdvbicgOiAnb2ZmJztcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3RvclthY3Rpb25dKCdkcmFnJywgdGhpcy5vbkRyYWcpO1xuICAgICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yW2FjdGlvbl0oJ2RyYWdzdGFydCcsIHRoaXMub25EcmFnU3RhcnQpO1xuICAgICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yW2FjdGlvbl0oJ2RyYWdlbmQnLCB0aGlzLm9uRHJhZ0VuZCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQXV0b1JlZnJlc2goc2hvdWxkV2F0Y2gpIHtcbiAgICBpZiAodGhpcy5fbXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgc2hvdWxkV2F0Y2hcbiAgICAgICAgPyB0aGlzLl9tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUodGhpcy50YXJnZXQsIHsgY2hpbGRMaXN0OiB0cnVlIH0pXG4gICAgICAgIDogdGhpcy5fbXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlSXRlbVNpemUobmV3U2l6ZSkge1xuICAgIHRoaXMuaXRlbVNpemUgPSBuZXdTaXplIHx8ICcxMDAlJztcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIHRvZ2dsZUJsb2NrZXIoYmxvY2spIHtcbiAgICB0aGlzLmJsb2NrZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9IGJsb2NrID8gJ2F1dG8nIDogJ25vbmUnO1xuICB9XG5cbiAgX2NhbkNvbnN1bWVHZXN0dXJlKGdlc3R1cmUpIHtcbiAgICBjb25zdCBkID0gZ2VzdHVyZS5kaXJlY3Rpb247XG4gICAgY29uc3QgaXNGaXJzdCA9IHRoaXMuX3Njcm9sbCA9PT0gMCAmJiAhdGhpcy5pc092ZXJTY3JvbGxhYmxlKCk7XG4gICAgY29uc3QgaXNMYXN0ID0gdGhpcy5fc2Nyb2xsID09PSB0aGlzLm1heFNjcm9sbCAmJiAhdGhpcy5pc092ZXJTY3JvbGxhYmxlKCk7XG5cbiAgICByZXR1cm4gdGhpcy5pc1ZlcnRpY2FsKClcbiAgICAgID8gKChkID09PSAnZG93bicgJiYgIWlzRmlyc3QpIHx8IChkID09PSAndXAnICYmICFpc0xhc3QpKVxuICAgICAgOiAoKGQgPT09ICdyaWdodCcgJiYgIWlzRmlyc3QpIHx8IChkID09PSAnbGVmdCcgJiYgIWlzTGFzdCkpO1xuICB9XG5cbiAgb25EcmFnU3RhcnQoZXZlbnQpIHtcbiAgICB0aGlzLl9pZ25vcmVEcmFnID0gZXZlbnQuY29uc3VtZWQgfHwgIXV0aWwuaXNWYWxpZEdlc3R1cmUoZXZlbnQpO1xuXG4gICAgaWYgKCF0aGlzLl9pZ25vcmVEcmFnKSB7XG4gICAgICBjb25zdCBjb25zdW1lID0gZXZlbnQuY29uc3VtZTtcbiAgICAgIGV2ZW50LmNvbnN1bWUgPSAoKSA9PiB7IGNvbnN1bWUgJiYgY29uc3VtZSgpOyB0aGlzLl9pZ25vcmVEcmFnID0gdHJ1ZTsgfTtcblxuICAgICAgaWYgKHRoaXMuX2NhbkNvbnN1bWVHZXN0dXJlKGV2ZW50Lmdlc3R1cmUpKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0WCA9IGV2ZW50Lmdlc3R1cmUuY2VudGVyICYmIGV2ZW50Lmdlc3R1cmUuY2VudGVyLmNsaWVudFggfHwgMCxcbiAgICAgICAgICBkaXN0RnJvbUVkZ2UgPSB0aGlzLmdldEJ1YmJsZVdpZHRoKCkgfHwgMCxcbiAgICAgICAgICBzdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN1bWUgJiYgY29uc3VtZSgpO1xuICAgICAgICAgICAgZXZlbnQuY29uc3VtZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRlZCA9IHRydWU7IC8vIEF2b2lkIHN0YXJ0aW5nIGRyYWcgZnJvbSBvdXRzaWRlXG4gICAgICAgICAgICB0aGlzLnNob3VsZEJsb2NrICYmIHRoaXMudG9nZ2xlQmxvY2tlcih0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuX3NldFN3aXBpbmcodHJ1ZSk7XG4gICAgICAgICAgICB1dGlsLmlvc1ByZXZlbnRTY3JvbGwodGhpcy5fZ2VzdHVyZURldGVjdG9yKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgIC8vIExldCBwYXJlbnQgZWxlbWVudHMgY29uc3VtZSB0aGUgZ2VzdHVyZSBvciBjb25zdW1lIGl0IHJpZ2h0IGF3YXlcbiAgICAgICAgc3RhcnRYIDwgZGlzdEZyb21FZGdlIHx8IHN0YXJ0WCA+ICh0aGlzLnRhcmdldFNpemUgLSBkaXN0RnJvbUVkZ2UpXG4gICAgICAgICAgPyBzZXRJbW1lZGlhdGUoKCkgPT4gIXRoaXMuX2lnbm9yZURyYWcgJiYgc3RhcnQoKSlcbiAgICAgICAgICA6IHN0YXJ0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25EcmFnKGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC5nZXN0dXJlIHx8IHRoaXMuX2lnbm9yZURyYWcgfHwgIXRoaXMuX3N0YXJ0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250aW51ZWQgPSB0cnVlOyAvLyBGaXggZm9yIHJhbmRvbSAnZHJhZ2VuZCcgd2l0aG91dCAnZHJhZydcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuX3Njcm9sbFRvKHRoaXMuX3Njcm9sbCAtIHRoaXMuX2dldERlbHRhKGV2ZW50KSwgeyB0aHJvdHRsZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIG9uRHJhZ0VuZChldmVudCkge1xuICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICBpZiAoIWV2ZW50Lmdlc3R1cmUgfHwgdGhpcy5faWdub3JlRHJhZyB8fCAhdGhpcy5fY29udGludWVkKSB7XG4gICAgICB0aGlzLl9pZ25vcmVEcmFnID0gdHJ1ZTsgLy8gb25EcmFnRW5kIG1pZ2h0IGZpcmUgYmVmb3JlIG9uRHJhZ1N0YXJ0J3Mgc2V0SW1tZWRpYXRlXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY29udGludWVkID0gZmFsc2U7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCBzY3JvbGwgPSB0aGlzLl9zY3JvbGwgLSB0aGlzLl9nZXREZWx0YShldmVudCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNjcm9sbCA9IHRoaXMuX25vcm1hbGl6ZVNjcm9sbChzY3JvbGwpO1xuICAgIHNjcm9sbCA9PT0gbm9ybWFsaXplZFNjcm9sbCA/IHRoaXMuX3N0YXJ0TW9tZW50dW1TY3JvbGwoc2Nyb2xsLCBldmVudCkgOiB0aGlzLl9raWxsT3ZlclNjcm9sbChub3JtYWxpemVkU2Nyb2xsKTtcbiAgICB0aGlzLnNob3VsZEJsb2NrICYmIHRoaXMudG9nZ2xlQmxvY2tlcihmYWxzZSk7XG4gIH1cblxuICBfc3RhcnRNb21lbnR1bVNjcm9sbChzY3JvbGwsIGV2ZW50KSB7XG4gICAgY29uc3QgdmVsb2NpdHkgPSB0aGlzLl9nZXRWZWxvY2l0eShldmVudCksXG4gICAgICBtYXRjaGVzRGlyZWN0aW9uID0gZXZlbnQuZ2VzdHVyZS5pbnRlcmltRGlyZWN0aW9uID09PSB0aGlzLmRNLmRpclt0aGlzLl9nZXREZWx0YShldmVudCkgPCAwID8gMCA6IDFdO1xuXG4gICAgY29uc3QgbmV4dFNjcm9sbCA9IHRoaXMuX2dldEF1dG9TY3JvbGwoc2Nyb2xsLCB2ZWxvY2l0eSwgbWF0Y2hlc0RpcmVjdGlvbik7XG4gICAgbGV0IGR1cmF0aW9uID0gTWF0aC5hYnMobmV4dFNjcm9sbCAtIHNjcm9sbCkgLyAodmVsb2NpdHkgKyAwLjAxKSAvIDEwMDA7XG4gICAgZHVyYXRpb24gPSBNYXRoLm1pbiguMjUsIE1hdGgubWF4KC4xLCBkdXJhdGlvbikpO1xuXG4gICAgdGhpcy5fY2hhbmdlVG8obmV4dFNjcm9sbCwgeyBzd2lwZTogdHJ1ZSwgYW5pbWF0aW9uT3B0aW9uczogeyBkdXJhdGlvbiwgdGltaW5nOiAnY3ViaWMtYmV6aWVyKC40LCAuNywgLjUsIDEpJyB9IH0pO1xuICB9XG5cbiAgX2tpbGxPdmVyU2Nyb2xsKHNjcm9sbCkge1xuICAgIHRoaXMuX3Njcm9sbCA9IHNjcm9sbDtcbiAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmRNLmRpcltOdW1iZXIoc2Nyb2xsID4gMCldO1xuICAgIGNvbnN0IGtpbGxPdmVyU2Nyb2xsID0gKCkgPT4gdGhpcy5fY2hhbmdlVG8oc2Nyb2xsLCB7IGFuaW1hdGlvbk9wdGlvbnM6IHsgZHVyYXRpb246IC40LCB0aW1pbmc6ICdjdWJpYy1iZXppZXIoLjEsIC40LCAuMSwgMSknIH0gfSk7XG4gICAgdGhpcy5vdmVyU2Nyb2xsSG9vayh7IGRpcmVjdGlvbiwga2lsbE92ZXJTY3JvbGwgfSkgfHwga2lsbE92ZXJTY3JvbGwoKTtcbiAgfVxuXG4gIF9jaGFuZ2VUbyhzY3JvbGwsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGUgPSB7IGFjdGl2ZUluZGV4OiB0aGlzLmdldEFjdGl2ZUluZGV4KHNjcm9sbCksIGxhc3RBY3RpdmVJbmRleDogdGhpcy5fbGFzdEFjdGl2ZUluZGV4LCBzd2lwZTogb3B0aW9ucy5zd2lwZSB8fCBmYWxzZSB9O1xuICAgIGNvbnN0IGNoYW5nZSA9IGUuYWN0aXZlSW5kZXggIT09IGUubGFzdEFjdGl2ZUluZGV4O1xuICAgIGNvbnN0IGNhbmNlbGVkID0gY2hhbmdlID8gdGhpcy5wcmVDaGFuZ2VIb29rKGUpIDogZmFsc2U7XG5cbiAgICB0aGlzLl9zY3JvbGwgPSBjYW5jZWxlZCA/IHRoaXMuX29mZnNldCArIGUubGFzdEFjdGl2ZUluZGV4ICogdGhpcy5pdGVtTnVtU2l6ZSA6IHNjcm9sbDtcbiAgICB0aGlzLl9sYXN0QWN0aXZlSW5kZXggPSBjYW5jZWxlZCA/IGUubGFzdEFjdGl2ZUluZGV4IDogZS5hY3RpdmVJbmRleDtcblxuICAgIHJldHVybiB0aGlzLl9zY3JvbGxUbyh0aGlzLl9zY3JvbGwsIG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHNjcm9sbCA9PT0gdGhpcy5fc2Nyb2xsICYmICFjYW5jZWxlZCkge1xuICAgICAgICB0aGlzLl9zZXRTd2lwaW5nKGZhbHNlKTtcbiAgICAgICAgY2hhbmdlICYmIHRoaXMucG9zdENoYW5nZUhvb2soZSk7XG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbnMucmVqZWN0KSB7XG4gICAgICAgIHRoaXMuX3NldFN3aXBpbmcoZmFsc2UpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ0NhbmNlbGVkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfc2Nyb2xsVG8oc2Nyb2xsLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAob3B0aW9ucy50aHJvdHRsZSkge1xuICAgICAgY29uc3QgcmF0aW8gPSAwLjM1O1xuICAgICAgaWYgKHNjcm9sbCA8IDApIHtcbiAgICAgICAgc2Nyb2xsID0gdGhpcy5pc092ZXJTY3JvbGxhYmxlKCkgPyBNYXRoLnJvdW5kKHNjcm9sbCAqIHJhdGlvKSA6IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB0aGlzLm1heFNjcm9sbDtcbiAgICAgICAgaWYgKG1heFNjcm9sbCA8IHNjcm9sbCkge1xuICAgICAgICAgIHNjcm9sbCA9IHRoaXMuaXNPdmVyU2Nyb2xsYWJsZSgpID8gbWF4U2Nyb2xsICsgTWF0aC5yb3VuZCgoc2Nyb2xsIC0gbWF4U2Nyb2xsKSAqIHJhdGlvKSA6IG1heFNjcm9sbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9wdCA9IG9wdGlvbnMuYW5pbWF0aW9uICA9PT0gJ25vbmUnID8ge30gOiBvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnM7XG4gICAgdGhpcy5zY3JvbGxIb29rICYmIHRoaXMuaXRlbU51bVNpemUgPiAwICYmIHRoaXMuc2Nyb2xsSG9vaygoc2Nyb2xsIC8gdGhpcy5pdGVtTnVtU2l6ZSkudG9GaXhlZCgyKSwgb3B0aW9ucy5hbmltYXRpb25PcHRpb25zIHx8IHt9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+XG4gICAgICBhbmltaXQodGhpcy50YXJnZXQpXG4gICAgICAgIC5xdWV1ZSh7IHRyYW5zZm9ybTogdGhpcy5fZ2V0VHJhbnNmb3JtKHNjcm9sbCkgfSwgb3B0KVxuICAgICAgICAucGxheShyZXNvbHZlKVxuICAgICk7XG4gIH1cblxuICBfZ2V0QXV0b1Njcm9sbChzY3JvbGwsIHZlbG9jaXR5LCBtYXRjaGVzRGlyZWN0aW9uKSB7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5tYXhTY3JvbGwsXG4gICAgICBvZmZzZXQgPSB0aGlzLl9vZmZzZXQsXG4gICAgICBzaXplID0gdGhpcy5pdGVtTnVtU2l6ZTtcblxuICAgIGlmICghdGhpcy5pc0F1dG9TY3JvbGxhYmxlKCkpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbihtYXgsIHNjcm9sbCkpO1xuICAgIH1cblxuICAgIGxldCBhcnIgPSBbXTtcbiAgICBmb3IgKGxldCBzID0gb2Zmc2V0OyBzIDwgbWF4OyBzICs9IHNpemUpIHtcbiAgICAgIGFyci5wdXNoKHMpO1xuICAgIH1cbiAgICBhcnIucHVzaChtYXgpO1xuXG4gICAgYXJyID0gYXJyXG4gICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IE1hdGguYWJzKGxlZnQgLSBzY3JvbGwpIC0gTWF0aC5hYnMocmlnaHQgLSBzY3JvbGwpKVxuICAgICAgLmZpbHRlcigoaXRlbSwgcG9zKSA9PiAhcG9zIHx8IGl0ZW0gIT09IGFycltwb3MgLSAxXSk7XG5cbiAgICBsZXQgcmVzdWx0ID0gYXJyWzBdO1xuICAgIGNvbnN0IGxhc3RTY3JvbGwgPSB0aGlzLl9sYXN0QWN0aXZlSW5kZXggKiBzaXplICsgb2Zmc2V0O1xuICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gTWF0aC5hYnMoc2Nyb2xsIC0gbGFzdFNjcm9sbCkgLyBzaXplO1xuXG4gICAgaWYgKHNjcm9sbFJhdGlvIDw9IHRoaXMuZ2V0QXV0b1Njcm9sbFJhdGlvKG1hdGNoZXNEaXJlY3Rpb24sIHZlbG9jaXR5LCBzaXplKSkge1xuICAgICAgcmVzdWx0ID0gbGFzdFNjcm9sbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNjcm9sbFJhdGlvIDwgMS4wICYmIGFyclswXSA9PT0gbGFzdFNjcm9sbCAmJiBhcnIubGVuZ3RoID4gMSkge1xuICAgICAgICByZXN1bHQgPSBhcnJbMV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbihtYXgsIHJlc3VsdCkpO1xuICB9XG5cbiAgX3Jlc2V0KCkge1xuICAgIHRoaXMuX3RhcmdldFNpemUgPSB0aGlzLl9pdGVtTnVtU2l6ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIF9ub3JtYWxpemVTY3JvbGwoc2Nyb2xsKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KCBNYXRoLm1pbihzY3JvbGwsIHRoaXMubWF4U2Nyb2xsKSwgMCk7XG4gIH1cblxuICByZWZyZXNoKCkge1xuICAgIHRoaXMuX3Jlc2V0KCk7XG4gICAgdGhpcy5fdXBkYXRlTGF5b3V0KCk7XG5cbiAgICBpZiAodXRpbC5pc0ludGVnZXIodGhpcy5fc2Nyb2xsKSkge1xuICAgICAgY29uc3Qgc2Nyb2xsID0gdGhpcy5fbm9ybWFsaXplU2Nyb2xsKHRoaXMuX3Njcm9sbCk7XG4gICAgICBzY3JvbGwgIT09IHRoaXMuX3Njcm9sbCA/IHRoaXMuX2tpbGxPdmVyU2Nyb2xsKHNjcm9sbCkgOiB0aGlzLl9jaGFuZ2VUbyhzY3JvbGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXR1cEluaXRpYWxJbmRleCgpO1xuICAgIH1cblxuICAgIHRoaXMucmVmcmVzaEhvb2soKTtcbiAgfVxuXG4gIGdldCB0YXJnZXRTaXplKCkge1xuICAgIGlmICghdGhpcy5fdGFyZ2V0U2l6ZSkge1xuICAgICAgdGhpcy5fdGFyZ2V0U2l6ZSA9IHRoaXMudGFyZ2V0W2BvZmZzZXQke3RoaXMuZE0uc2l6ZX1gXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3RhcmdldFNpemU7XG4gIH1cblxuICBfZ2V0RGVsdGEoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQuZ2VzdHVyZVtgZGVsdGEke3RoaXMuZE0uYXhpc31gXTtcbiAgfVxuXG4gIF9nZXRWZWxvY2l0eShldmVudCkge1xuICAgIHJldHVybiBldmVudC5nZXN0dXJlW2B2ZWxvY2l0eSR7dGhpcy5kTS5heGlzfWBdO1xuICB9XG5cbiAgX2dldFRyYW5zZm9ybShzY3JvbGwpIHtcbiAgICByZXR1cm4gYHRyYW5zbGF0ZTNkKCR7dGhpcy5kTS50M2RbMF19JHstc2Nyb2xsfSR7dGhpcy5kTS50M2RbMV19KWA7XG4gIH1cblxuICBfdXBkYXRlTGF5b3V0KCkge1xuICAgIHRoaXMuZE0gPSBkaXJlY3Rpb25NYXBbdGhpcy5pc1ZlcnRpY2FsKCkgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnXTtcbiAgICB0aGlzLnRhcmdldC5jbGFzc0xpc3QudG9nZ2xlKCdvbnMtc3dpcGVyLXRhcmdldC0tdmVydGljYWwnLCB0aGlzLmlzVmVydGljYWwoKSk7XG5cbiAgICBmb3IgKGxldCBjID0gdGhpcy50YXJnZXQuY2hpbGRyZW5bMF07IGM7IGMgPSBjLm5leHRFbGVtZW50U2libGluZykge1xuICAgICAgYy5zdHlsZVt0aGlzLmRNLnNpemUudG9Mb3dlckNhc2UoKV0gPSB0aGlzLml0ZW1TaXplO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ2VudGVyZWQoKSkge1xuICAgICAgdGhpcy5fb2Zmc2V0ID0gKHRoaXMudGFyZ2V0U2l6ZSAtIHRoaXMuaXRlbU51bVNpemUpIC8gLTIgfHwgMDtcbiAgICB9XG4gIH1cbn1cblxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcbmltcG9ydCBTd2lwZXIgZnJvbSAnLi4vb25zL2ludGVybmFsL3N3aXBlci5qcyc7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWNhcm91c2VsXG4gKiBAY2F0ZWdvcnkgY2Fyb3VzZWxcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgQ2Fyb3VzZWwgY29tcG9uZW50LiBBIGNhcm91c2VsIGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgc2V2ZXJhbCBpdGVtcyBpbiB0aGUgc2FtZSBzcGFjZS5cbiAqXG4gKiAgICAgVGhlIGNvbXBvbmVudCBzdXBwb3J0cyBkaXNwbGF5aW5nIGNvbnRlbnQgYm90aCBob3Jpem9udGFsbHkgYW5kIHZlcnRpY2FsbHkuIFRoZSB1c2VyIGNhbiBzY3JvbGwgdGhyb3VnaCB0aGUgaXRlbXMgYnkgZHJhZ2dpbmcgYW5kIGl0IGNhbiBhbHNvIGJlIGNvbnRyb2xsZXIgcHJvZ3JhbW1hdGljYWxseS5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAY29kZXBlbiB4YmJ6T1FcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9jYXJvdXNlbFxuICogQHNlZWFsc28gb25zLWNhcm91c2VsLWl0ZW1cbiAqICAgW2VuXWA8b25zLWNhcm91c2VsLWl0ZW0+YCBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLWNhcm91c2VsLWl0ZW3jgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtY2Fyb3VzZWwgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAyMDBweFwiPlxuICogICA8b25zLWNhcm91c2VsLWl0ZW0+XG4gKiAgICAuLi5cbiAqICAgPC9vbnMtY2Fyb3VzZWwtaXRlbT5cbiAqICAgPG9ucy1jYXJvdXNlbC1pdGVtPlxuICogICAgLi4uXG4gKiAgIDwvb25zLWNhcm91c2VsLWl0ZW0+XG4gKiA8L29ucy1jYXJvdXNlbD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2Fyb3VzZWxFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdGNoYW5nZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBhZnRlciB0aGUgY3VycmVudCBjYXJvdXNlbCBpdGVtIGhhcyBjaGFuZ2VkLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOihqOekuuOBl+OBpuOBhOOCi+OCq+ODq+ODvOOCu+ODq+OBruimgee0oOOBjOWkieOCj+OBo+OBn+aZguOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmNhcm91c2VsXG4gICAqICAgW2VuXUNhcm91c2VsIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ9DYXJvdXNlbOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5hY3RpdmVJbmRleFxuICAgKiAgIFtlbl1DdXJyZW50IGFjdGl2ZSBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjgqLjgq/jg4bjgqPjg5bjgavjgarjgaPjgabjgYTjgovopoHntKDjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgIJbL2phXVxuICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQubGFzdEFjdGl2ZUluZGV4XG4gICAqICAgW2VuXVByZXZpb3VzIGFjdGl2ZSBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV3ku6XliY3jgqLjgq/jg4bjgqPjg5bjgaDjgaPjgZ/opoHntKDjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHByZWNoYW5nZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBiZWZvcmUgdGhlIGN1cnJlbnQgY2Fyb3VzZWwgaXRlbSBjaGFuZ2VzLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmNhcm91c2VsXG4gICAqICAgW2VuXUNhcm91c2VsIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ9DYXJvdXNlbOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5hY3RpdmVJbmRleFxuICAgKiAgIFtlbl1DdXJyZW50IGFjdGl2ZSBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjgqLjgq/jg4bjgqPjg5bjgavjgarjgaPjgabjgYTjgovopoHntKDjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgIJbL2phXVxuICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQubGFzdEFjdGl2ZUluZGV4XG4gICAqICAgW2VuXVByZXZpb3VzIGFjdGl2ZSBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV3ku6XliY3jgqLjgq/jg4bjgqPjg5bjgaDjgaPjgZ/opoHntKDjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHJlZnJlc2hcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHdoZW4gdGhlIGNhcm91c2VsIGhhcyBiZWVuIHJlZnJlc2hlZC5bL2VuXVxuICAgKiAgIFtqYV3jgqvjg6vjg7zjgrvjg6vjgYzmm7TmlrDjgZXjgozjgZ/mmYLjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5jYXJvdXNlbFxuICAgKiAgIFtlbl1DYXJvdXNlbCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44GM55m654Gr44GX44GfQ2Fyb3VzZWzjgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IG92ZXJzY3JvbGxcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHdoZW4gdGhlIGNhcm91c2VsIGhhcyBiZWVuIG92ZXJzY3JvbGxlZC5bL2VuXVxuICAgKiAgIFtqYV3jgqvjg6vjg7zjgrvjg6vjgYzjgqrjg7zjg5Djg7zjgrnjgq/jg63jg7zjg6vjgZfjgZ/mmYLjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5jYXJvdXNlbFxuICAgKiAgIFtlbl1GaXJlZCB3aGVuIHRoZSBjYXJvdXNlbCBoYXMgYmVlbiByZWZyZXNoZWQuWy9lbl1cbiAgICogICBbamFd44Kr44Or44O844K744Or44GM5pu05paw44GV44KM44Gf5pmC44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmFjdGl2ZUluZGV4XG4gICAqICAgW2VuXUN1cnJlbnQgYWN0aXZlIGluZGV4LlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOCouOCr+ODhuOCo+ODluOBq+OBquOBo+OBpuOBhOOCi+imgee0oOOBruOCpOODs+ODh+ODg+OCr+OCueOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudC5kaXJlY3Rpb25cbiAgICogICBbZW5dQ2FuIGJlIG9uZSBvZiBlaXRoZXIgXCJ1cFwiLCBcImRvd25cIiwgXCJsZWZ0XCIgb3IgXCJyaWdodFwiLlsvZW5dXG4gICAqICAgW2phXeOCquODvOODkOODvOOCueOCr+ODreODvOODq+OBleOCjOOBn+aWueWQkeOBjOW+l+OCieOCjOOBvuOBmeOAglwidXBcIiwgXCJkb3duXCIsIFwibGVmdFwiLCBcInJpZ2h0XCLjga7jgYTjgZrjgozjgYvjga7mlrnlkJHjgYzmuKHjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC53YWl0VG9SZXR1cm5cbiAgICogICBbZW5dVGFrZXMgYSA8Y29kZT5Qcm9taXNlPC9jb2RlPiBvYmplY3QgYXMgYW4gYXJndW1lbnQuIFRoZSBjYXJvdXNlbCB3aWxsIG5vdCBzY3JvbGwgYmFjayB1bnRpbCB0aGUgcHJvbWlzZSBoYXMgYmVlbiByZXNvbHZlZCBvciByZWplY3RlZC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7plqLmlbDjga9Qcm9taXNl44Kq44OW44K444Kn44Kv44OI44KS5byV5pWw44Go44GX44Gm5Y+X44GR5Y+W44KK44G+44GZ44CC5rih44GX44GfUHJvbWlzZeOCquODluOCuOOCp+OCr+ODiOOBjHJlc29sdmXjgZXjgozjgovjgYtyZWplY3TjgZXjgozjgovjgb7jgafjgIHjgqvjg6vjg7zjgrvjg6vjga/jgrnjgq/jg63jg7zjg6vjg5Djg4Pjgq/jgZfjgb7jgZvjgpPjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHN3aXBlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlcyB3aGVuIHRoZSBjYXJvdXNlbCBzd2lwZXMuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge051bWJlcn0gZXZlbnQuaW5kZXhcbiAgICogICBbZW5dQ3VycmVudCBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjgqLjgq/jg4bjgqPjg5bjgavjgarjgaPjgabjgYTjgotvbnMtY2Fyb3VzZWzjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQub3B0aW9uc1xuICAgKiAgIFtlbl1BbmltYXRpb24gb3B0aW9ucyBvYmplY3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlyZWN0aW9uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgZGlyZWN0aW9uIG9mIHRoZSBjYXJvdXNlbC4gQ2FuIGJlIGVpdGhlciBcImhvcml6b250YWxcIiBvciBcInZlcnRpY2FsXCIuIERlZmF1bHQgaXMgXCJob3Jpem9udGFsXCIuWy9lbl1cbiAgICogICBbamFd44Kr44Or44O844K744Or44Gu5pa55ZCR44KS5oyH5a6a44GX44G+44GZ44CCXCJob3Jpem9udGFsXCLjgYtcInZlcnRpY2FsXCLjgpLmjIflrprjgafjgY3jgb7jgZnjgIJcImhvcml6b250YWxcIuOBjOODh+ODleOCqeODq+ODiOWApOOBp+OBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGZ1bGxzY3JlZW5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgY2Fyb3VzZWwgd2lsbCBjb3ZlciB0aGUgd2hvbGUgc2NyZWVuLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+OBqOOAgWFic29sdXRl44Od44K444K344On44Oz44KS5L2/44Gj44Gm44Kr44Or44O844K744Or44GM6Ieq5YuV55qE44Gr55S76Z2i44GE44Gj44Gx44GE44Gr5bqD44GM44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBmdWxsc2NyZWVuXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdGhlIGNhcm91c2VsIHdpbGwgY292ZXIgdGhlIHdob2xlIHNjcmVlbi5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovjgajjgIFhYnNvbHV0ZeODneOCuOOCt+ODp+ODs+OCkuS9v+OBo+OBpuOCq+ODq+ODvOOCu+ODq+OBjOiHquWLleeahOOBq+eUu+mdouOBhOOBo+OBseOBhOOBq+W6g+OBjOOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG92ZXJzY3JvbGxhYmxlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIGNhcm91c2VsIHdpbGwgYmUgc2Nyb2xsYWJsZSBvdmVyIHRoZSBlZGdlLiBJdCB3aWxsIGJvdW5jZSBiYWNrIHdoZW4gcmVsZWFzZWQuWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL5pmC44CB44K/44OD44OB44KE44OJ44Op44OD44Kw44Gn56uv44G+44Gn44K544Kv44Ot44O844Or44GX44Gf5pmC44Gr44CB44OQ44Km44Oz44OJ44GZ44KL44KI44GG44Gq5Yq55p6c44GM5b2T44Gf44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgY2VudGVyZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgY2Fyb3VzZWwgdGhlbiB0aGUgc2VsZWN0ZWQgaXRlbSB3aWxsIGJlIGluIHRoZSBjZW50ZXIgb2YgdGhlIGNhcm91c2VsIGluc3RlYWQgb2YgdGhlIGJlZ2lubmluZy4gVXNlZnVsIG9ubHkgd2hlbiB0aGUgaXRlbXMgYXJlIHNtYWxsZXIgdGhhbiB0aGUgY2Fyb3VzZWwuIFsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgemBuOOCk+OBp+OBhOOCi29ucy1jYXJvdXNlbC1pdGVt44Gv44Kr44Or44O844K744Or44Gu55yf44KT5Lit44G46KGM44GN44G+44GZ44CC6aCF55uu44GM44Kr44Or44O844K744Or44KI44KK44KC5bCP44GV44GE5aC05ZCI44Gr44Gu44G/44CB44GT44KM44Gv5L6/5Yip44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgaXRlbS13aWR0aFxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICAgW2VuXW9ucy1jYXJvdXNlbC1pdGVtJ3Mgd2lkdGguIE9ubHkgd29ya3Mgd2hlbiB0aGUgZGlyZWN0aW9uIGlzIHNldCB0byBcImhvcml6b250YWxcIi5bL2VuXVxuICAgKiAgICBbamFdb25zLWNhcm91c2VsLWl0ZW3jga7luYXjgpLmjIflrprjgZfjgb7jgZnjgILjgZPjga7lsZ7mgKfjga/jgIFkaXJlY3Rpb27lsZ7mgKfjgatcImhvcml6b250YWxcIuOCkuaMh+WumuOBl+OBn+aZguOBruOBv+acieWKueOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGl0ZW0taGVpZ2h0XG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1vbnMtY2Fyb3VzZWwtaXRlbSdzIGhlaWdodC4gT25seSB3b3JrcyB3aGVuIHRoZSBkaXJlY3Rpb24gaXMgc2V0IHRvIFwidmVydGljYWxcIi5bL2VuXVxuICAgKiAgIFtqYV1vbnMtY2Fyb3VzZWwtaXRlbeOBrumrmOOBleOCkuaMh+WumuOBl+OBvuOBmeOAguOBk+OBruWxnuaAp+OBr+OAgWRpcmVjdGlvbuWxnuaAp+OBq1widmVydGljYWxcIuOCkuaMh+WumuOBl+OBn+aZguOBruOBv+acieWKueOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGF1dG8tc2Nyb2xsXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIGNhcm91c2VsIHdpbGwgYmUgYXV0b21hdGljYWxseSBzY3JvbGxlZCB0byB0aGUgY2xvc2VzdCBpdGVtIGJvcmRlciB3aGVuIHJlbGVhc2VkLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgeS4gOeVqui/keOBhGNhcm91c2VsLWl0ZW3jga7looPnlYzjgb7jgafoh6rli5XnmoTjgavjgrnjgq/jg63jg7zjg6vjgZnjgovjgojjgYbjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhdXRvLXNjcm9sbC1yYXRpb1xuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICAgW2VuXUEgbnVtYmVyIGJldHdlZW4gMC4wIGFuZCAxLjAgdGhhdCBzcGVjaWZpZXMgaG93IG11Y2ggdGhlIHVzZXIgbXVzdCBkcmFnIHRoZSBjYXJvdXNlbCBpbiBvcmRlciBmb3IgaXQgdG8gYXV0byBzY3JvbGwgdG8gdGhlIG5leHQgaXRlbS5bL2VuXVxuICAgKiAgICBbamFdMC4w44GL44KJMS4w44G+44Gn44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CC44Kr44Or44O844K744Or44Gu6KaB57Sg44KS44Gp44KM44GQ44KJ44GE44Gu5Ymy5ZCI44G+44Gn44OJ44Op44OD44Kw44GZ44KL44Go5qyh44Gu6KaB57Sg44Gr6Ieq5YuV55qE44Gr44K544Kv44Ot44O844Or44GZ44KL44GL44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgc3dpcGVhYmxlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIGNhcm91c2VsIGNhbiBiZSBzY3JvbGxlZCBieSBkcmFnIG9yIHN3aXBlLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgeOCq+ODq+ODvOOCu+ODq+OCkuOCueODr+OCpOODl+OChOODieODqeODg+OCsOOBp+enu+WLleOBp+OBjeOCi+OCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGRpc2FibGVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIGNhcm91c2VsIGlzIGRpc2FibGVkLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgWRyYWfjgoR0b3VjaOOChHN3aXBl44KS5Y+X44GR5LuY44GR44Gq44GP44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgaW5pdGlhbC1pbmRleFxuICAgKiBAaW5pdG9ubHlcbiAgICogQGRlZmF1bHQgMFxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgaW5kZXggb2YgdGhlIG9ucy1jYXJvdXNlbC1pdGVtIHRvIHNob3cgaW5pdGlhbGx5LiBEZWZhdWx0IGlzIDAuIElmIGFjdGl2ZS1pbmRleCBpcyBzZXQsIGluaXRpYWwtaW5kZXggaXMgaWdub3JlZC5bL2VuXVxuICAgKiAgIFtqYV3mnIDliJ3jgavooajnpLrjgZnjgotvbnMtY2Fyb3VzZWwtaXRlbeOCkjDlp4vjgb7jgorjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgafmjIflrprjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jlgKTjga8gMCDjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhdXRvLXJlZnJlc2hcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSBjYXJvdXNlbCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aGVuIHRoZSBudW1iZXIgb2YgY2hpbGQgbm9kZXMgY2hhbmdlLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgeWtkOimgee0oOOBruaVsOOBjOWkieOCj+OCi+OBqOOCq+ODq+ODvOOCu+ODq+OBr+iHquWLleeahOOBq+abtOaWsOOBleOCjOOCi+OCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYXV0b1JlZnJlc2hcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGVuIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRoZSBjYXJvdXNlbCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aGVuIHRoZSBudW1iZXIgb2YgY2hpbGQgbm9kZXMgY2hhbmdlLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgeWtkOimgee0oOOBruaVsOOBjOWkieOCj+OCi+OBqOOCq+ODq+ODvOOCu+ODq+OBr+iHquWLleeahOOBq+abtOaWsOOBleOCjOOCi+OCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIGBcIm5vbmVcImAgdGhlIHRyYW5zaXRpb25zIHdpbGwgbm90IGJlIGFuaW1hdGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvbi1vcHRpb25zXG4gICAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CC5L6L77yae2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29uc3Qge29uQ29ubmVjdGVkLCBvbkRpc2Nvbm5lY3RlZH0gPSB1dGlsLmRlZmluZUxpc3RlbmVyUHJvcGVydHkodGhpcywgJ3N3aXBlJyk7XG4gICAgdGhpcy5fY29ubmVjdE9uU3dpcGUgPSBvbkNvbm5lY3RlZDtcbiAgICB0aGlzLl9kaXNjb25uZWN0T25Td2lwZSA9IG9uRGlzY29ubmVjdGVkO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmNoaWxkcmVuWzBdICYmIHRoaXMuY2hpbGRyZW5bMF0udGFnTmFtZSAhPT0gJ09OUy1DQVJPVVNFTC1JVEVNJyAmJiB0aGlzLmNoaWxkcmVuWzBdIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGlmICghdGFyZ2V0LnBhcmVudE5vZGUpIHtcbiAgICAgIHdoaWxlICh0aGlzLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKHRoaXMuZmlyc3RDaGlsZCk7XG4gICAgICB9XG4gICAgICB0aGlzLmFwcGVuZENoaWxkKHRhcmdldCk7XG4gICAgfVxuXG4gICAgIXRoaXMuY2hpbGRyZW5bMV0gJiYgdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG5cbiAgICB0aGlzLmFwcGVuZENoaWxkID0gdGhpcy5hcHBlbmRDaGlsZC5iaW5kKHRhcmdldCk7XG4gICAgdGhpcy5pbnNlcnRCZWZvcmUgPSB0aGlzLmluc2VydEJlZm9yZS5iaW5kKHRhcmdldCk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAoIXRoaXMuX3N3aXBlcikge1xuICAgICAgdGhpcy5fc3dpcGVyID0gbmV3IFN3aXBlcih7XG4gICAgICAgIGdldEVsZW1lbnQ6ICgpID0+IHRoaXMsXG4gICAgICAgIGdldEluaXRpYWxJbmRleDogKCkgPT4gdGhpcy5nZXRBdHRyaWJ1dGUoJ2FjdGl2ZS1pbmRleCcpIHx8IHRoaXMuZ2V0QXR0cmlidXRlKCdpbml0aWFsLWluZGV4JyksXG4gICAgICAgIGdldEF1dG9TY3JvbGxSYXRpbzogKCkgPT4gdGhpcy5hdXRvU2Nyb2xsUmF0aW8sXG4gICAgICAgIGlzVmVydGljYWw6ICgpID0+IHRoaXMudmVydGljYWwsXG4gICAgICAgIGlzT3ZlclNjcm9sbGFibGU6ICgpID0+IHRoaXMub3ZlcnNjcm9sbGFibGUsXG4gICAgICAgIGlzQ2VudGVyZWQ6ICgpID0+IHRoaXMuY2VudGVyZWQsXG4gICAgICAgIGlzQXV0b1Njcm9sbGFibGU6ICgpID0+IHRoaXMuYXV0b1Njcm9sbCxcbiAgICAgICAgaXRlbVNpemU6IHRoaXMuaXRlbVNpemUsXG4gICAgICAgIG92ZXJTY3JvbGxIb29rOiB0aGlzLl9vbk92ZXJTY3JvbGwuYmluZCh0aGlzKSxcbiAgICAgICAgcHJlQ2hhbmdlSG9vazogdGhpcy5fb25QcmVDaGFuZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgcG9zdENoYW5nZUhvb2s6IHRoaXMuX29uUG9zdENoYW5nZS5iaW5kKHRoaXMpLFxuICAgICAgICByZWZyZXNoSG9vazogdGhpcy5fb25SZWZyZXNoLmJpbmQodGhpcyksXG4gICAgICAgIHNjcm9sbEhvb2s6IChpbmRleCwgb3B0aW9ucykgPT4gdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdzd2lwZScsIHsgaW5kZXgsIG9wdGlvbnMgfSlcbiAgICAgIH0pO1xuXG4gICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fc3dpcGVyLmluaXQoe1xuICAgICAgICBzd2lwZWFibGU6IHRoaXMuaGFzQXR0cmlidXRlKCdzd2lwZWFibGUnKSxcbiAgICAgICAgYXV0b1JlZnJlc2g6IHRoaXMuaGFzQXR0cmlidXRlKCdhdXRvLXJlZnJlc2gnKVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHRoaXMuX2Nvbm5lY3RPblN3aXBlKCk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAodGhpcy5fc3dpcGVyICYmIHRoaXMuX3N3aXBlci5pbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5fc3dpcGVyLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMuX3N3aXBlciA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fZGlzY29ubmVjdE9uU3dpcGUoKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ3N3aXBlYWJsZScsICdhdXRvLXJlZnJlc2gnLCAnZGlyZWN0aW9uJywgJ2l0ZW0taGVpZ2h0JywgJ2l0ZW0td2lkdGgnLCAnYWN0aXZlLWluZGV4J107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIGlmICghdGhpcy5fc3dpcGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdzd2lwZWFibGUnOlxuICAgICAgICB0aGlzLl9zd2lwZXIudXBkYXRlU3dpcGVhYmxlKHRoaXMuaGFzQXR0cmlidXRlKCdzd2lwZWFibGUnKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYXV0by1yZWZyZXNoJzpcbiAgICAgICAgdGhpcy5fc3dpcGVyLnVwZGF0ZUF1dG9SZWZyZXNoKHRoaXMuaGFzQXR0cmlidXRlKCdhdXRvLXJlZnJlc2gnKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaXRlbS1oZWlnaHQnOlxuICAgICAgICB0aGlzLnZlcnRpY2FsICYmIHRoaXMuX3N3aXBlci51cGRhdGVJdGVtU2l6ZSh0aGlzLml0ZW1TaXplKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpdGVtLXdpZHRoJzpcbiAgICAgICAgdGhpcy52ZXJ0aWNhbCB8fCB0aGlzLl9zd2lwZXIudXBkYXRlSXRlbVNpemUodGhpcy5pdGVtU2l6ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGlyZWN0aW9uJzpcbiAgICAgICAgdGhpcy5fc3dpcGVyLnJlZnJlc2goKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY3RpdmUtaW5kZXgnOlxuICAgICAgICBpZiAodGhpcy5nZXRBY3RpdmVJbmRleCgpICE9PSB0aGlzLmFjdGl2ZUluZGV4KSB7XG4gICAgICAgICAgdGhpcy5zZXRBY3RpdmVJbmRleCh0aGlzLmFjdGl2ZUluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBfc2hvdygpIHtcbiAgICB0aGlzLl9zd2lwZXIuc2hvdygpO1xuICB9XG5cbiAgX2hpZGUoKSB7XG4gICAgdGhpcy5fc3dpcGVyLmhpZGUoKTtcbiAgfVxuXG4gIF9vbk92ZXJTY3JvbGwoeyBkaXJlY3Rpb24sIGtpbGxPdmVyU2Nyb2xsIH0pIHtcbiAgICBsZXQgd2FpdEZvckFjdGlvbiA9IGZhbHNlO1xuICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAnb3ZlcnNjcm9sbCcsIHtcbiAgICAgIGNhcm91c2VsOiB0aGlzLFxuICAgICAgYWN0aXZlSW5kZXg6IHRoaXMuZ2V0QWN0aXZlSW5kZXgoKSxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIHdhaXRUb1JldHVybjogcHJvbWlzZSA9PiB7XG4gICAgICAgIHdhaXRGb3JBY3Rpb24gPSB0cnVlO1xuICAgICAgICBwcm9taXNlLnRoZW4oa2lsbE92ZXJTY3JvbGwpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHdhaXRGb3JBY3Rpb247XG4gIH1cblxuICBfb25QcmVDaGFuZ2UoeyBhY3RpdmVJbmRleCwgbGFzdEFjdGl2ZUluZGV4IH0pIHtcbiAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3ByZWNoYW5nZScsIHsgY2Fyb3VzZWw6IHRoaXMsIGFjdGl2ZUluZGV4LCBsYXN0QWN0aXZlSW5kZXggfSk7XG4gIH1cblxuICBfb25Qb3N0Q2hhbmdlKHsgYWN0aXZlSW5kZXgsIGxhc3RBY3RpdmVJbmRleCB9KSB7XG4gICAgdGhpcy5hY3RpdmVJbmRleCA9IGFjdGl2ZUluZGV4O1xuICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAncG9zdGNoYW5nZScsIHsgY2Fyb3VzZWw6IHRoaXMsIGFjdGl2ZUluZGV4LCBsYXN0QWN0aXZlSW5kZXggfSk7XG4gIH1cblxuICBfb25SZWZyZXNoKCkge1xuICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAncmVmcmVzaCcsIHsgY2Fyb3VzZWw6IHRoaXMgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzZXRBY3RpdmVJbmRleFxuICAgKiBAc2lnbmF0dXJlIHNldEFjdGl2ZUluZGV4KGluZGV4LCBbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgKiAgIFtlbl1UaGUgaW5kZXggdGhhdCB0aGUgY2Fyb3VzZWwgc2hvdWxkIGJlIHNldCB0by5bL2VuXVxuICAgKiAgIFtqYV1jYXJvdXNlbOimgee0oOOBruOCpOODs+ODh+ODg+OCr+OCueOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBhbmltYXRpb24gaXMgZmluaXNoZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIGBcIm5vbmVcImAgdGhlIHRyYW5zaXRpb25zIHdpbGwgbm90IGJlIGFuaW1hdGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1BbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nIGZ1bmN0aW9uIG9mIHRoZSBhbmltYXRpb24uWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGluZGV4IG9mIHRoZSBgPG9ucy1jYXJvdXNlbC1pdGVtPmAgdG8gc2hvdy5bL2VuXVxuICAgKiAgIFtqYV3ooajnpLrjgZnjgotvbnMtY2Fyb3VzZWwtaXRlbeOCkmluZGV444Gn5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIGNhcm91c2VsIGVsZW1lbnQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHNldEFjdGl2ZUluZGV4KGluZGV4LCBvcHRpb25zID0ge30pIHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgYW5pbWF0aW9uOiB0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uJyksXG4gICAgICBhbmltYXRpb25PcHRpb25zOiB0aGlzLmFuaW1hdGlvbk9wdGlvbnMgfHwgeyBkdXJhdGlvbjogLjMsIHRpbWluZzogJ2N1YmljLWJlemllciguNCwgLjcsIC41LCAxKScgfSxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuX3N3aXBlci5zZXRBY3RpdmVJbmRleChpbmRleCwgb3B0aW9ucylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgb3B0aW9ucy5jYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIG9wdGlvbnMuY2FsbGJhY2sodGhpcyk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGdldEFjdGl2ZUluZGV4XG4gICAqIEBzaWduYXR1cmUgZ2V0QWN0aXZlSW5kZXgoKVxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqICAgW2VuXVRoZSBjdXJyZW50IGNhcm91c2VsIGl0ZW0gaW5kZXguWy9lbl1cbiAgICogICBbamFd54++5Zyo6KGo56S644GX44Gm44GE44KL44Kr44Or44O844K744Or6KaB57Sg44Gu44Kk44Oz44OH44OD44Kv44K544GM6L+U44GV44KM44G+44GZ44CCWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBgPG9ucy1jYXJvdXNlbC1pdGVtPmAuWy9lbl1cbiAgICogICBbamFd54++5Zyo6KGo56S644GV44KM44Gm44GE44KLb25zLWNhcm91c2VsLWl0ZW3opoHntKDjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgZ2V0QWN0aXZlSW5kZXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N3aXBlci5nZXRBY3RpdmVJbmRleCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbmV4dFxuICAgKiBAc2lnbmF0dXJlIG5leHQoW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXUEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBhbmltYXRpb24gaGFzIGZpbmlzaGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBgXCJub25lXCJgIHRoZSB0cmFuc2l0aW9ucyB3aWxsIG5vdCBiZSBhbmltYXRlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcgZnVuY3Rpb24gb2YgdGhlIGFuaW1hdGlvbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgY2Fyb3VzZWwgZWxlbWVudFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IG5leHQgYDxvbnMtY2Fyb3VzZWwtaXRlbT5gLlsvZW5dXG4gICAqICAgW2phXeasoeOBrm9ucy1jYXJvdXNlbC1pdGVt44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIG5leHQob3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnNldEFjdGl2ZUluZGV4KHRoaXMuZ2V0QWN0aXZlSW5kZXgoKSArIDEsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgcHJldlxuICAgKiBAc2lnbmF0dXJlIHByZXYoW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXUEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBhbmltYXRpb24gaGFzIGZpbmlzaGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBgXCJub25lXCJgIHRoZSB0cmFuc2l0aW9ucyB3aWxsIG5vdCBiZSBhbmltYXRlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcgZnVuY3Rpb24gb2YgdGhlIGFuaW1hdGlvbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgY2Fyb3VzZWwgZWxlbWVudFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHByZXZpb3VzIGA8b25zLWNhcm91c2VsLWl0ZW0+YC5bL2VuXVxuICAgKiAgIFtqYV3liY3jga5vbnMtY2Fyb3VzZWwtaXRlbeOCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBwcmV2KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRBY3RpdmVJbmRleCh0aGlzLmdldEFjdGl2ZUluZGV4KCkgLSAxLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGZpcnN0XG4gICAqIEBzaWduYXR1cmUgZmlyc3QoKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXUEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBhbmltYXRpb24gaGFzIGZpbmlzaGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUlmIHRoaXMgaXMgc2V0IHRvIGBcIm5vbmVcImAsIHRoZSB0cmFuc2l0aW9ucyB3aWxsIG5vdCBiZSBhbmltYXRlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dQW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcgZnVuY3Rpb24gb2YgdGhlIGFuaW1hdGlvbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgY2Fyb3VzZWwgZWxlbWVudFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IGZpcnN0IGA8b25zLWNhcm91c2VsLWl0ZW0+YC5bL2VuXVxuICAgKiAgIFtqYV3mnIDliJ3jga5vbnMtY2Fyb3VzZWwtaXRlbeOCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBmaXJzdChvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0QWN0aXZlSW5kZXgoMCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBsYXN0XG4gICAqIEBzaWduYXR1cmUgbGFzdCgpXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIGFuaW1hdGlvbiBoYXMgZmluaXNoZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIGBcIm5vbmVcImAgdGhlIHRyYW5zaXRpb25zIHdpbGwgbm90IGJlIGFuaW1hdGVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1BbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZyBmdW5jdGlvbiBvZiB0aGUgYW5pbWF0aW9uLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBjYXJvdXNlbCBlbGVtZW50Wy9lbl1cbiAgICogICBbamFdUmVzb2x2ZXMgdG8gdGhlIGNhcm91c2VsIGVsZW1lbnRbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU2hvdyBsYXN0IG9ucy1jYXJvdXNlbCBpdGVtLlsvZW5dXG4gICAqICAgW2phXeacgOW+jOOBrm9ucy1jYXJvdXNlbC1pdGVt44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGxhc3Qob3B0aW9ucykge1xuICAgIHRoaXMuc2V0QWN0aXZlSW5kZXgoTWF0aC5tYXgodGhpcy5pdGVtQ291bnQgLSAxLCAwKSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCByZWZyZXNoXG4gICAqIEBzaWduYXR1cmUgcmVmcmVzaCgpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1VcGRhdGUgdGhlIGxheW91dCBvZiB0aGUgY2Fyb3VzZWwuIFVzZWQgd2hlbiBhZGRpbmcgYDxvbnMtY2Fyb3VzZWwtaXRlbXM+YCBkeW5hbWljYWxseSBvciB0byBhdXRvbWF0aWNhbGx5IGFkanVzdCB0aGUgc2l6ZS5bL2VuXVxuICAgKiAgIFtqYV3jg6zjgqTjgqLjgqbjg4jjgoTlhoXpg6jjga7nirbmhYvjgpLmnIDmlrDjga7jgoLjga7jgavmm7TmlrDjgZfjgb7jgZnjgIJvbnMtY2Fyb3VzZWwtaXRlbeOCkuWLleeahOOBq+Wil+OChOOBl+OBn+OCiuOAgW9ucy1jYXJvdXNlbOOBruWkp+OBjeOBleOCkuWLleeahOOBq+WkieOBiOOCi+mam+OBq+WIqeeUqOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICByZWZyZXNoKCkge1xuICAgIHRoaXMuX3N3aXBlci5yZWZyZXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGl0ZW1Db3VudFxuICAgKiBAcmVhZG9ubHlcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBudW1iZXIgb2YgY2Fyb3VzZWwgaXRlbXMuWy9lbl1cbiAgICogICBbamFd44Kr44Or44O844K744Or6KaB57Sg44Gu5pWw44Gn44GZ44CCWy9qYV1cbiAgICovXG4gIGdldCBpdGVtQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N3aXBlci5pdGVtQ291bnQ7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHN3aXBlYWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXXRydWUgaWYgdGhlIGNhcm91c2VsIGlzIHN3aXBlYWJsZS5bL2VuXVxuICAgKiAgIFtqYV1zd2lwZWFibGXjgafjgYLjgozjgbB0cnVl44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvblN3aXBlXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUhvb2sgY2FsbGVkIHdoZW5ldmVyIHRoZSB1c2VyIHNsaWRlcyB0aGUgY2Fyb3VzZWwuIEl0IGdldHMgYSBkZWNpbWFsIGluZGV4IGFuZCBhbiBhbmltYXRpb25PcHRpb25zIG9iamVjdCBhcyBhcmd1bWVudHMuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBhdXRvU2Nyb2xsXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5ddHJ1ZSBpZiBhdXRvIHNjcm9sbCBpcyBlbmFibGVkLlsvZW5dXG4gICAqICAgW2phXeOCquODvOODiOOCueOCr+ODreODvOODq+OBjOacieWKueOBp+OBguOCjOOBsHRydWXjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBnZXQgdmVydGljYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdkaXJlY3Rpb24nKSA9PT0gJ3ZlcnRpY2FsJztcbiAgfVxuXG4gIGdldCBpdGVtU2l6ZSgpIHtcbiAgICBjb25zdCBpdGVtU2l6ZUF0dHIgPSAodGhpcy5nZXRBdHRyaWJ1dGUoYGl0ZW0tJHt0aGlzLnZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnfWApIHx8ICcnKS50cmltKCk7XG4gICAgcmV0dXJuIGl0ZW1TaXplQXR0ci5tYXRjaCgvXlxcZCsocHh8JSkkLykgPyBpdGVtU2l6ZUF0dHIgOiAnMTAwJSc7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGF1dG9TY3JvbGxSYXRpb1xuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGN1cnJlbnQgYXV0byBzY3JvbGwgcmF0aW8uIFsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBruOCquODvOODiOOCueOCr+ODreODvOODq+OBrnJhdGlv5YCk44CCWy9qYV1cbiAgICovXG4gIGdldCBhdXRvU2Nyb2xsUmF0aW8oKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodGhpcy5nZXRBdHRyaWJ1dGUoJ2F1dG8tc2Nyb2xsLXJhdGlvJykpO1xuICB9XG5cbiAgc2V0IGF1dG9TY3JvbGxSYXRpbyhyYXRpbykge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhdXRvLXNjcm9sbC1yYXRpbycsIHJhdGlvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBjYXJvdXNlbCBpcyBkaXNhYmxlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFd54Sh5Yq55YyW44GV44KM44Gm44GE44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvdmVyc2Nyb2xsYWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGNhcm91c2VsIGlzIG92ZXJzY3JvbGxhYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV1vdmVyc2Nyb2xs44Gn44GN44KM44GwdHJ1ZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgY2VudGVyZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBjYXJvdXNlbCBpcyBjZW50ZXJlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFdY2VudGVyZWTnirbmhYvjgavjgarjgaPjgabjgYTjgozjgbB0cnVl44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgc3RhdGljIGdldCBldmVudHMoKSB7XG4gICAgcmV0dXJuIFsncG9zdGNoYW5nZScsICdyZWZyZXNoJywgJ292ZXJzY3JvbGwnLCAncHJlY2hhbmdlJywgJ3N3aXBlJ107XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAguS+i++8mntkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICovXG4gIGdldCBhbmltYXRpb25PcHRpb25zKCkge1xuICAgIGNvbnN0IGF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKTtcbiAgICBpZiAoYXR0cikge1xuICAgICAgcmV0dXJuIHV0aWwuYW5pbWF0aW9uT3B0aW9uc1BhcnNlKGF0dHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXR0cjtcbiAgICB9XG4gIH1cblxuICBzZXQgYW5pbWF0aW9uT3B0aW9ucyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbi1vcHRpb25zJywgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhY3RpdmUtaW5kZXhcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGluZGV4IG9mIHRoZSBjYXJvdXNlbCBpdGVtIHRoYXQgc2hvdWxkIGJlIHNob3duLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYWN0aXZlSW5kZXhcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGluZGV4IG9mIHRoZSBjYXJvdXNlbCBpdGVtIHRoYXQgc2hvdWxkIGJlIHNob3duLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgYWN0aXZlSW5kZXgoKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdhY3RpdmUtaW5kZXgnKSk7XG4gIH1cblxuICBzZXQgYWN0aXZlSW5kZXgodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FjdGl2ZS1pbmRleCcsIHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudXRpbC5kZWZpbmVCb29sZWFuUHJvcGVydGllcyhDYXJvdXNlbEVsZW1lbnQsIFsnc3dpcGVhYmxlJywgJ2Rpc2FibGVkJywgJ292ZXJzY3JvbGxhYmxlJywgJ2F1dG8tc2Nyb2xsJywgJ2NlbnRlcmVkJywgJ2Z1bGxzY3JlZW4nLCAnYXV0by1yZWZyZXNoJ10pO1xuXG5vbnNFbGVtZW50cy5DYXJvdXNlbCA9IENhcm91c2VsRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWNhcm91c2VsJywgQ2Fyb3VzZWxFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHN0eWxlciBmcm9tICcuLi9vbnMvc3R5bGVyLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtY29sXG4gKiBAY2F0ZWdvcnkgZ3JpZFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1SZXByZXNlbnRzIGEgY29sdW1uIGluIHRoZSBncmlkIHN5c3RlbS4gVXNlIHdpdGggYDxvbnMtcm93PmAgdG8gbGF5b3V0IGNvbXBvbmVudHMuWy9lbl1cbiAqICAgW2phXeOCsOODquODg+ODieOCt+OCueODhuODoOOBq+OBpuWIl+OCkuWumue+qeOBl+OBvuOBmeOAgm9ucy1yb3fjgajjgajjgoLjgavkvb/nlKjjgZfjgIHjgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jg6zjgqTjgqLjgqbjg4jjgavliKnnlKjjgZfjgb7jgZnjgIJbL2phXVxuICogQG5vdGVcbiAqICAgW2VuXUZvciBBbmRyb2lkIDQuMyBhbmQgZWFybGllciwgYW5kIGlPUzYgYW5kIGVhcmxpZXIsIHdoZW4gdXNpbmcgbWl4ZWQgYWxpZ25tZW50IHdpdGggb25zLXJvdyBhbmQgb25zLWNvbHVtbiwgdGhleSBtYXkgbm90IGJlIGRpc3BsYXllZCBjb3JyZWN0bHkuIFlvdSBjYW4gdXNlIG9ubHkgb25lIGFsaWdubWVudC5bL2VuXVxuICogICBbamFdQW5kcm9pZCA0LjPku6XliY3jgIHjgoLjgZfjgY/jga9pT1MgNuS7peWJjeOBrk9T44Gu5aC05ZCI44CBb25zLXJvd+OBqG9ucy1jb2x1bW7jgpLntYTjgb/lkIjjgo/jgZvjgZ/loLTlkIjjgavmj4/nlLvjgYzltKnjgozjgovloLTlkIjjgYzjgYLjgorjgb7jgZnjgIJbL2phXVxuICogQGNvZGVwZW4gR2d1akMge3dpZGV9XG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sIFtlbl1MYXlvdXRpbmcgZ3VpZGVbL2VuXVtqYV3jg6zjgqTjgqLjgqbjg4jmqZ/og71bL2phXVxuICogQHNlZWFsc28gb25zLXJvd1xuICogICBbZW5dVGhlIGA8b25zLXJvdz5gIGNvbXBvbmVudCBpcyB0aGUgcGFyZW50IG9mIGA8b25zLWNvbD5gLlsvZW5dXG4gKiAgIFtqYV1vbnMtcm9344Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXJvdz5cbiAqICAgPG9ucy1jb2wgd2lkdGg9XCI1MHB4XCI+PG9ucy1pY29uIGljb249XCJmYS10d2l0dGVyXCI+PC9vbnMtaWNvbj48L29ucy1jb2w+XG4gKiAgIDxvbnMtY29sPlRleHQ8L29ucy1jb2w+XG4gKiA8L29ucy1yb3c+XG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIHZlcnRpY2FsLWFsaWduXG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1WZXJ0aWNhbCBhbGlnbm1lbnQgb2YgdGhlIGNvbHVtbi4gVmFsaWQgdmFsdWVzIGFyZSBcInRvcFwiLCBcImNlbnRlclwiLCBhbmQgXCJib3R0b21cIi5bL2VuXVxuICogICBbamFd57im44Gu6YWN572u44KS5oyH5a6a44GZ44KL44CCXCJ0b3BcIiwgXCJjZW50ZXJcIiwgXCJib3R0b21cIuOBruOBhOOBmuOCjOOBi+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIHdpZHRoXG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1UaGUgd2lkdGggb2YgdGhlIGNvbHVtbi4gVmFsaWQgdmFsdWVzIGFyZSBjc3Mgd2lkdGggdmFsdWVzIChcIjEwJVwiLCBcIjUwcHhcIikuWy9lbl1cbiAqICAgW2phXeOCq+ODqeODoOOBruaoquW5heOCkuaMh+WumuOBmeOCi+OAguODkeODvOOCu+ODs+ODiOOCguOBl+OBj+OBr+ODlOOCr+OCu+ODq+OBp+aMh+WumuOBl+OBvuOBme+8iDEwJeOChDUwcHjvvInjgIJbL2phXVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2xFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBpZiAodGhpcy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVdpZHRoKCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnd2lkdGgnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgaWYgKG5hbWUgPT09ICd3aWR0aCcpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVdpZHRoKCk7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZVdpZHRoKCkge1xuICAgIGxldCB3aWR0aCA9IHRoaXMuZ2V0QXR0cmlidXRlKCd3aWR0aCcpO1xuICAgIGlmICghd2lkdGgpIHtcbiAgICAgIHN0eWxlci5jbGVhcih0aGlzLCAnZmxleCBtYXhXaWR0aCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aWR0aCA9IHdpZHRoLnRyaW0oKS5tYXRjaCgvXlxcZCskLykgPyB3aWR0aCArICclJyA6IHdpZHRoO1xuXG4gICAgICBzdHlsZXIodGhpcywge1xuICAgICAgICBmbGV4OiAnMCAwICcgKyB3aWR0aCxcbiAgICAgICAgbWF4V2lkdGg6IHdpZHRoXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxub25zRWxlbWVudHMuQ29sID0gQ29sRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWNvbCcsIENvbEVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi8uLi9vbnMvYW5pbWl0LmpzJztcbmltcG9ydCBCYXNlQW5pbWF0b3IgZnJvbSAnLi4vLi4vb25zL2Jhc2UtYW5pbWF0b3IuanMnO1xuXG5leHBvcnQgY2xhc3MgRGlhbG9nQW5pbWF0b3IgZXh0ZW5kcyBCYXNlQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnbGluZWFyJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMn0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIHNob3coZGlhbG9nLCBkb25lKSB7XG4gICAgZG9uZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAqL1xuICBoaWRlKGRpYWxvZywgZG9uZSkge1xuICAgIGRvbmUoKTtcbiAgfVxufVxuXG4vKipcbiAqIEFuZHJvaWQgc3R5bGUgYW5pbWF0b3IgZm9yIGRpYWxvZy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFuZHJvaWREaWFsb2dBbmltYXRvciBleHRlbmRzIERpYWxvZ0FuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2Vhc2UtaW4tb3V0JywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuM30gPSB7fSkge1xuICAgIHN1cGVyKHt0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbn0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNob3coZGlhbG9nLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9tYXNrLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoeyBvcGFjaXR5OiAwIH0sIHsgb3BhY2l0eTogMSB9KSxcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fZGlhbG9nLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNjAlLCAwKScsIG9wYWNpdHk6IDAgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApJywgb3BhY2l0eTogMSB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZShkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDEgfSwgeyBvcGFjaXR5OiAwIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2csIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApJywgb3BhY2l0eTogMSB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTUwJSwgLTYwJSwgMCknLCBvcGFjaXR5OiAwIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIGlPUyBzdHlsZSBhbmltYXRvciBmb3IgZGlhbG9nLlxuICovXG5leHBvcnQgY2xhc3MgSU9TRGlhbG9nQW5pbWF0b3IgZXh0ZW5kcyBEaWFsb2dBbmltYXRvciB7XG5cbiAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdlYXNlLWluLW91dCcsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjJ9ID0ge30pIHtcbiAgICBzdXBlcih7dGltaW5nLCBkZWxheSwgZHVyYXRpb259KTtcblxuICAgIHRoaXMuYm9keUhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OyAvLyBhdm9pZCBGb3JjZWQgU3luY2hyb25vdXMgTGF5b3V0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgc2hvdyhkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDAgfSwgeyBvcGFjaXR5OiAxIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2csIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKC01MCUsICR7dGhpcy5ib2R5SGVpZ2h0IC8gMi4wIC0gMX1weCwgMClgIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKScgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkaWFsb2dcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGhpZGUoZGlhbG9nLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9tYXNrLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoeyBvcGFjaXR5OiAxIH0sIHsgb3BhY2l0eTogMCB9KSxcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fZGlhbG9nLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKScgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKC01MCUsICR7dGhpcy5ib2R5SGVpZ2h0IC8gMi4wIC0gMX1weCwgMClgIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFNsaWRlIGFuaW1hdG9yIGZvciBkaWFsb2cuXG4gKi9cbmV4cG9ydCBjbGFzcyBTbGlkZURpYWxvZ0FuaW1hdG9yIGV4dGVuZHMgRGlhbG9nQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjQsIDEpJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMn0gPSB7fSkge1xuICAgIHN1cGVyKHt0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbn0pO1xuXG4gICAgdGhpcy5ib2R5SGVpZ2h0ID0gZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQ7IC8vIGF2b2lkIEZvcmNlZCBTeW5jaHJvbm91cyBMYXlvdXRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGlhbG9nXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzaG93KGRpYWxvZywgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGRpYWxvZy5fbWFzaywgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KHsgb3BhY2l0eTogMCB9LCB7IG9wYWNpdHk6IDEgfSksXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX2RpYWxvZywgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBhdm9pZCBGb3JjZWQgU3luY2hyb25vdXMgTGF5b3V0LiBPdGhlcndpc2UsIGZhZGUgYW5pbWF0aW9uIG9mIG1hc2sgd2lsbCBiZSBicm9rZW4uXG4gICAgICAgICAgeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgtNTAlLCAkey0gKHRoaXMuYm9keUhlaWdodCAvIDIuMCkgKyAxIC0gZGlhbG9nLl9kaWFsb2cuY2xpZW50SGVpZ2h0fXB4LCAwKWAgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApJyB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGRpYWxvZ1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZShkaWFsb2csIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChkaWFsb2cuX21hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDEgfSwgeyBvcGFjaXR5OiAwIH0pLFxuXG4gICAgICBhbmltaXQoZGlhbG9nLl9kaWFsb2csIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC01MCUsIC01MCUsIDApJyB9LFxuICAgICAgICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBhdm9pZCBGb3JjZWQgU3luY2hyb25vdXMgTGF5b3V0LiBPdGhlcndpc2UsIGZhZGUgYW5pbWF0aW9uIG9mIG1hc2sgd2lsbCBiZSBicm9rZW4uXG4gICAgICAgICAgeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgtNTAlLCAkey0gKHRoaXMuYm9keUhlaWdodCAvIDIuMCkgKyAxIC0gZGlhbG9nLl9kaWFsb2cuY2xpZW50SGVpZ2h0fXB4LCAwKWAgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBBbmltYXRvckZhY3RvcnkgZnJvbSAnLi4vb25zL2ludGVybmFsL2FuaW1hdG9yLWZhY3RvcnkuanMnO1xuaW1wb3J0IHsgRGlhbG9nQW5pbWF0b3IsIElPU0RpYWxvZ0FuaW1hdG9yLCBBbmRyb2lkRGlhbG9nQW5pbWF0b3IsIFNsaWRlRGlhbG9nQW5pbWF0b3IgfSBmcm9tICcuL29ucy1kaWFsb2cvYW5pbWF0b3IuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL29ucy9wbGF0Zm9ybS5qcyc7XG5pbXBvcnQgQmFzZURpYWxvZ0VsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZGlhbG9nLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcuZGlhbG9nJzogJ2RpYWxvZy0tKicsXG4gICcuZGlhbG9nLWNvbnRhaW5lcic6ICdkaWFsb2ctY29udGFpbmVyLS0qJyxcbiAgJy5kaWFsb2ctbWFzayc6ICdkaWFsb2ctbWFzay0tKidcbn07XG5cbmNvbnN0IF9hbmltYXRvckRpY3QgPSB7XG4gICdkZWZhdWx0JzogZnVuY3Rpb24gKCkgeyByZXR1cm4gIHBsYXRmb3JtLmlzQW5kcm9pZCgpID8gQW5kcm9pZERpYWxvZ0FuaW1hdG9yIDogSU9TRGlhbG9nQW5pbWF0b3I7IH0sXG4gICdzbGlkZSc6IFNsaWRlRGlhbG9nQW5pbWF0b3IsXG4gICdub25lJzogRGlhbG9nQW5pbWF0b3Jcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWRpYWxvZ1xuICogQGNhdGVnb3J5IGRpYWxvZ1xuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBEaWFsb2cgdGhhdCBpcyBkaXNwbGF5ZWQgb24gdG9wIG9mIGN1cnJlbnQgc2NyZWVuLiBBcyBvcHBvc2VkIHRvIHRoZSBgPG9ucy1hbGVydC1kaWFsb2c+YCBlbGVtZW50LCB0aGlzIGNvbXBvbmVudCBjYW4gY29udGFpbiBhbnkga2luZCBvZiBjb250ZW50LlxuICpcbiAqICAgICBUbyB1c2UgdGhlIGVsZW1lbnQgaXQgY2FuIGVpdGhlciBiZSBhdHRhY2hlZCBkaXJlY3RseSB0byB0aGUgYDxib2R5PmAgZWxlbWVudCBvciBkeW5hbWljYWxseSBjcmVhdGVkIGZyb20gYSB0ZW1wbGF0ZSB1c2luZyB0aGUgYG9ucy5jcmVhdGVEaWFsb2codGVtcGxhdGUpYCB1dGlsaXR5IGZ1bmN0aW9uIGFuZCB0aGUgYDx0ZW1wbGF0ZT5gIHRhZy5cbiAqXG4gKiAgICAgVGhlIGRpYWxvZyBpcyB1c2VmdWwgZm9yIGRpc3BsYXlpbmcgbWVudXMsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgdG8gYXNrIHRoZSB1c2VyIHRvIG1ha2UgYSBkZWNpc2lvbi5cbiAqXG4gKiAgICAgSXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRpc3BsYXllZCBhcyBNYXRlcmlhbCBEZXNpZ24gd2hlbiBydW5uaW5nIG9uIGFuIEFuZHJvaWQgZGV2aWNlLlxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogICBbZW5dRGlzcGxheSBhIE1hdGVyaWFsIERlc2lnbiBkaWFsb2cuWy9lbl1cbiAqICAgW2phXeODnuODhuODquOCouODq+ODh+OCtuOCpOODs+OBruODgOOCpOOCouODreOCsOOCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAY29kZXBlbiB6eHhhR2FcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9kaWFsb2dcbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjbW9kaWZpZXJzIFtlbl1Nb3JlIGRldGFpbHMgYWJvdXQgdGhlIGBtb2RpZmllcmAgYXR0cmlidXRlWy9lbl1bamFdbW9kaWZpZXLlsZ7mgKfjga7kvb/jgYTmlrlbL2phXVxuICogQHNlZWFsc28gb25zLWFsZXJ0LWRpYWxvZ1xuICogICBbZW5dYDxvbnMtYWxlcnQtZGlhbG9nPmAgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1hbGVydC1kaWFsb2fjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLXBvcG92ZXJcbiAqICAgW2VuXWA8b25zLXBvcG92ZXI+YCBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLXBvcG92ZXLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLW1vZGFsXG4gKiAgIFtlbl1gPG9ucy1tb2RhbD5gIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtbW9kYWzjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtZGlhbG9nIGlkPVwiZGlhbG9nXCI+XG4gKiAgIDxwPlRoaXMgaXMgYSBkaWFsb2chPC9wPlxuICogPC9vbnMtZGlhbG9nPlxuICpcbiAqIDxzY3JpcHQ+XG4gKiAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaWFsb2cnKS5zaG93KCk7XG4gKiA8L3NjcmlwdD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGlhbG9nRWxlbWVudCBleHRlbmRzIEJhc2VEaWFsb2dFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IHByZXNob3dcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCBqdXN0IGJlZm9yZSB0aGUgZGlhbG9nIGlzIGRpc3BsYXllZC5bL2VuXVxuICAgKiBbamFd44OA44Kk44Ki44Ot44Kw44GM6KGo56S644GV44KM44KL55u05YmN44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmRpYWxvZ1xuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNhbmNlbFxuICAgKiAgIFtlbl1FeGVjdXRlIHRoaXMgZnVuY3Rpb24gdG8gc3RvcCB0aGUgZGlhbG9nIGZyb20gYmVpbmcgc2hvd24uWy9lbl1cbiAgICogICBbamFd44GT44Gu6Zai5pWw44KS5a6f6KGM44GZ44KL44Go44CB44OA44Kk44Ki44Ot44Kw44Gu6KGo56S644GM44Kt44Oj44Oz44K744Or44GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0c2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIGRpYWxvZyBpcyBkaXNwbGF5ZWQuWy9lbl1cbiAgICogW2phXeODgOOCpOOCouODreOCsOOBjOihqOekuuOBleOCjOOBn+ebtOW+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5kaWFsb2dcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHByZWhpZGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCBqdXN0IGJlZm9yZSB0aGUgZGlhbG9nIGlzIGhpZGRlbi5bL2VuXVxuICAgKiBbamFd44OA44Kk44Ki44Ot44Kw44GM6Zqg44KM44KL55u05YmN44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmRpYWxvZ1xuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNhbmNlbFxuICAgKiAgIFtlbl1FeGVjdXRlIHRoaXMgZnVuY3Rpb24gdG8gc3RvcCB0aGUgZGlhbG9nIGZyb20gYmVpbmcgaGlkZGVuLlsvZW5dXG4gICAqICAgW2phXeOBk+OBrumWouaVsOOCkuWun+ihjOOBmeOCi+OBqOOAgeODgOOCpOOCouODreOCsOOBrumdnuihqOekuuOBjOOCreODo+ODs+OCu+ODq+OBleOCjOOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdGhpZGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCBqdXN0IGFmdGVyIHRoZSBkaWFsb2cgaXMgaGlkZGVuLlsvZW5dXG4gICAqIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzpmqDjgozjgZ/lvozjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQuZGlhbG9nXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBkaWFsb2djYW5jZWxcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCB3aGVuIHRoZSBkaWFsb2cgaXMgY2FuY2VsZWQuWy9lbl1cbiAgICogW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBkaWFsb2cuWy9lbl1cbiAgICogIFtqYV3jg4DjgqTjgqLjg63jgrDjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBjYW5jZWxhYmxlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgZGlhbG9nIGNhbiBiZSBjbG9zZWQgYnkgdGFwcGluZyB0aGUgYmFja2dyb3VuZCBvciBieSBwcmVzc2luZyB0aGUgYmFjayBidXR0b24gb24gQW5kcm9pZCBkZXZpY2VzLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSBkaWFsb2cgaXMgZGlzYWJsZWQuWy9lbl1cbiAgICogIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovmmYLjgIHjg4DjgqTjgqLjg63jgrDjga9kaXNhYmxlZOeKtuaFi+OBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCBkZWZhdWx0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhbmltYXRpb24gdXNlZCB3aGVuIHNob3dpbmcgYW5kIGhpZGluZyB0aGUgZGlhbG9nLiBDYW4gYmUgZWl0aGVyIGBcIm5vbmVcImAgb3IgYFwiZGVmYXVsdFwiYC5bL2VuXVxuICAgKiAgW2phXeODgOOCpOOCouODreOCsOOCkuihqOekuuOBmeOCi+mam+OBruOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglwibm9uZVwi44KC44GX44GP44GvXCJkZWZhdWx0XCLjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb24tb3B0aW9uc1xuICAgKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgIJlLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAguS+i++8mntkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbWFzay1jb2xvclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCByZ2JhKDAsIDAsIDAsIDAuMilcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dQ29sb3Igb2YgdGhlIGJhY2tncm91bmQgbWFzay4gRGVmYXVsdCBpcyBgXCJyZ2JhKDAsIDAsIDAsIDAuMilcImAuWy9lbl1cbiAgICogIFtqYV3og4zmma/jga7jg57jgrnjgq/jga7oibLjgpLmjIflrprjgZfjgb7jgZnjgIJcInJnYmEoMCwgMCwgMCwgMC4yKVwi44GM44OH44OV44Kp44Or44OI5YCk44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdmlzaWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGRpYWxvZyBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG4gIH1cblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4gc2NoZW1lO1xuICB9XG5cbiAgZ2V0IF9tYXNrKCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLmRpYWxvZy1tYXNrJyk7XG4gIH1cblxuICBnZXQgX2RpYWxvZygpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5kaWFsb2cnKTtcbiAgfVxuXG4gIF91cGRhdGVBbmltYXRvckZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIG5ldyBBbmltYXRvckZhY3Rvcnkoe1xuICAgICAgYW5pbWF0b3JzOiBfYW5pbWF0b3JEaWN0LFxuICAgICAgYmFzZUNsYXNzOiBEaWFsb2dBbmltYXRvcixcbiAgICAgIGJhc2VDbGFzc05hbWU6ICdEaWFsb2dBbmltYXRvcicsXG4gICAgICBkZWZhdWx0QW5pbWF0aW9uOiB0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uJylcbiAgICB9KTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuXG4gICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuc3R5bGUuekluZGV4ID0gMTAwMDE7XG5cbiAgICAvKiBFeHBlY3RlZCByZXN1bHQ6XG4gICAgICogICA8b25zLWRpYWxvZz5cbiAgICAgKiAgICAgPGRpdiBjbGFzcz1cImRpYWxvZy1tYXNrXCI+PC9kaXY+XG4gICAgICogICAgIDxkaXYgY2xhc3M9XCJkaWFsb2dcIj5cbiAgICAgKiAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLWNvbnRhaW5lclwiPi4uLjwvZGl2PlxuICAgICAqICAgICA8L2Rpdj5cbiAgICAgKiAgIDwvb25zLWRpYWxvZz5cbiAgICAgKi9cblxuICAgIGlmICghdGhpcy5fZGlhbG9nKSB7XG4gICAgICBjb25zdCBkaWFsb2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRpYWxvZy5jbGFzc0xpc3QuYWRkKCdkaWFsb2cnKTtcblxuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZGlhbG9nLWNvbnRhaW5lcicpO1xuICAgICAgd2hpbGUgKHRoaXMuZmlyc3RDaGlsZCkge1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5maXJzdENoaWxkKTtcbiAgICAgIH1cbiAgICAgIGRpYWxvZy5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuXG4gICAgICB0aGlzLmFwcGVuZENoaWxkKGRpYWxvZyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9tYXNrKSB7XG4gICAgICBjb25zdCBtYXNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBtYXNrLmNsYXNzTGlzdC5hZGQoJ2RpYWxvZy1tYXNrJyk7XG4gICAgICB0aGlzLmluc2VydEJlZm9yZShtYXNrLCB0aGlzLmZpcnN0Q2hpbGQpO1xuICAgIH1cblxuICAgIHRoaXMuX2RpYWxvZy5zdHlsZS56SW5kZXggPSAyMDAwMTtcbiAgICB0aGlzLl9tYXNrLnN0eWxlLnpJbmRleCA9IDIwMDAwO1xuXG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3N0YXR1cy1iYXItZmlsbCcsICcnKTtcblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgdGhpcy5fc2NoZW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1CYWNrLWJ1dHRvbiBoYW5kbGVyLlsvZW5dXG4gICAqICAgW2phXeODkOODg+OCr+ODnOOCv+ODs+ODj+ODs+ODieODqeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNob3dcbiAgICogQHNpZ25hdHVyZSBzaG93KFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYFwibm9uZVwiYCBhbmQgYFwic2xpZGVcImAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCXCJub25lXCIsIFwic2xpZGVcIuOBruOBhOOBmuOCjOOBi+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIGRlbGF5LCB0aW1pbmfjgpLmjIflrprjgZfjgb7jgZnjgIJlLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YCBbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGRpYWxvZyBoYXMgYmVlbiByZXZlYWxlZC5bL2VuXVxuICAgKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzooajnpLrjgZXjgozntYLjgo/jgaPjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TaG93IHRoZSBkaWFsb2cuWy9lbl1cbiAgICogIFtqYV3jg4DjgqTjgqLjg63jgrDjgpLplovjgY3jgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlcyB0byB0aGUgZGlzcGxheWVkIGVsZW1lbnQuXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGhpZGVcbiAgICogQHNpZ25hdHVyZSBoaWRlKFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYFwibm9uZVwiYCBhbmQgYFwic2xpZGVcImAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCXCJub25lXCIsIFwic2xpZGVcIuOBruOBhOOBmuOCjOOBi+OCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIGRlbGF5LCB0aW1pbmfjgpLmjIflrprjgZfjgb7jgZnjgIJlLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YFsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1UaGlzIGZ1bmN0aW9ucyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGRpYWxvZyBoYXMgYmVlbiBoaWRkZW4uWy9lbl1cbiAgICogICBbamFd44OA44Kk44Ki44Ot44Kw44GM6Zqg44KM44Gf5b6M44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUhpZGUgdGhlIGRpYWxvZy5bL2VuXVxuICAgKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjgpLplonjgZjjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgaGlkZGVuIGVsZW1lbnRbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHZpc2libGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBkaWFsb2cgaXMgdmlzaWJsZSBvciBub3QuWy9lbl1cbiAgICogICBbamFd6KaB57Sg44GM6KaL44GI44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGRpYWxvZyBpcyBkaXNhYmxlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFd54Sh5Yq55YyW44GV44KM44Gm44GE44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBjYW5jZWxhYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZGlhbG9nIGlzIGNhbmNlbGFibGUgb3Igbm90LiBBIGNhbmNlbGFibGUgZGlhbG9nIGNhbiBiZSBjbG9zZWQgYnkgdGFwcGluZyB0aGUgYmFja2dyb3VuZCBvciBieSBwcmVzc2luZyB0aGUgYmFjayBidXR0b24gb24gQW5kcm9pZCBkZXZpY2VzLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgbWFza0NvbG9yXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IHJnYmEoMCwgMCwgMCwgMC4yKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZCBtYXNrLiBEZWZhdWx0IGlzIFwicmdiYSgwLCAwLCAwLCAwLjIpXCIuWy9lbl1cbiAgICogIFtqYV3og4zmma/jga7jg57jgrnjgq/jga7oibLjgpLmjIflrprjgZfjgb7jgZnjgIJcInJnYmEoMCwgMCwgMCwgMC4yKVwi44GM44OH44OV44Kp44Or44OI5YCk44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7RGlhbG9nQW5pbWF0b3J9IEFuaW1hdG9yXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJBbmltYXRvcihuYW1lLCBBbmltYXRvcikge1xuICAgIGlmICghKEFuaW1hdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIERpYWxvZ0FuaW1hdG9yKSkge1xuICAgICAgdXRpbC50aHJvd0FuaW1hdG9yKCdEaWFsb2cnKTtcbiAgICB9XG4gICAgX2FuaW1hdG9yRGljdFtuYW1lXSA9IEFuaW1hdG9yO1xuICB9XG5cbiAgc3RhdGljIGdldCBhbmltYXRvcnMoKSB7XG4gICAgcmV0dXJuIF9hbmltYXRvckRpY3Q7XG4gIH1cblxuICBzdGF0aWMgZ2V0IERpYWxvZ0FuaW1hdG9yKCkge1xuICAgIHJldHVybiBEaWFsb2dBbmltYXRvcjtcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5EaWFsb2cgPSBEaWFsb2dFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtZGlhbG9nJywgRGlhbG9nRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgc3R5bGVyIGZyb20gJy4uL29ucy9zdHlsZXIuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnZmFiJztcblxuY29uc3Qgc2NoZW1lID0ge1xuICAnJzogJ2ZhYi0tKicsXG4gICcuZmFiX19pY29uJzogJ2ZhYi0tKl9faWNvbidcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWZhYlxuICogQGNhdGVnb3J5IGZvcm1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgVGhlIEZsb2F0aW5nIGFjdGlvbiBidXR0b24gaXMgYSBjaXJjdWxhciBidXR0b24gZGVmaW5lZCBpbiB0aGUgW01hdGVyaWFsIERlc2lnbiBzcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5nb29nbGUuY29tL2Rlc2lnbi9zcGVjL2NvbXBvbmVudHMvYnV0dG9ucy1mbG9hdGluZy1hY3Rpb24tYnV0dG9uLmh0bWwpLiBUaGV5IGFyZSBvZnRlbiB1c2VkIHRvIHByb21vdGUgdGhlIHByaW1hcnkgYWN0aW9uIG9mIHRoZSBhcHAuXG4gKlxuICogICAgIEl0IGNhbiBiZSBkaXNwbGF5ZWQgZWl0aGVyIGFzIGFuIGlubGluZSBlbGVtZW50IG9yIGluIG9uZSBvZiB0aGUgY29ybmVycy4gTm9ybWFsbHkgaXQgd2lsbCBiZSBwb3NpdGlvbmVkIGluIHRoZSBsb3dlciByaWdodCBjb3JuZXIgb2YgdGhlIHNjcmVlbi5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvZmFiXG4gKiBAbW9kaWZpZXIgbWluaVxuICogICBbZW5dTWFrZXMgdGhlIGBvbnMtZmFiYCBzbWFsbGVyLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGd1aWRlIHRoZW1pbmcuaHRtbCNjcm9zcy1wbGF0Zm9ybS1zdHlsaW5nLWF1dG9zdHlsaW5nIFtlbl1JbmZvcm1hdGlvbiBhYm91dCBjcm9zcyBwbGF0Zm9ybSBzdHlsaW5nWy9lbl1bamFdSW5mb3JtYXRpb24gYWJvdXQgY3Jvc3MgcGxhdGZvcm0gc3R5bGluZ1svamFdXG4gKiBAc2VlYWxzbyBvbnMtc3BlZWQtZGlhbFxuICogICBbZW5dVGhlIGA8b25zLXNwZWVkLWRpYWw+YCBjb21wb25lbnQgaXMgYSBGbG9hdGluZyBhY3Rpb24gYnV0dG9uIHRoYXQgZGlzcGxheXMgYSBtZW51IHdoZW4gdGFwcGVkLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGYWJFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBidXR0b24uWy9lbl1cbiAgICogIFtqYV3jg5zjgr/jg7Pjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSByaXBwbGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgdGhlIGJ1dHRvbiB3aWxsIGhhdmUgYSByaXBwbGUgZWZmZWN0IHdoZW4gdGFwcGVkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSByaXBwbGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRoaXMgcHJvcGVydHkgaXMgZGVmaW5lZCwgdGhlIGJ1dHRvbiB3aWxsIGhhdmUgYSByaXBwbGUgZWZmZWN0IHdoZW4gdGFwcGVkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgcG9zaXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIHBvc2l0aW9uIG9mIHRoZSBidXR0b24uIFNob3VsZCBiZSBhIHN0cmluZyBsaWtlIGBcImJvdHRvbSByaWdodFwiYCBvciBgXCJ0b3AgbGVmdFwiYC4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IGRlZmluZWQgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgYW4gaW5saW5lIGVsZW1lbnQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSBpZiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLlsvZW5dXG4gICAqICAgW2phXeODnOOCv+ODs+OCkueEoeWKueWMluOBmeOCi+WgtOWQiOOBr+aMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBUaGUgZm9sbG93aW5nIHN0YXRlbWVudHMgY2FuIGJlIGV4ZWN1dGVkIGJlZm9yZSBjb250ZW50UmVhZHlcbiAgICAvLyBzaW5jZSB0aGVzZSBkbyBub3QgYWNjZXNzIHRoZSBjaGlsZHJlblxuICAgIHRoaXMuX2hpZGUoKTtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fY29tcGlsZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG5cbiAgICBpZiAoIXV0aWwuZmluZENoaWxkKHRoaXMsICcuZmFiX19pY29uJykpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ2ZhYl9faWNvbicpO1xuXG4gICAgICB1dGlsLmFycmF5RnJvbSh0aGlzLmNoaWxkTm9kZXMpLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIGlmICghZWxlbWVudC50YWdOYW1lIHx8IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnb25zLXJpcHBsZScpIHtcbiAgICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlUmlwcGxlKCk7XG5cbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG5cbiAgICB0aGlzLl91cGRhdGVQb3NpdGlvbigpO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuX3Nob3coKSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydtb2RpZmllcicsICdyaXBwbGUnLCAncG9zaXRpb24nLCAnY2xhc3MnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIGRlZmF1bHRDbGFzc05hbWUsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyaXBwbGUnOlxuICAgICAgICB0aGlzLl91cGRhdGVSaXBwbGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwb3NpdGlvbic6XG4gICAgICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIF9zaG93KCkge1xuICAgIGlmICghdGhpcy5fbWFudWFsbHlIaWRkZW4pIHsgLy8gaWYgdXNlciBoYXMgbm90IGNhbGxlZCBvbnMtZmFiLmhpZGUoKVxuICAgICAgdGhpcy5fdG9nZ2xlKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIF9oaWRlKCkge1xuICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLl90b2dnbGUoZmFsc2UpKTtcbiAgfVxuXG4gIF91cGRhdGVSaXBwbGUoKSB7XG4gICAgdXRpbC51cGRhdGVSaXBwbGUodGhpcyk7XG4gIH1cblxuICBfdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldEF0dHJpYnV0ZSgncG9zaXRpb24nKTtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICAnZmFiLS10b3BfX2xlZnQnLFxuICAgICAgJ2ZhYi0tYm90dG9tX19yaWdodCcsXG4gICAgICAnZmFiLS1ib3R0b21fX2xlZnQnLFxuICAgICAgJ2ZhYi0tdG9wX19yaWdodCcsXG4gICAgICAnZmFiLS10b3BfX2NlbnRlcicsXG4gICAgICAnZmFiLS1ib3R0b21fX2NlbnRlcicpO1xuICAgIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICAgIGNhc2UgJ3RvcCByaWdodCc6XG4gICAgICBjYXNlICdyaWdodCB0b3AnOlxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2ZhYi0tdG9wX19yaWdodCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcCBsZWZ0JzpcbiAgICAgIGNhc2UgJ2xlZnQgdG9wJzpcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdmYWItLXRvcF9fbGVmdCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSByaWdodCc6XG4gICAgICBjYXNlICdyaWdodCBib3R0b20nOlxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2ZhYi0tYm90dG9tX19yaWdodCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSBsZWZ0JzpcbiAgICAgIGNhc2UgJ2xlZnQgYm90dG9tJzpcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdmYWItLWJvdHRvbV9fbGVmdCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NlbnRlciB0b3AnOlxuICAgICAgY2FzZSAndG9wIGNlbnRlcic6XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnZmFiLS10b3BfX2NlbnRlcicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NlbnRlciBib3R0b20nOlxuICAgICAgY2FzZSAnYm90dG9tIGNlbnRlcic6XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnZmFiLS1ib3R0b21fX2NlbnRlcicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNob3dcbiAgICogQHNpZ25hdHVyZSBzaG93KClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU2hvdyB0aGUgZmxvYXRpbmcgYWN0aW9uIGJ1dHRvbi5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuICBzaG93KCkge1xuICAgIHRoaXMudG9nZ2xlKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaGlkZVxuICAgKiBAc2lnbmF0dXJlIGhpZGUoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1IaWRlIHRoZSBmbG9hdGluZyBhY3Rpb24gYnV0dG9uLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIGhpZGUoKSB7XG4gICAgdGhpcy50b2dnbGUoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdG9nZ2xlXG4gICAqIEBzaWduYXR1cmUgdG9nZ2xlKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRvZ2dsZSB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgYnV0dG9uLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICB0b2dnbGUoYWN0aW9uID0gIXRoaXMudmlzaWJsZSkge1xuICAgIHRoaXMuX21hbnVhbGx5SGlkZGVuID0gIWFjdGlvbjtcbiAgICB0aGlzLl90b2dnbGUoYWN0aW9uKTtcbiAgfVxuXG4gIF90b2dnbGUoYWN0aW9uID0gIXRoaXMudmlzaWJsZSkge1xuICAgIGNvbnN0IGlzQm90dG9tID0gKHRoaXMuZ2V0QXR0cmlidXRlKCdwb3NpdGlvbicpIHx8ICcnKS5pbmRleE9mKCdib3R0b20nKSA+PSAwO1xuICAgIGNvbnN0IHRyYW5zbGF0ZSA9IGlzQm90dG9tID8gYHRyYW5zbGF0ZTNkKDBweCwgLSR7dXRpbC5nbG9iYWxzLmZhYk9mZnNldCB8fCAwfXB4LCAwcHgpYCA6ICcnO1xuXG4gICAgc3R5bGVyKHRoaXMsIHsgdHJhbnNmb3JtOiBgJHt0cmFuc2xhdGV9IHNjYWxlKCR7TnVtYmVyKGFjdGlvbil9KWAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFd54Sh5Yq55YyW44GV44KM44Gm44GE44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2aXNpYmxlXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBvciBub3QuWy9lbl1cbiAgICogICBbamFd6KaB57Sg44GM6KaL44GI44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG4gIGdldCB2aXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnN0eWxlLnRyYW5zZm9ybS5pbmRleE9mKCdzY2FsZSgwKScpID09PSAtMSAmJiB0aGlzLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJztcbiAgfVxufVxuXG51dGlsLmRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzKEZhYkVsZW1lbnQsIFsnZGlzYWJsZWQnLCAncmlwcGxlJ10pO1xuXG5vbnNFbGVtZW50cy5GYWIgPSBGYWJFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtZmFiJywgRmFiRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBHZXN0dXJlRGV0ZWN0b3IgZnJvbSAnLi4vb25zL2dlc3R1cmUtZGV0ZWN0b3IuanMnO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1nZXN0dXJlLWRldGVjdG9yXG4gKiBAY2F0ZWdvcnkgZ2VzdHVyZVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBDb21wb25lbnQgdG8gZGV0ZWN0IGZpbmdlciBnZXN0dXJlcyB3aXRoaW4gdGhlIHdyYXBwZWQgZWxlbWVudC4gRm9sbG93aW5nIGdlc3R1cmVzIGFyZSBzdXBwb3J0ZWQ6XG4gKiAgICAgLSBEcmFnIGdlc3R1cmVzOiBgZHJhZ2AsIGBkcmFnbGVmdGAsIGBkcmFncmlnaHRgLCBgZHJhZ3VwYCwgYGRyYWdkb3duYFxuICogICAgIC0gSG9sZCBnZXN0dXJlczogYGhvbGRgLCBgcmVsZWFzZWBcbiAqICAgICAtIFN3aXBlIGdlc3R1cmVzOiBgc3dpcGVgLCBgc3dpcGVsZWZ0YCwgYHN3aXBlcmlnaHRgLCBgc3dpcGV1cGAsIGBzd2lwZWRvd25gXG4gKiAgICAgLSBUYXAgZ2VzdHVyZXM6IGB0YXBgLCBgZG91YmxldGFwYFxuICogICAgIC0gUGluY2ggZ2VzdHVyZXM6IGBwaW5jaGAsIGBwaW5jaGluYCwgYHBpbmNob3V0YFxuICogICAgIC0gT3RoZXIgZ2VzdHVyZXM6IGB0b3VjaGAsIGB0cmFuc2Zvcm1gLCBgcm90YXRlYFxuICogICBbL2VuXVxuICogICBbamFd6KaB57Sg5YaF44Gu44K444Kn44K544OB44Oj44O85pON5L2c44KS5qSc55+l44GX44G+44GZ44CC6Kmz44GX44GP44Gv44Ks44Kk44OJ44KS5Y+C54Wn44GX44Gm44GP44Gg44GV44GE44CCWy9qYV1cbiAqIEBndWlkZSBmZWF0dXJlcy5odG1sI2dlc3R1cmUtZGV0ZWN0aW9uXG4gKiAgIFtlbl1EZXRlY3RpbmcgZmluZ2VyIGdlc3R1cmVzWy9lbl1cbiAqICAgW2phXeOCuOOCp+OCueODgeODo+ODvOaTjeS9nOOBruaknOefpVsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1nZXN0dXJlLWRldGVjdG9yPlxuICogICA8ZGl2IGlkPVwiZGV0ZWN0LWFyZWFcIiBzdHlsZT1cIndpZHRoOiAxMDBweDsgaGVpZ2h0OiAxMDBweDtcIj5cbiAqICAgICBTd2lwZSBIZXJlXG4gKiAgIDwvZGl2PlxuICogPC9vbnMtZ2VzdHVyZS1kZXRlY3Rvcj5cbiAqXG4gKiA8c2NyaXB0PlxuICogICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzd2lwZWxlZnQnLCBmdW5jdGlvbihldmVudCkge1xuICogICAgIGlmIChldmVudC50YXJnZXQubWF0Y2hlcygnI2RldGVjdC1hcmVhJykpIHtcbiAqICAgICAgIGNvbnNvbGUubG9nKCdTd2lwZSBsZWZ0IGlzIGRldGVjdGVkLicpO1xuICogICAgIH1cbiAqICAgfSk7XG4gKiA8L3NjcmlwdD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2VzdHVyZURldGVjdG9yRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2dlc3R1cmVEZXRlY3RvciA9IG5ldyBHZXN0dXJlRGV0ZWN0b3IodGhpcywgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLkdlc3R1cmVEZXRlY3RvciA9IEdlc3R1cmVEZXRlY3RvckVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1nZXN0dXJlLWRldGVjdG9yJywgR2VzdHVyZURldGVjdG9yRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxubGV0IGF1dG9QcmVmaXggPSAnZmEnOyAvLyBGSVhNRTogVG8gYmUgcmVtb3ZlZCBpbiB2M1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1pY29uXG4gKiBAY2F0ZWdvcnkgdmlzdWFsXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIERpc3BsYXlzIGFuIGljb24uIFRoZSBmb2xsb3dpbmcgaWNvbiBzdWl0ZXMgYXJlIGF2YWlsYWJsZTpcbiAqXG4gKiAgICAgKiBbRm9udCBBd2Vzb21lXShodHRwczovL2ZvcnRhd2Vzb21lLmdpdGh1Yi5pby9Gb250LUF3ZXNvbWUvKVxuICogICAgICogW0lvbmljb25zXShodHRwOi8vaW9uaWNvbnMuY29tLylcbiAqICAgICAqIFtNYXRlcmlhbCBEZXNpZ24gSWNvbmljIEZvbnRdKGh0dHA6Ly96YXZvbG9rbG9tLmdpdGh1Yi5pby9tYXRlcmlhbC1kZXNpZ24taWNvbmljLWZvbnQvKVxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBjb2RlcGVuIHhBaHZnXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvaWNvblxuICogQGd1aWRlIHRoZW1pbmcuaHRtbCNjcm9zcy1wbGF0Zm9ybS1zdHlsaW5nLWF1dG9zdHlsaW5nIFtlbl1JbmZvcm1hdGlvbiBhYm91dCBjcm9zcyBwbGF0Zm9ybSBzdHlsaW5nWy9lbl1bamFdWy9qYV1cbiAqIEBndWlkZSBhcHBzaXplLmh0bWwjcmVtb3ZpbmctaWNvbi1wYWNrcyBbZW5dUmVtb3ZpbmcgaWNvbiBwYWNrcy5bL2VuXVtqYV1bL2phXVxuICogQGd1aWRlIGZhcS5odG1sI2hvdy1jYW4taS11c2UtY3VzdG9tLWljb24tcGFja3MgW2VuXUFkZGluZyBjdXN0b20gaWNvbiBwYWNrcy5bL2VuXVtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtaWNvblxuICogICBpY29uPVwibWQtY2FyXCJcbiAqICAgc2l6ZT1cIjIwcHhcIlxuICogICBzdHlsZT1cImNvbG9yOiByZWRcIj5cbiAqIDwvb25zLWljb24+XG4gKlxuICogPG9ucy1idXR0b24+XG4gKiAgIDxvbnMtaWNvbiBpY29uPVwibWQtY2FyXCI+PC9vbnMtaWNvbj5cbiAqICAgQ2FyXG4gKiA8L29ucy1idXR0b24+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEljb25FbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGljb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgVGhlIGljb24gbmFtZS4gYFwibWQtXCJgIHByZWZpeCBmb3IgTWF0ZXJpYWwgSWNvbnMsIGBcImZhLVwiYCBmb3IgRm9udCBBd2Vzb21lIGFuZCBgXCJpb24tXCJgIHByZWZpeCBmb3IgSW9uaWNvbnMuXG4gICAqXG4gICAqICAgICBTZWUgYWxsIGF2YWlsYWJsZSBpY29ucyBvbiB0aGUgZWxlbWVudCBkZXNjcmlwdGlvbiAoYXQgdGhlIHRvcCkuXG4gICAqXG4gICAqICAgICBJY29ucyBjYW4gYWxzbyBiZSBzdHlsZWQgYmFzZWQgb24gbW9kaWZpZXIgcHJlc2VuY2UuIEFkZCBjb21tYS1zZXBhcmF0ZWQgaWNvbnMgd2l0aCBgXCJtb2RpZmllck5hbWU6XCJgIHByZWZpeC5cbiAgICpcbiAgICogICAgIFRoZSBjb2RlIGA8b25zLWljb24gaWNvbj1cImlvbi1lZGl0LCBtYXRlcmlhbDptZC1lZGl0XCI+PC9vbnMtaWNvbj5gIHdpbGwgZGlzcGxheSBgXCJtZC1lZGl0XCJgIGZvciBNYXRlcmlhbCBEZXNpZ24gYW5kIGBcImlvbi1lZGl0XCJgIGFzIHRoZSBkZWZhdWx0IGljb24uXG4gICAqXG4gICAqICAgICBgZmEtYCBwcmVmaXggaXMgYWRkZWQgYXV0b21hdGljYWxseSBpZiBub25lIGlzIHByb3ZpZGVkLiBDaGVjayBbU2VlIGFsc29dKCNzZWVhbHNvKSBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHNpemVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgVGhlIHNpemVzIG9mIHRoZSBpY29uLiBWYWxpZCB2YWx1ZXMgYXJlIGxnLCAyeCwgM3gsIDR4LCA1eCwgb3IgaW4gdGhlIHNpemUgaW4gcGl4ZWxzLlxuICAgKiAgICAgSWNvbnMgY2FuIGFsc28gYmUgc3R5bGVkIGJhc2VkIG9uIG1vZGlmaWVyIHByZXNlbmNlLiBBZGQgY29tbWEtc2VwYXJhdGVkIGljb25zIHdpdGggYFwibW9kaWZpZXJOYW1lOlwiYCBwcmVmaXguXG4gICAqXG4gICAqICAgICBUaGUgY29kZTpcbiAgICpcbiAgICogICAgIGBgYFxuICAgKiAgICAgPG9ucy1pY29uXG4gICAqICAgICAgIGljb249XCJpb24tZWRpdFwiXG4gICAqICAgICAgIHNpemU9XCIzMnB4LCBtYXRlcmlhbDoyNHB4XCI+XG4gICAqICAgICA8L29ucy1pY29uPlxuICAgKiAgICAgYGBgXG4gICAqXG4gICAqICAgICB3aWxsIHJlbmRlciBhcyBhIGAyNHB4YCBpY29uIGlmIHRoZSBgXCJtYXRlcmlhbFwiYCBtb2RpZmllciBpcyBwcmVzZW50IGFuZCBgMzJweGAgb3RoZXJ3aXNlLlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHJvdGF0ZVxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dTnVtYmVyIG9mIGRlZ3JlZXMgdG8gcm90YXRlIHRoZSBpY29uLiBWYWxpZCB2YWx1ZXMgYXJlIDkwLCAxODAgYW5kIDI3MC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjgqTjgrPjg7PjgpLlm57ou6LjgZfjgabooajnpLrjgZfjgb7jgZnjgII5MCwgMTgwLCAyNzDjgYvjgonmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBmaXhlZC13aWR0aFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dV2hlbiB1c2VkIGluIGEgbGlzdCwgeW91IHdhbnQgdGhlIGljb25zIHRvIGhhdmUgdGhlIHNhbWUgd2lkdGggc28gdGhhdCB0aGV5IGFsaWduIHZlcnRpY2FsbHkgYnkgZGVmaW5pbmcgdGhpcyBhdHRyaWJ1dGUuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGZpeGVkV2lkdGhcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVdoZW4gdXNlZCBpbiBhIGxpc3QsIHlvdSB3YW50IHRoZSBpY29ucyB0byBoYXZlIHRoZSBzYW1lIHdpZHRoIHNvIHRoYXQgdGhleSBhbGlnbiB2ZXJ0aWNhbGx5IGJ5IGRlZmluaW5nIHRoaXMgYXR0cmlidXRlLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgc3BpblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB3aGV0aGVyIHRoZSBpY29uIHNob3VsZCBiZSBzcGlubmluZy5bL2VuXVxuICAgKiAgIFtqYV3jgqLjgqTjgrPjg7PjgpLlm57ou6LjgZnjgovjgYvjganjgYbjgYvjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHNwaW5cbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IHdoZXRoZXIgdGhlIGljb24gc2hvdWxkIGJlIHNwaW5uaW5nLlsvZW5dXG4gICAqICAgW2phXeOCouOCpOOCs+ODs+OCkuWbnui7ouOBmeOCi+OBi+OBqeOBhuOBi+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fY29tcGlsZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnaWNvbicsICdzaXplJywgJ21vZGlmaWVyJywgJ2NsYXNzJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHRoaXMuX2NsZWFuQ2xhc3NBdHRyaWJ1dGUobmFtZSA9PT0gJ2ljb24nID8gbGFzdCA6IHRoaXMuZ2V0QXR0cmlidXRlKCdpY29uJyksIG5hbWUgPT09ICdtb2RpZmllcicgPyBsYXN0IDogdW5kZWZpbmVkKTtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuICAgIHRoaXMuX3VwZGF0ZSgpO1xuICB9XG5cbiAgX3VwZGF0ZSgpIHtcbiAgICBjb25zdCB7Y2xhc3NMaXN0LCBzdHlsZX0gPSB0aGlzLl9idWlsZENsYXNzQW5kU3R5bGUodGhpcy5fcGFyc2VBdHRyKCdpY29uJyksIHRoaXMuX3BhcnNlQXR0cignc2l6ZScpKTtcbiAgICB1dGlsLmV4dGVuZCh0aGlzLnN0eWxlLCBzdHlsZSk7XG5cbiAgICBjbGFzc0xpc3QuZm9yRWFjaChjbGFzc05hbWUgPT4gdGhpcy5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSkpO1xuICB9XG5cbiAgX3BhcnNlQXR0cihhdHRyTmFtZSwgbW9kaWZpZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKSB8fCAnJykge1xuICAgIGNvbnN0IGF0dHIgPSB0aGlzLmdldEF0dHJpYnV0ZShhdHRyTmFtZSkgfHwgYXR0ck5hbWUgfHwgJyc7XG4gICAgY29uc3QgcGFydHMgPSBhdHRyLnNwbGl0KC9cXHMqLFxccyovKTtcbiAgICBjb25zdCBkZWYgPSBwYXJ0c1swXTtcbiAgICBsZXQgbWQgPSBwYXJ0c1sxXTtcbiAgICBtZCA9IChtZCB8fCAnJykuc3BsaXQoL1xccyo6XFxzKi8pO1xuXG4gICAgcmV0dXJuIChtb2RpZmllciAmJiAoUmVnRXhwKGAoXnxcXFxccyspJHttZFswXX0oJHxcXFxccyspYCwgJ2knKS50ZXN0KG1vZGlmaWVyKSkgPyBtZFsxXSA6IGRlZikgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHVubmVlZGVkIGNsYXNzIHZhbHVlLlxuICAgKi9cbiAgX2NsZWFuQ2xhc3NBdHRyaWJ1dGUobGFzdEljb24sIGxhc3RNb2RpZmllcikge1xuICAgIGNvbnN0IHsgY2xhc3NOYW1lLCBwcmVmaXggfSA9IHRoaXMuX3ByZWZpeEljb24odGhpcy5fcGFyc2VBdHRyKGxhc3RJY29uLCBsYXN0TW9kaWZpZXIpKTtcbiAgICBjb25zdCBjdXN0b21QcmVmaXhSRSA9IGNsYXNzTmFtZSAhPT0gcHJlZml4ID8gYHwke3ByZWZpeH0kfCR7cHJlZml4fS1gIDogYHwke2NsYXNzTmFtZX0kYCB8fCAnJztcbiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoYF4oZmEkfGZhLXxpb24tfHptZGkkfHptZGktfG9ucy1pY29uLS0ke2N1c3RvbVByZWZpeFJFfSlgKTtcblxuICAgIHV0aWwuYXJyYXlGcm9tKHRoaXMuY2xhc3NMaXN0KVxuICAgICAgLmZpbHRlcihjbGFzc05hbWUgPT4gcmUudGVzdChjbGFzc05hbWUpKVxuICAgICAgLmZvckVhY2goY2xhc3NOYW1lID0+IHRoaXMuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpKTtcbiAgfVxuXG4gIF9wcmVmaXhJY29uKGljb25OYW1lKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gYXV0b1ByZWZpeCArIChhdXRvUHJlZml4ID8gJy0nIDogJycpICsgaWNvbk5hbWU7XG4gICAgcmV0dXJuIHsgY2xhc3NOYW1lLCBwcmVmaXg6IGNsYXNzTmFtZS5zcGxpdCgnLScpWzBdIH07XG4gIH1cblxuICBfYnVpbGRDbGFzc0FuZFN0eWxlKGljb25OYW1lLCBzaXplKSB7XG4gICAgY29uc3QgY2xhc3NMaXN0ID0gWydvbnMtaWNvbiddO1xuICAgIGNvbnN0IHN0eWxlID0ge307XG5cbiAgICAvLyBJY29uXG4gICAgaWYgKGljb25OYW1lLmluZGV4T2YoJ2lvbi0nKSA9PT0gMCkge1xuICAgICAgY2xhc3NMaXN0LnB1c2goaWNvbk5hbWUpO1xuICAgICAgY2xhc3NMaXN0LnB1c2goJ29ucy1pY29uLS1pb24nKTtcbiAgICB9IGVsc2UgaWYgKGljb25OYW1lLmluZGV4T2YoJ2ZhLScpID09PSAwKSB7XG4gICAgICBjbGFzc0xpc3QucHVzaChpY29uTmFtZSk7XG4gICAgICAvLyBkZWZhdWx0IGljb24gc3R5bGUgdG8gRm9udCBBd2Vzb21lIFNvbGlkIGlmIGljb24gc3R5bGUgaXMgbm90IHNwZWNpZmllZCBhbHJlYWR5XG4gICAgICBpZiAoISh0aGlzLmNsYXNzTGlzdC5jb250YWlucygnZmFyJykgfHwgdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ2ZhYicpIHx8IHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdmYWwnKSkpIHtcbiAgICAgICAgY2xhc3NMaXN0LnB1c2goJ2ZhJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpY29uTmFtZS5pbmRleE9mKCdtZC0nKSA9PT0gMCkgIHtcbiAgICAgIGNsYXNzTGlzdC5wdXNoKCd6bWRpJyk7XG4gICAgICBjbGFzc0xpc3QucHVzaCgnem1kaS0nICsgaWNvbk5hbWUuc3BsaXQoLy0oLispPy8pWzFdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyBjbGFzc05hbWUsIHByZWZpeCB9ID0gdGhpcy5fcHJlZml4SWNvbihpY29uTmFtZSk7XG4gICAgICBwcmVmaXggJiYgY2xhc3NMaXN0LnB1c2gocHJlZml4KTtcbiAgICAgIGNsYXNzTmFtZSAmJiBjbGFzc0xpc3QucHVzaChjbGFzc05hbWUpO1xuICAgIH1cblxuICAgIC8vIFNpemVcbiAgICBpZiAoc2l6ZS5tYXRjaCgvXlsxLTVdeHxsZyQvKSkge1xuICAgICAgY2xhc3NMaXN0LnB1c2goJ29ucy1pY29uLS0nICsgc2l6ZSk7XG4gICAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdmb250LXNpemUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGUuZm9udFNpemUgPSBzaXplO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjbGFzc0xpc3Q6IGNsYXNzTGlzdCxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgc2V0QXV0b1ByZWZpeChwcmVmaXgpIHtcbiAgICBhdXRvUHJlZml4ID0gcHJlZml4ID8gKHR5cGVvZiBwcmVmaXggPT09ICdzdHJpbmcnICYmIHByZWZpeCB8fCAnZmEnKSA6ICcnO1xuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoSWNvbkVsZW1lbnQsIFsnZml4ZWQtd2lkdGgnLCAnc3BpbiddKTtcblxub25zRWxlbWVudHMuSWNvbiA9IEljb25FbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtaWNvbicsIEljb25FbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4uL3V0aWwuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtLmpzJztcblxuZXhwb3J0IGNsYXNzIExhenlSZXBlYXREZWxlZ2F0ZSB7XG5cbiAgY29uc3RydWN0b3IodXNlckRlbGVnYXRlLCB0ZW1wbGF0ZUVsZW1lbnQgPSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiB1c2VyRGVsZWdhdGUgIT09ICdvYmplY3QnIHx8IHVzZXJEZWxlZ2F0ZSA9PT0gbnVsbCkge1xuICAgICAgdXRpbC50aHJvdygnXCJkZWxlZ2F0ZVwiIHBhcmFtZXRlciBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cbiAgICB0aGlzLl91c2VyRGVsZWdhdGUgPSB1c2VyRGVsZWdhdGU7XG5cbiAgICBpZiAoISh0ZW1wbGF0ZUVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSAmJiB0ZW1wbGF0ZUVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgIHV0aWwudGhyb3coJ1widGVtcGxhdGVFbGVtZW50XCIgcGFyYW1ldGVyIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRWxlbWVudCBvciBudWxsJyk7XG4gICAgfVxuICAgIHRoaXMuX3RlbXBsYXRlRWxlbWVudCA9IHRlbXBsYXRlRWxlbWVudDtcbiAgfVxuXG4gIGdldCBpdGVtSGVpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLl91c2VyRGVsZWdhdGUuaXRlbUhlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaGFzUmVuZGVyRnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJEZWxlZ2F0ZS5fcmVuZGVyIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIF9yZW5kZXIoKSB7XG4gICAgdGhpcy5fdXNlckRlbGVnYXRlLl9yZW5kZXIuYXBwbHkodGhpcy5fdXNlckRlbGVnYXRlLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lIEEgZnVuY3Rpb24gdGhhdCB0YWtlIGl0ZW0gb2JqZWN0IGFzIHBhcmFtZXRlci5cbiAgICovXG4gIGxvYWRJdGVtRWxlbWVudChpbmRleCwgZG9uZSkge1xuICAgIGlmICh0aGlzLl91c2VyRGVsZWdhdGUubG9hZEl0ZW1FbGVtZW50IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMuX3VzZXJEZWxlZ2F0ZS5sb2FkSXRlbUVsZW1lbnQoaW5kZXgsIGRvbmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fdXNlckRlbGVnYXRlLmNyZWF0ZUl0ZW1Db250ZW50KGluZGV4LCB0aGlzLl90ZW1wbGF0ZUVsZW1lbnQpO1xuICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XG4gICAgICAgIHV0aWwudGhyb3coJ1wiY3JlYXRlSXRlbUNvbnRlbnRcIiBtdXN0IHJldHVybiBhbiBpbnN0YW5jZSBvZiBFbGVtZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGRvbmUoe2VsZW1lbnR9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKi9cbiAgY291bnRJdGVtcygpIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuX3VzZXJEZWxlZ2F0ZS5jb3VudEl0ZW1zKCk7XG4gICAgaWYgKHR5cGVvZiBjb3VudCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHV0aWwudGhyb3coJ1wiY291bnRJdGVtc1wiIG11c3QgcmV0dXJuIGEgbnVtYmVyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1cbiAgICogQHBhcmFtIHtFbGVtZW50fSBpdGVtLmVsZW1lbnRcbiAgICovXG4gIHVwZGF0ZUl0ZW0oaW5kZXgsIGl0ZW0pIHtcbiAgICBpZiAodGhpcy5fdXNlckRlbGVnYXRlLnVwZGF0ZUl0ZW1Db250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMuX3VzZXJEZWxlZ2F0ZS51cGRhdGVJdGVtQ29udGVudChpbmRleCwgaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge051bWJlcn1cbiAgICovXG4gIGNhbGN1bGF0ZUl0ZW1IZWlnaHQoaW5kZXgpIHtcbiAgICBpZiAodGhpcy5fdXNlckRlbGVnYXRlLmNhbGN1bGF0ZUl0ZW1IZWlnaHQgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5fdXNlckRlbGVnYXRlLmNhbGN1bGF0ZUl0ZW1IZWlnaHQoaW5kZXgpO1xuXG4gICAgICBpZiAodHlwZW9mIGhlaWdodCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdXRpbC50aHJvdygnXCJjYWxjdWxhdGVJdGVtSGVpZ2h0XCIgbXVzdCByZXR1cm4gYSBudW1iZXInKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhlaWdodDtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW1cbiAgICovXG4gIGRlc3Ryb3lJdGVtKGluZGV4LCBpdGVtKSB7XG4gICAgaWYgKHRoaXMuX3VzZXJEZWxlZ2F0ZS5kZXN0cm95SXRlbSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICB0aGlzLl91c2VyRGVsZWdhdGUuZGVzdHJveUl0ZW0oaW5kZXgsIGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fdXNlckRlbGVnYXRlLmRlc3Ryb3kgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgdGhpcy5fdXNlckRlbGVnYXRlLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICB0aGlzLl91c2VyRGVsZWdhdGUgPSB0aGlzLl90ZW1wbGF0ZUVsZW1lbnQgPSBudWxsO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyBwcm92aWRlIGNvcmUgZnVuY3Rpb25zIGZvciBvbnMtbGF6eS1yZXBlYXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXp5UmVwZWF0UHJvdmlkZXIge1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHdyYXBwZXJFbGVtZW50XG4gICAqIEBwYXJhbSB7TGF6eVJlcGVhdERlbGVnYXRlfSBkZWxlZ2F0ZVxuICAgKi9cbiAgY29uc3RydWN0b3Iod3JhcHBlckVsZW1lbnQsIGRlbGVnYXRlKSB7XG4gICAgaWYgKCEoZGVsZWdhdGUgaW5zdGFuY2VvZiBMYXp5UmVwZWF0RGVsZWdhdGUpKSB7XG4gICAgICB1dGlsLnRocm93KCdcImRlbGVnYXRlXCIgcGFyYW1ldGVyIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgTGF6eVJlcGVhdERlbGVnYXRlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fd3JhcHBlckVsZW1lbnQgPSB3cmFwcGVyRWxlbWVudDtcbiAgICB0aGlzLl9kZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICAgIHRoaXMuX2luc2VydEluZGV4ID0gKHRoaXMuX3dyYXBwZXJFbGVtZW50LmNoaWxkcmVuWzBdICYmIHRoaXMuX3dyYXBwZXJFbGVtZW50LmNoaWxkcmVuWzBdLnRhZ05hbWUgPT09ICdPTlMtTEFaWS1SRVBFQVQnKSA/IDEgOiAwO1xuXG4gICAgaWYgKHdyYXBwZXJFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ29ucy1saXN0Jykge1xuICAgICAgd3JhcHBlckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGF6eS1saXN0Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5fcGFnZUNvbnRlbnQgPSB0aGlzLl9maW5kUGFnZUNvbnRlbnRFbGVtZW50KHdyYXBwZXJFbGVtZW50KTtcblxuICAgIGlmICghdGhpcy5fcGFnZUNvbnRlbnQpIHtcbiAgICAgIHV0aWwudGhyb3coJ0xhenlSZXBlYXQgbXVzdCBiZSBkZXNjZW5kYW50IG9mIGEgUGFnZSBlbGVtZW50Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5sYXN0U2Nyb2xsVG9wID0gdGhpcy5fcGFnZUNvbnRlbnQuc2Nyb2xsVG9wO1xuICAgIHRoaXMucGFkZGluZyA9IDA7XG4gICAgdGhpcy5fdG9wUG9zaXRpb25zID0gWzBdO1xuICAgIHRoaXMuX3JlbmRlcmVkSXRlbXMgPSB7fTtcblxuICAgIGlmICghdGhpcy5fZGVsZWdhdGUuaXRlbUhlaWdodCAmJiAhdGhpcy5fZGVsZWdhdGUuY2FsY3VsYXRlSXRlbUhlaWdodCgwKSkge1xuICAgICAgdGhpcy5fdW5rbm93bkl0ZW1IZWlnaHQgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgdGhpcy5fb25DaGFuZ2UoKTtcbiAgfVxuXG4gIGdldCBwYWRkaW5nKCkge1xuICAgIHJldHVybiBwYXJzZUludCh0aGlzLl93cmFwcGVyRWxlbWVudC5zdHlsZS5wYWRkaW5nVG9wLCAxMCk7XG4gIH1cblxuICBzZXQgcGFkZGluZyhuZXdWYWx1ZSkge1xuICAgIHRoaXMuX3dyYXBwZXJFbGVtZW50LnN0eWxlLnBhZGRpbmdUb3AgPSBuZXdWYWx1ZSArICdweCc7XG4gIH1cblxuICBfZmluZFBhZ2VDb250ZW50RWxlbWVudCh3cmFwcGVyRWxlbWVudCkge1xuICAgIGNvbnN0IHBhZ2VDb250ZW50ID0gdXRpbC5maW5kUGFyZW50KHdyYXBwZXJFbGVtZW50LCAnLnBhZ2VfX2NvbnRlbnQnKTtcblxuICAgIGlmIChwYWdlQ29udGVudCkge1xuICAgICAgcmV0dXJuIHBhZ2VDb250ZW50O1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2UgPSB1dGlsLmZpbmRQYXJlbnQod3JhcHBlckVsZW1lbnQsICdvbnMtcGFnZScpO1xuICAgIGlmIChwYWdlKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gdXRpbC5maW5kQ2hpbGQocGFnZSwgJy5jb250ZW50Jyk7XG4gICAgICBpZiAoY29udGVudCkge1xuICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIF9jaGVja0l0ZW1IZWlnaHQoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9kZWxlZ2F0ZS5sb2FkSXRlbUVsZW1lbnQoMCwgaXRlbSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX3Vua25vd25JdGVtSGVpZ2h0KSB7XG4gICAgICAgIHV0aWwudGhyb3coJ0ludmFsaWQgc3RhdGUnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fd3JhcHBlckVsZW1lbnQuYXBwZW5kQ2hpbGQoaXRlbS5lbGVtZW50KTtcblxuICAgICAgY29uc3QgZG9uZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fZGVsZWdhdGUuZGVzdHJveUl0ZW0oMCwgaXRlbSk7XG4gICAgICAgIGl0ZW0uZWxlbWVudCAmJiBpdGVtLmVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl91bmtub3duSXRlbUhlaWdodDtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuX2l0ZW1IZWlnaHQgPSBpdGVtLmVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICBpZiAodGhpcy5faXRlbUhlaWdodCA+IDApIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIHJldHJ5IHRvIG1lYXN1cmUgb2Zmc2V0IGhlaWdodFxuICAgICAgLy8gZGlydHkgZml4IGZvciBhbmd1bGFyMiBkaXJlY3RpdmVcbiAgICAgIHRoaXMuX3dyYXBwZXJFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgIGl0ZW0uZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG5cbiAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2l0ZW1IZWlnaHQgPSBpdGVtLmVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICBpZiAodGhpcy5faXRlbUhlaWdodCA9PSAwKSB7XG4gICAgICAgICAgdXRpbC50aHJvdygnSW52YWxpZCBzdGF0ZTogXCJpdGVtSGVpZ2h0XCIgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybycpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dyYXBwZXJFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnJztcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgc3RhdGljSXRlbUhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuaXRlbUhlaWdodCB8fCB0aGlzLl9pdGVtSGVpZ2h0O1xuICB9XG4gIF9jb3VudEl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5jb3VudEl0ZW1zKCk7XG4gIH1cblxuICBfZ2V0SXRlbUhlaWdodChpKSB7XG4gICAgLy8gSXRlbSBpcyByZW5kZXJlZFxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fcmVuZGVyZWRJdGVtcywgaSkpIHtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3JlbmRlcmVkSXRlbXNbaV0sICdoZWlnaHQnKSkge1xuICAgICAgICB0aGlzLl9yZW5kZXJlZEl0ZW1zW2ldLmhlaWdodCA9IHRoaXMuX3JlbmRlcmVkSXRlbXNbaV0uZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fcmVuZGVyZWRJdGVtc1tpXS5oZWlnaHQ7XG4gICAgfVxuXG4gICAgLy8gSXRlbSBpcyBub3QgcmVuZGVyZWQsIHNjcm9sbCB1cFxuICAgIGlmICh0aGlzLl90b3BQb3NpdGlvbnNbaSArIDFdICYmIHRoaXMuX3RvcFBvc2l0aW9uc1tpXSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RvcFBvc2l0aW9uc1tpICsgMV0gLSB0aGlzLl90b3BQb3NpdGlvbnNbaV07XG4gICAgfVxuICAgIC8vIEl0ZW0gaXMgbm90IHJlbmRlcmVkLCBzY3JvbGwgZG93blxuICAgIHJldHVybiB0aGlzLnN0YXRpY0l0ZW1IZWlnaHQgfHwgdGhpcy5fZGVsZWdhdGUuY2FsY3VsYXRlSXRlbUhlaWdodChpKTtcbiAgfVxuXG4gIF9jYWxjdWxhdGVSZW5kZXJlZEhlaWdodCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fcmVuZGVyZWRJdGVtcykucmVkdWNlKChhLCBiKSA9PiBhICsgdGhpcy5fZ2V0SXRlbUhlaWdodCgrKGIpKSwgMCk7XG4gIH1cblxuICBfb25DaGFuZ2UoKSB7XG4gICAgdGhpcy5fcmVuZGVyKCk7XG4gIH1cblxuICBfbGFzdEl0ZW1SZW5kZXJlZCgpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoLi4uT2JqZWN0LmtleXModGhpcy5fcmVuZGVyZWRJdGVtcykpO1xuICB9XG5cbiAgX2ZpcnN0SXRlbVJlbmRlcmVkKCkge1xuICAgIHJldHVybiBNYXRoLm1pbiguLi5PYmplY3Qua2V5cyh0aGlzLl9yZW5kZXJlZEl0ZW1zKSk7XG4gIH1cblxuICByZWZyZXNoKCkge1xuICAgIGNvbnN0IGZvcmNlUmVuZGVyID0geyBmb3JjZVNjcm9sbERvd246IHRydWUgfTtcbiAgICBjb25zdCBmaXJzdEl0ZW1JbmRleCA9IHRoaXMuX2ZpcnN0SXRlbVJlbmRlcmVkKCk7XG5cbiAgICBpZiAodXRpbC5pc0ludGVnZXIoZmlyc3RJdGVtSW5kZXgpKSB7XG4gICAgICB0aGlzLl93cmFwcGVyRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLl90b3BQb3NpdGlvbnNbZmlyc3RJdGVtSW5kZXhdICsgdGhpcy5fY2FsY3VsYXRlUmVuZGVyZWRIZWlnaHQoKSArICdweCc7XG4gICAgICB0aGlzLnBhZGRpbmcgPSB0aGlzLl90b3BQb3NpdGlvbnNbZmlyc3RJdGVtSW5kZXhdO1xuICAgICAgZm9yY2VSZW5kZXIuZm9yY2VGaXJzdEluZGV4ID0gZmlyc3RJdGVtSW5kZXg7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVtb3ZlQWxsRWxlbWVudHMoKTtcbiAgICB0aGlzLl9yZW5kZXIoZm9yY2VSZW5kZXIpO1xuICAgIHRoaXMuX3dyYXBwZXJFbGVtZW50LnN0eWxlLmhlaWdodCA9ICdpbmhlcml0JztcbiAgfVxuXG4gIF9yZW5kZXIoe2ZvcmNlU2Nyb2xsRG93biA9IGZhbHNlLCBmb3JjZUZpcnN0SW5kZXgsIGZvcmNlTGFzdEluZGV4fSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuX3Vua25vd25JdGVtSGVpZ2h0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fY2hlY2tJdGVtSGVpZ2h0KHRoaXMuX3JlbmRlci5iaW5kKHRoaXMsIGFyZ3VtZW50c1swXSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzU2Nyb2xsVXAgPSAhZm9yY2VTY3JvbGxEb3duICYmIHRoaXMubGFzdFNjcm9sbFRvcCA+IHRoaXMuX3BhZ2VDb250ZW50LnNjcm9sbFRvcDtcbiAgICB0aGlzLmxhc3RTY3JvbGxUb3AgPSB0aGlzLl9wYWdlQ29udGVudC5zY3JvbGxUb3A7XG4gICAgY29uc3Qga2VlcCA9IHt9O1xuXG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5fd3JhcHBlckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgIGNvbnN0IGxpbWl0ID0gNCAqIHdpbmRvdy5pbm5lckhlaWdodCAtIG9mZnNldDtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuX2NvdW50SXRlbXMoKTtcblxuICAgIGNvbnN0IGl0ZW1zID0gW107XG4gICAgY29uc3Qgc3RhcnQgPSBmb3JjZUZpcnN0SW5kZXggfHwgTWF0aC5tYXgoMCwgdGhpcy5fY2FsY3VsYXRlU3RhcnRJbmRleChvZmZzZXQpIC0gMzApOyAvLyBSZWNhbGN1bGF0ZSBmb3IgMCBvciB1bmRlZmluZWRcbiAgICBsZXQgaSA9IHN0YXJ0O1xuXG4gICAgZm9yIChsZXQgdG9wID0gdGhpcy5fdG9wUG9zaXRpb25zW2ldOyBpIDwgY291bnQgJiYgdG9wIDwgbGltaXQ7IGkrKykge1xuICAgICAgaWYgKGkgPj0gdGhpcy5fdG9wUG9zaXRpb25zLmxlbmd0aCkgeyAvLyBwZXJmIG9wdGltaXphdGlvblxuICAgICAgICB0aGlzLl90b3BQb3NpdGlvbnMubGVuZ3RoICs9IDEwMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdG9wUG9zaXRpb25zW2ldID0gdG9wO1xuICAgICAgdG9wICs9IHRoaXMuX2dldEl0ZW1IZWlnaHQoaSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RlbGVnYXRlLmhhc1JlbmRlckZ1bmN0aW9uICYmIHRoaXMuX2RlbGVnYXRlLmhhc1JlbmRlckZ1bmN0aW9uKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5fcmVuZGVyKHN0YXJ0LCBpLCAoKSA9PiB7XG4gICAgICAgIHRoaXMucGFkZGluZyA9IHRoaXMuX3RvcFBvc2l0aW9uc1tzdGFydF07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXNTY3JvbGxVcCkge1xuICAgICAgZm9yIChsZXQgaiA9IGkgLSAxOyBqID49IHN0YXJ0OyBqLS0pIHtcbiAgICAgICAga2VlcFtqXSA9IHRydWU7XG4gICAgICAgIHRoaXMuX3JlbmRlckVsZW1lbnQoaiwgaXNTY3JvbGxVcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxhc3RJbmRleCA9IGZvcmNlTGFzdEluZGV4IHx8IE1hdGgubWF4KGkgLSAxLCAuLi5PYmplY3Qua2V5cyh0aGlzLl9yZW5kZXJlZEl0ZW1zKSk7IC8vIFJlY2FsY3VsYXRlIGZvciAwIG9yIHVuZGVmaW5lZFxuICAgICAgZm9yIChsZXQgaiA9IHN0YXJ0OyBqIDw9IGxhc3RJbmRleDsgaisrKSB7XG4gICAgICAgIGtlZXBbal0gPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZW5kZXJFbGVtZW50KGosIGlzU2Nyb2xsVXApO1xuICAgICAgfVxuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKHRoaXMuX3JlbmRlcmVkSXRlbXMpLmZvckVhY2goa2V5ID0+IGtlZXBba2V5XSB8fCB0aGlzLl9yZW1vdmVFbGVtZW50KGtleSwgaXNTY3JvbGxVcCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzU2Nyb2xsVXBcbiAgICovXG4gIF9yZW5kZXJFbGVtZW50KGluZGV4LCBpc1Njcm9sbFVwKSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuX3JlbmRlcmVkSXRlbXNbaW5kZXhdO1xuICAgIGlmIChpdGVtKSB7XG4gICAgICB0aGlzLl9kZWxlZ2F0ZS51cGRhdGVJdGVtKGluZGV4LCBpdGVtKTsgLy8gdXBkYXRlIGlmIGl0IGV4aXN0c1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2RlbGVnYXRlLmxvYWRJdGVtRWxlbWVudChpbmRleCwgaXRlbSA9PiB7XG4gICAgICBpZiAoaXNTY3JvbGxVcCkge1xuICAgICAgICB0aGlzLl93cmFwcGVyRWxlbWVudC5pbnNlcnRCZWZvcmUoaXRlbS5lbGVtZW50LCB0aGlzLl93cmFwcGVyRWxlbWVudC5jaGlsZHJlblt0aGlzLl9pbnNlcnRJbmRleF0pO1xuICAgICAgICB0aGlzLnBhZGRpbmcgPSB0aGlzLl90b3BQb3NpdGlvbnNbaW5kZXhdO1xuICAgICAgICBpdGVtLmhlaWdodCA9IHRoaXMuX3RvcFBvc2l0aW9uc1tpbmRleCArIDFdIC0gdGhpcy5fdG9wUG9zaXRpb25zW2luZGV4XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3dyYXBwZXJFbGVtZW50LmFwcGVuZENoaWxkKGl0ZW0uZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3JlbmRlcmVkSXRlbXNbaW5kZXhdID0gaXRlbTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAgICogQHBhcmFtIHtCb29sZWFufSBpc1Njcm9sbFVwXG4gICAqL1xuICBfcmVtb3ZlRWxlbWVudChpbmRleCwgaXNTY3JvbGxVcCA9IHRydWUpIHtcbiAgICBpbmRleCA9ICsoaW5kZXgpO1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9yZW5kZXJlZEl0ZW1zW2luZGV4XTtcbiAgICB0aGlzLl9kZWxlZ2F0ZS5kZXN0cm95SXRlbShpbmRleCwgaXRlbSk7XG5cbiAgICBpZiAoaXNTY3JvbGxVcCkge1xuICAgICAgdGhpcy5fdG9wUG9zaXRpb25zW2luZGV4ICsgMV0gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFkZGluZyA9IHRoaXMucGFkZGluZyArIHRoaXMuX2dldEl0ZW1IZWlnaHQoaW5kZXgpO1xuICAgIH1cblxuICAgIGlmIChpdGVtLmVsZW1lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgaXRlbS5lbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoaXRlbS5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBkZWxldGUgdGhpcy5fcmVuZGVyZWRJdGVtc1tpbmRleF07XG4gIH1cblxuICBfcmVtb3ZlQWxsRWxlbWVudHMoKSB7XG4gICAgT2JqZWN0LmtleXModGhpcy5fcmVuZGVyZWRJdGVtcykuZm9yRWFjaChrZXkgPT4gdGhpcy5fcmVtb3ZlRWxlbWVudChrZXkpKTtcbiAgfVxuXG4gIF9yZWNhbGN1bGF0ZVRvcFBvc2l0aW9ucyhzdGFydCwgZW5kKSB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICB0aGlzLl90b3BQb3NpdGlvbnNbaSArIDFdID0gdGhpcy5fdG9wUG9zaXRpb25zW2ldICsgdGhpcy5fZ2V0SXRlbUhlaWdodChpKTtcbiAgICB9XG4gIH1cblxuICBfY2FsY3VsYXRlU3RhcnRJbmRleChjdXJyZW50KSB7XG4gICAgY29uc3QgZmlyc3RJdGVtSW5kZXggPSB0aGlzLl9maXJzdEl0ZW1SZW5kZXJlZCgpO1xuICAgIGNvbnN0IGxhc3RJdGVtSW5kZXggPSB0aGlzLl9sYXN0SXRlbVJlbmRlcmVkKCk7XG5cbiAgICAvLyBGaXggZm9yIFNhZmFyaSBzY3JvbGwgYW5kIEFuZ3VsYXIgMlxuICAgIHRoaXMuX3JlY2FsY3VsYXRlVG9wUG9zaXRpb25zKGZpcnN0SXRlbUluZGV4LCBsYXN0SXRlbUluZGV4KTtcblxuICAgIGxldCBzdGFydCA9IDA7XG4gICAgbGV0IGVuZCA9IHRoaXMuX2NvdW50SXRlbXMoKSAtIDE7XG5cbiAgICAvLyBCaW5hcnkgc2VhcmNoIGZvciBpbmRleCBhdCB0b3Agb2Ygc2NyZWVuIHNvIHdlIGNhbiBzcGVlZCB1cCByZW5kZXJpbmcuXG4gICAgZm9yICg7Oykge1xuICAgICAgY29uc3QgbWlkZGxlID0gTWF0aC5mbG9vcigoc3RhcnQgKyBlbmQpIC8gMik7XG4gICAgICBjb25zdCB2YWx1ZSA9IGN1cnJlbnQgKyB0aGlzLl90b3BQb3NpdGlvbnNbbWlkZGxlXTtcblxuICAgICAgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSA8PSAwICYmIHZhbHVlICsgdGhpcy5fZ2V0SXRlbUhlaWdodChtaWRkbGUpID4gMCkge1xuICAgICAgICByZXR1cm4gbWlkZGxlO1xuICAgICAgfSBlbHNlIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPj0gMCkge1xuICAgICAgICBlbmQgPSBtaWRkbGUgLSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSBtaWRkbGUgKyAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9kZWJvdW5jZShmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICBsZXQgdGltZW91dDtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0O1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgaWYgKGNhbGxOb3cpIHtcbiAgICAgICAgZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgIGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfSwgd2FpdCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIF9kb3VibGVGaXJlT25Ub3VjaGVuZCgpIHtcbiAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICB0aGlzLl9kZWJvdW5jZSh0aGlzLl9yZW5kZXIuYmluZCh0aGlzKSwgMTAwKTtcbiAgfVxuXG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICB1dGlsLmJpbmRMaXN0ZW5lcnModGhpcywgWydfb25DaGFuZ2UnLCAnX2RvdWJsZUZpcmVPblRvdWNoZW5kJ10pO1xuXG4gICAgaWYgKHBsYXRmb3JtLmlzSU9TKCkpIHtcbiAgICAgIHRoaXMuX2JvdW5kT25DaGFuZ2UgPSB0aGlzLl9kZWJvdW5jZSh0aGlzLl9ib3VuZE9uQ2hhbmdlLCAzMCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcGFnZUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgdHJ1ZSk7XG5cbiAgICBpZiAocGxhdGZvcm0uaXNJT1MoKSkge1xuICAgICAgdXRpbC5hZGRFdmVudExpc3RlbmVyKHRoaXMuX3BhZ2VDb250ZW50LCAndG91Y2htb3ZlJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgeyBjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgdGhpcy5fcGFnZUNvbnRlbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9ib3VuZERvdWJsZUZpcmVPblRvdWNoZW5kLCB0cnVlKTtcbiAgICB9XG5cbiAgICB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgdHJ1ZSk7XG4gIH1cblxuICBfcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5fcGFnZUNvbnRlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgdHJ1ZSk7XG5cbiAgICBpZiAocGxhdGZvcm0uaXNJT1MoKSkge1xuICAgICAgdXRpbC5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuX3BhZ2VDb250ZW50LCAndG91Y2htb3ZlJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgeyBjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgdGhpcy5fcGFnZUNvbnRlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9ib3VuZERvdWJsZUZpcmVPblRvdWNoZW5kLCB0cnVlKTtcbiAgICB9XG5cbiAgICB3aW5kb3cuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgdHJ1ZSk7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuX3JlbW92ZUFsbEVsZW1lbnRzKCk7XG4gICAgdGhpcy5fZGVsZWdhdGUuZGVzdHJveSgpO1xuICAgIHRoaXMuX3BhcmVudEVsZW1lbnQgPSB0aGlzLl9kZWxlZ2F0ZSA9IHRoaXMuX3JlbmRlcmVkSXRlbXMgPSBudWxsO1xuICAgIHRoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gIH1cbn1cblxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGludGVybmFsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9pbmRleC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgeyBMYXp5UmVwZWF0RGVsZWdhdGUsIExhenlSZXBlYXRQcm92aWRlciB9IGZyb20gJy4uL29ucy9pbnRlcm5hbC9sYXp5LXJlcGVhdC5qcyc7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWxhenktcmVwZWF0XG4gKiBAY2F0ZWdvcnkgbGlzdFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBVc2luZyB0aGlzIGNvbXBvbmVudCBhIGxpc3Qgd2l0aCBtaWxsaW9ucyBvZiBpdGVtcyBjYW4gYmUgcmVuZGVyZWQgd2l0aG91dCBhIGRyb3AgaW4gcGVyZm9ybWFuY2UuXG4gKiAgICAgSXQgZG9lcyB0aGF0IGJ5IFwibGF6aWx5XCIgbG9hZGluZyBlbGVtZW50cyBpbnRvIHRoZSBET00gd2hlbiB0aGV5IGNvbWUgaW50byB2aWV3IGFuZFxuICogICAgIHJlbW92aW5nIGl0ZW1zIGZyb20gdGhlIERPTSB3aGVuIHRoZXkgYXJlIG5vdCB2aXNpYmxlLlxuICogICBbL2VuXVxuICogICBbamFdXG4gKiAgICAg44GT44Gu44Kz44Oz44Od44O844ON44Oz44OI5YaF44Gn5o+P55S744GV44KM44KL44Ki44Kk44OG44Og44GuRE9N6KaB57Sg44Gu6Kqt44G/6L6844G/44Gv44CB55S76Z2i44Gr6KaL44GI44Gd44GG44Gr44Gq44Gj44Gf5pmC44G+44Gn6Ieq5YuV55qE44Gr6YGF5bu244GV44KM44CBXG4gKiAgICAg55S76Z2i44GL44KJ6KaL44GI44Gq44GP44Gq44Gj44Gf5aC05ZCI44Gr44Gv44Gd44Gu6KaB57Sg44Gv5YuV55qE44Gr44Ki44Oz44Ot44O844OJ44GV44KM44G+44GZ44CCXG4gKiAgICAg44GT44Gu44Kz44Oz44Od44O844ON44Oz44OI44KS5L2/44GG44GT44Go44Gn44CB44OR44OV44Kp44O844Oe44Oz44K544KS5Yqj5YyW44GV44Gb44KL44GT44Go54Sh44GX44Gr5beo5aSn44Gq5pWw44Gu6KaB57Sg44KS5o+P55S744Gn44GN44G+44GZ44CCXG4gKiAgIFsvamFdXG4gKiBAY29kZXBlbiBRd3JHQm1cbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9sYXp5LXJlcGVhdFxuICogQHNlZWFsc28gb25zLWxpc3RcbiAqICAgW2VuXVRoZSBgPG9ucy1saXN0PmAgZWxlbWVudCBpcyB1c2VkIHRvIHJlbmRlciBhIGxpc3QuWy9lbl1cbiAqICAgW2phXWA8b25zLWxpc3Q+YOimgee0oOOBr+ODquOCueODiOOCkuaPj+eUu+OBmeOCi+OBruOBq+S9v+OCj+OCjOOBvuOBmeOAglsvamFdXG4gKiBAZXhhbXBsZVxuICogPHNjcmlwdD5cbiAqICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbigpIHtcbiAqICAgICB2YXIgbGF6eVJlcGVhdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNsaXN0Jyk7XG4gKiAgICAgbGF6eVJlcGVhdC5kZWxlZ2F0ZSA9IHtcbiAqICAgICAgY3JlYXRlSXRlbUNvbnRlbnQ6IGZ1bmN0aW9uKGksIHRlbXBsYXRlKSB7XG4gKiAgICAgICAgdmFyIGRvbSA9IHRlbXBsYXRlLmNsb25lTm9kZSh0cnVlKTtcbiAqICAgICAgICBkb20uaW5uZXJUZXh0ID0gaTtcbiAqXG4gKiAgICAgICAgcmV0dXJuIGRvbTtcbiAqICAgICAgfSxcbiAqICAgICAgY291bnRJdGVtczogZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgcmV0dXJuIDEwMDAwMDAwO1xuICogICAgICB9LFxuICogICAgICBkZXN0cm95SXRlbTogZnVuY3Rpb24oaW5kZXgsIGl0ZW0pIHtcbiAqICAgICAgICBjb25zb2xlLmxvZygnRGVzdHJveWVkIGl0ZW0gd2l0aCBpbmRleDogJyArIGluZGV4KTtcbiAqICAgICAgfVxuICogICAgIH07XG4gKiAgIH0pO1xuICogPC9zY3JpcHQ+XG4gKlxuICogPG9ucy1saXN0IGlkPVwibGlzdFwiPlxuICogICA8b25zLWxhenktcmVwZWF0PlxuICogICAgIDxvbnMtbGlzdC1pdGVtPjwvb25zLWxpc3QtaXRlbT5cbiAqICAgPC9vbnMtbGF6eS1yZXBlYXQ+XG4gKiA8L29ucy1saXN0PlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYXp5UmVwZWF0RWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAvLyBub3QgdmVyeSBnb29kIGlkZWEgYW5kIGFsc28gbm90IGRvY3VtZW50ZWRcbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2RlbGVnYXRlJykpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB3aW5kb3dbdGhpcy5nZXRBdHRyaWJ1dGUoJ2RlbGVnYXRlJyldO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGVsZWdhdGVcbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSBhIGRlbGVnYXRlIG9iamVjdCB0byBsb2FkIGFuZCB1bmxvYWQgaXRlbSBlbGVtZW50cy5bL2VuXVxuICAgKiAgW2phXeimgee0oOOBruODreODvOODieOAgeOCouODs+ODreODvOODieOBquOBqeOBruWHpueQhuOCkuWnlOitsuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGVsZWdhdGUuY3JlYXRlSXRlbUNvbnRlbnRcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dXG4gICAqICAgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSBgSFRNTEVsZW1lbnRgLlxuICAgKlxuICAgKiAgICAgVG8gaGVscCByZW5kZXJpbmcgdGhlIGVsZW1lbnQsIHRoZSBjdXJyZW50IGluZGV4IGFuZCBhIHRlbXBsYXRlIGlzIHN1cHBsaWVkIGFzIGFyZ3VtZW50cy4gVGhlIHRlbXBsYXRlIGlzIHRoZSBpbml0aWFsIGNvbnRlbnQgb2YgdGhlIGA8b25zLWxhenktcmVwZWF0PmAgZWxlbWVudC5cbiAgICogICBbL2VuXVxuICAgKiAgIFtqYV1cbiAgICogICAgIOOBk+OBrumWouaVsOOBr2BIVE1MRWxlbWVudGDjgpLov5TjgZfjgabjgY/jgaDjgZXjgYTjgIJcbiAgICogICAgIOimgee0oOOCkueUn+aIkOOBl+OChOOBmeOBj+OBmeOCi+OBn+OCgeOBq+OAgeePvuWcqOOBruOCouOCpOODhuODoOOBruOCpOODs+ODh+ODg+OCr+OCueOBqOODhuODs+ODl+ODrOODvOODiOOBjOW8leaVsOOBq+a4oeOBleOCjOOBvuOBmeOAglxuICAgKiAgICAg44GT44Gu44OG44Oz44OX44Os44O844OI44Gv44CBYDxvbnMtbGF6eS1yZXBlYXQ+YOimgee0oOOBruOCs+ODs+ODhuODs+ODhOOBjOa4oeOBleOCjOOBvuOBmeOAglxuICAgKiAgIFsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGVsZWdhdGUuY291bnRJdGVtc1xuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGxpc3QuWy9lbl1cbiAgICogICBbamFd44Oq44K544OI5YaF44Gu44Ki44Kk44OG44Og5pWw44KS6L+U44GX44Gm44GP44Gg44GV44GE44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkZWxlZ2F0ZS5jYWxjdWxhdGVJdGVtSGVpZ2h0XG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgU2hvdWxkIHJldHVybiB0aGUgaGVpZ2h0IG9mIGFuIGl0ZW0uIFRoZSBpbmRleCBpcyBwcm92aWRlZCBhcyBhbiBhcmd1bWVudC5cbiAgICpcbiAgICogICAgIFRoaXMgaXMgaW1wb3J0YW50IHdoZW4gcmVuZGVyaW5nIGxpc3RzIHdoZXJlIHRoZSBpdGVtcyBoYXZlIGRpZmZlcmVudCBoZWlnaHQuXG4gICAqXG4gICAqICAgICBUaGUgZnVuY3Rpb24gaXMgb3B0aW9uYWwgYW5kIGlmIGl0IGlzbid0IHByZXNlbnQgdGhlIGhlaWdodCBvZiB0aGUgZmlyc3QgaXRlbSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBhbmQgdXNlZCBmb3IgYWxsIG90aGVyIGl0ZW1zLlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVxuICAgKiAgICAg44Ki44Kk44OG44Og44Gu6auY44GVKOODlOOCr+OCu+ODqynjgpLov5TjgZfjgabjgY/jgaDjgZXjgYTjgILjgqLjgqTjg4bjg6Djga7jgqTjg7Pjg4fjg4Pjgq/jgrnlgKTjga/lvJXmlbDjgafmuKHjgZXjgozjgb7jgZnjgIJcbiAgICogICAgIOOBk+OBrumWouaVsOOBr+OAgeOBneOCjOOBnuOCjOOBruOCouOCpOODoOOBjOmBleOBo+OBn+mrmOOBleOCkuaMgeOBpOODquOCueODiOOCkuODrOODs+ODgOODquODs+OCsOOBmeOCi+mam+OBq+mHjeimgeOBp+OBmeOAglxuICAgKiAgICAg44GT44Gu6Zai5pWw44Gv44Kq44OX44K344On44OK44Or44Gn44GZ44CC44KC44GX44GT44Gu6Zai5pWw44GM54Sh44GE5aC05ZCI44Gr44Gv44CBXG4gICAqICAgICDmnIDliJ3jga7jgqLjgqTjg4bjg6Djga7pq5jjgZXjgYzku5bjga7jgZnjgbnjgabjga7jgqLjgqTjg4bjg6Djga7pq5jjgZXjgajjgZfjgabliKnnlKjjgZXjgozjgb7jgZnjgIJcbiAgICogICBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRlbGVnYXRlLmRlc3Ryb3lJdGVtXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGNhbGxlZCB3aGVuIGFuIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00uIFRoZSBpbmRleCBhbmQgRE9NIGVsZW1lbnQgaXMgcHJvdmlkZWQgYXMgYXJndW1lbnRzLlxuICAgKlxuICAgKiAgICAgVGhlIGZ1bmN0aW9uIGlzIG9wdGlvbmFsIGJ1dCBtYXkgYmUgaW1wb3J0YW50IGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBsZWFrcy5cbiAgICogICBbL2VuXVxuICAgKiAgIFtqYV1cbiAgICogICAgIOOBk+OBrumWouaVsOOBr+OAgeOBguOCi+OCouOCpOODhuODoOOBjERPTeODhOODquODvOOBi+OCiemZpOOBi+OCjOOBn+aZguOBq+WRvOOBs+WHuuOBleOCjOOBvuOBmeOAglxuICAgKiAgICAg44Ki44Kk44OG44Og44Gu44Kk44Oz44OH44OD44Kv44K55YCk44GoRE9N6KaB57Sg44GM5byV5pWw44Go44GX44Gm5rih44GV44KM44G+44GZ44CCXG4gICAqICAgICDjgZPjga7plqLmlbDjga/jgqrjg5fjgrfjg6fjg4rjg6vjgafjgZnjgYzjgIHlkITjgqLjgqTjg4bjg6Djga7lvozlh6bnkIbjgYzlv4XopoHjgarloLTlkIjjgavjga/jg6Hjg6Ljg6rjg7zjg6rjg7zjgq/jgpLpgb/jgZHjgovjgZ/jgoHjgavph43opoHjgafjgZnjgIJcbiAgICogICBbL2phXVxuICAgKi9cblxuICBzZXQgZGVsZWdhdGUodXNlckRlbGVnYXRlKSB7XG4gICAgdGhpcy5fbGF6eVJlcGVhdFByb3ZpZGVyICYmIHRoaXMuX2xhenlSZXBlYXRQcm92aWRlci5kZXN0cm95KCk7XG5cbiAgICBpZiAoIXRoaXMuX3RlbXBsYXRlRWxlbWVudCAmJiB0aGlzLmNoaWxkcmVuWzBdKSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZUVsZW1lbnQgPSB0aGlzLnJlbW92ZUNoaWxkKHRoaXMuY2hpbGRyZW5bMF0pO1xuICAgIH1cblxuICAgIGNvbnN0IGRlbGVnYXRlID0gbmV3IExhenlSZXBlYXREZWxlZ2F0ZSh1c2VyRGVsZWdhdGUsIHRoaXMuX3RlbXBsYXRlRWxlbWVudCB8fCBudWxsKTtcbiAgICB0aGlzLl9sYXp5UmVwZWF0UHJvdmlkZXIgPSBuZXcgTGF6eVJlcGVhdFByb3ZpZGVyKHRoaXMucGFyZW50RWxlbWVudCwgZGVsZWdhdGUpO1xuICB9XG5cbiAgZ2V0IGRlbGVnYXRlKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGdldHRlci1yZXR1cm5cbiAgICB1dGlsLnRocm93KCdObyBkZWxlZ2F0ZSBnZXR0ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHJlZnJlc2hcbiAgICogQHNpZ25hdHVyZSByZWZyZXNoKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJlZnJlc2ggdGhlIGxpc3QuIFVzZSB0aGlzIG1ldGhvZCB3aGVuIHRoZSBkYXRhIGhhcyBjaGFuZ2VkLlsvZW5dXG4gICAqICAgW2phXeODquOCueODiOOCkuabtOaWsOOBl+OBvuOBmeOAguOCguOBl+ODh+ODvOOCv+OBjOWkieOCj+OBo+OBn+WgtOWQiOOBq+OBr+OBk+OBruODoeOCveODg+ODieOCkuS9v+OBo+OBpuOBj+OBoOOBleOBhOOAglsvamFdXG4gICAqL1xuICByZWZyZXNoKCkge1xuICAgIHRoaXMuX2xhenlSZXBlYXRQcm92aWRlciAmJiB0aGlzLl9sYXp5UmVwZWF0UHJvdmlkZXIucmVmcmVzaCgpO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHt9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgaWYgKHRoaXMuX2xhenlSZXBlYXRQcm92aWRlcikge1xuICAgICAgdGhpcy5fbGF6eVJlcGVhdFByb3ZpZGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2xhenlSZXBlYXRQcm92aWRlciA9IG51bGw7XG4gICAgfVxuICB9XG5cbn1cblxuaW50ZXJuYWwuTGF6eVJlcGVhdERlbGVnYXRlID0gTGF6eVJlcGVhdERlbGVnYXRlO1xuaW50ZXJuYWwuTGF6eVJlcGVhdFByb3ZpZGVyID0gTGF6eVJlcGVhdFByb3ZpZGVyO1xuXG5vbnNFbGVtZW50cy5MYXp5UmVwZWF0ID0gTGF6eVJlcGVhdEVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1sYXp5LXJlcGVhdCcsIExhenlSZXBlYXRFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ2xpc3QtaGVhZGVyJztcbmNvbnN0IHNjaGVtZSA9IHsnJzogJ2xpc3QtaGVhZGVyLS0qJ307XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWxpc3QtaGVhZGVyXG4gKiBAY2F0ZWdvcnkgbGlzdFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1IZWFkZXIgZWxlbWVudCBmb3IgbGlzdCBpdGVtcy4gTXVzdCBiZSBwdXQgaW5zaWRlIHRoZSBgPG9ucy1saXN0PmAgY29tcG9uZW50LlsvZW5dXG4gKiAgIFtqYV3jg6rjgrnjg4jopoHntKDjgavkvb/nlKjjgZnjgovjg5jjg4Pjg4Djg7znlKjjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgIJvbnMtbGlzdOOBqOWFseOBq+S9v+eUqOOBl+OBvuOBmeOAglsvamFdXG4gKiBAc2VlYWxzbyBvbnMtbGlzdFxuICogICBbZW5dVGhlIGA8b25zLWxpc3Q+YCBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLWxpc3TjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWxpc3QtaXRlbVxuICogICBbZW5dVGhlIGA8b25zLWxpc3QtaXRlbT5gIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtbGlzdC1pdGVt44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBjb2RlcGVuIHl4Y0N0XG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvbGlzdFxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1EaXNwbGF5IGEgTWF0ZXJpYWwgRGVzaWduIGxpc3QgaGVhZGVyLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtbGlzdD5cbiAqICAgPG9ucy1saXN0LWhlYWRlcj5IZWFkZXIgVGV4dDwvb25zLWxpc3QtaGVhZGVyPlxuICogICA8b25zLWxpc3QtaXRlbT5JdGVtPC9vbnMtbGlzdC1pdGVtPlxuICogICA8b25zLWxpc3QtaXRlbT5JdGVtPC9vbnMtbGlzdC1pdGVtPlxuICogPC9vbnMtbGlzdD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlzdEhlYWRlckVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBsaXN0IGhlYWRlci5bL2VuXVxuICAgKiAgIFtqYV3jg5jjg4Pjg4Djg7zjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fY29tcGlsZSgpO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKGRlZmF1bHRDbGFzc05hbWUpO1xuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ2NsYXNzJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCBkZWZhdWx0Q2xhc3NOYW1lLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5vbnNFbGVtZW50cy5MaXN0SGVhZGVyID0gTGlzdEhlYWRlckVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1saXN0LWhlYWRlcicsIExpc3RIZWFkZXJFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ2xpc3QtdGl0bGUnO1xuY29uc3Qgc2NoZW1lID0geycnOiAnbGlzdC10aXRsZS0tKid9O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1saXN0LXRpdGxlXG4gKiBAY2F0ZWdvcnkgbGlzdFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1SZXByZXNlbnRzIGEgbGlzdCB0aXRsZS5bL2VuXVxuICogICBbamFd44Oq44K544OI44Gu44K/44Kk44OI44Or44KS6KGo54++44GX44G+44GZ44CCWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLWxpc3QtdGl0bGU+TGlzdCBUaXRsZTwvb25zLWxpc3QtdGl0bGU+XG4gKiA8b25zLWxpc3Q+XG4gKiAgIDxvbnMtbGlzdC1pdGVtPkl0ZW08L29ucy1saXN0LWl0ZW0+XG4gKiA8L29ucy1saXN0PlxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1EaXNwbGF5IGEgTWF0ZXJpYWwgRGVzaWduIGxpc3QgdGl0bGUuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlzdFRpdGxlRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fY29tcGlsZSgpO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKGRlZmF1bHRDbGFzc05hbWUpO1xuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ2NsYXNzJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCBkZWZhdWx0Q2xhc3NOYW1lLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5vbnNFbGVtZW50cy5MaXN0VGl0bGUgPSBMaXN0VGl0bGVFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtbGlzdC10aXRsZScsIExpc3RUaXRsZUVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTggQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5pbXBvcnQgQmFzZUFuaW1hdG9yIGZyb20gJy4uLy4uL29ucy9iYXNlLWFuaW1hdG9yLmpzJztcblxuZXhwb3J0IGNsYXNzIExpc3RJdGVtQW5pbWF0b3IgZXh0ZW5kcyBCYXNlQW5pbWF0b3Ige1xuICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2xpbmVhcicsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjJ9ID0ge30pIHtcbiAgICBzdXBlcih7IHRpbWluZywgZGVsYXksIGR1cmF0aW9uIH0pO1xuICB9XG5cbiAgc2hvd0V4cGFuc2lvbihsaXN0SXRlbSwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgaGlkZUV4cGFuc2lvbihsaXN0SXRlbSwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTbGlkZUxpc3RJdGVtQW5pbWF0b3IgZXh0ZW5kcyBMaXN0SXRlbUFuaW1hdG9yIHtcblxuICBzaG93RXhwYW5zaW9uKGxpc3RJdGVtLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX2FuaW1hdGVFeHBhbnNpb24obGlzdEl0ZW0sIHRydWUsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGhpZGVFeHBhbnNpb24obGlzdEl0ZW0sIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fYW5pbWF0ZUV4cGFuc2lvbihsaXN0SXRlbSwgZmFsc2UsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIF9hbmltYXRlRXhwYW5zaW9uKGxpc3RJdGVtLCBzaG91bGRPcGVuLCBjYWxsYmFjaykge1xuICAgIC8vIFRvIGFuaW1hdGUgdGhlIG9wZW5pbmcgb2YgdGhlIGV4cGFuc2lvbiBwYW5lbCBjb3JyZWN0bHksIHdlIG5lZWQgdG8ga25vdyBpdHNcbiAgICAvLyBoZWlnaHQuIFRvIGNhbGN1bGF0ZSB0aGlzLCB3ZSBzZXQgaXRzIGhlaWdodCB0byBhdXRvLCBhbmQgdGhlbiBnZXQgdGhlIGNvbXB1dGVkXG4gICAgLy8gaGVpZ2h0IGFuZCBwYWRkaW5nLiBPbmNlIHRoaXMgaXMgZG9uZSwgd2Ugc2V0IHRoZSBoZWlnaHQgYmFjayB0byBpdHMgb3JpZ2luYWwgdmFsdWUuXG4gICAgY29uc3Qgb2xkSGVpZ2h0ID0gbGlzdEl0ZW0uZXhwYW5kYWJsZUNvbnRlbnQuc3R5bGUuaGVpZ2h0O1xuICAgIGNvbnN0IG9sZERpc3BsYXkgPSBsaXN0SXRlbS5leHBhbmRhYmxlQ29udGVudC5zdHlsZS5kaXNwbGF5O1xuICAgIGxpc3RJdGVtLmV4cGFuZGFibGVDb250ZW50LnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICBsaXN0SXRlbS5leHBhbmRhYmxlQ29udGVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobGlzdEl0ZW0uZXhwYW5kYWJsZUNvbnRlbnQpO1xuXG4gICAgY29uc3QgZXhwYW5zaW9uT3BlblRyYW5zaXRpb24gPSBbXG4gICAgICB7IGhlaWdodDogMCwgcGFkZGluZ1RvcDogMCwgcGFkZGluZ0JvdHRvbTogMCB9LFxuICAgICAge1xuICAgICAgICBoZWlnaHQ6IGNvbXB1dGVkU3R5bGUuaGVpZ2h0LFxuICAgICAgICBwYWRkaW5nVG9wOiBjb21wdXRlZFN0eWxlLnBhZGRpbmdUb3AsXG4gICAgICAgIHBhZGRpbmdCb3R0b206IGNvbXB1dGVkU3R5bGUucGFkZGluZ0JvdHRvbSxcbiAgICAgIH1cbiAgICBdO1xuICAgIGNvbnN0IGljb25PcGVuVHJhbnNpdGlvbiA9IFt7dHJhbnNmb3JtOiAncm90YXRlKDQ1ZGVnKSd9LCB7dHJhbnNmb3JtOiAncm90YXRlKDIyNWRlZyknfV07XG5cbiAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHRoZSB2YWx1ZXMgd2UgbmVlZCwgcmVzZXQgdGhlIGhlaWdodCBiYWNrIHRvIGl0cyBvcmlnaW5hbCBzdGF0ZVxuICAgIGxpc3RJdGVtLmV4cGFuZGFibGVDb250ZW50LnN0eWxlLmhlaWdodCA9IG9sZEhlaWdodDtcblxuICAgIGFuaW1pdChsaXN0SXRlbS5leHBhbmRhYmxlQ29udGVudCwgeyBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbiwgcHJvcGVydHk6ICdoZWlnaHQgcGFkZGluZy10b3AgcGFkZGluZy1ib3R0b20nIH0pXG4gICAgICAuZGVmYXVsdCguLi4oc2hvdWxkT3BlbiA/IGV4cGFuc2lvbk9wZW5UcmFuc2l0aW9uIDogZXhwYW5zaW9uT3BlblRyYW5zaXRpb24ucmV2ZXJzZSgpKSlcbiAgICAgIC5wbGF5KCgpID0+IHtcbiAgICAgICAgbGlzdEl0ZW0uZXhwYW5kYWJsZUNvbnRlbnQuc3R5bGUuZGlzcGxheSA9IG9sZERpc3BsYXk7XG4gICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICB9KTtcblxuICAgIGlmIChsaXN0SXRlbS5leHBhbmRDaGV2cm9uKSB7XG4gICAgICBhbmltaXQobGlzdEl0ZW0uZXhwYW5kQ2hldnJvbiwgeyBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbiwgcHJvcGVydHk6ICd0cmFuc2Zvcm0nIH0pXG4gICAgICAgIC5kZWZhdWx0KC4uLihzaG91bGRPcGVuID8gaWNvbk9wZW5UcmFuc2l0aW9uIDogaWNvbk9wZW5UcmFuc2l0aW9uLnJldmVyc2UoKSkpXG4gICAgICAgIC5wbGF5KCk7XG4gICAgfVxuICB9XG5cbn0iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vb25zL2FuaW1pdC5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgc3R5bGVyIGZyb20gJy4uL29ucy9zdHlsZXIuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEFuaW1hdG9yRmFjdG9yeSBmcm9tICcuLi9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyc7XG5pbXBvcnQgeyBMaXN0SXRlbUFuaW1hdG9yLCBTbGlkZUxpc3RJdGVtQW5pbWF0b3IgfSBmcm9tICcuL29ucy1saXN0LWl0ZW0vYW5pbWF0b3IuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnbGlzdC1pdGVtJztcbmNvbnN0IHNjaGVtZSA9IHtcbiAgJy5saXN0LWl0ZW0nOiAnbGlzdC1pdGVtLS0qJyxcbiAgJy5saXN0LWl0ZW1fX2xlZnQnOiAnbGlzdC1pdGVtLS0qX19sZWZ0JyxcbiAgJy5saXN0LWl0ZW1fX2NlbnRlcic6ICdsaXN0LWl0ZW0tLSpfX2NlbnRlcicsXG4gICcubGlzdC1pdGVtX19yaWdodCc6ICdsaXN0LWl0ZW0tLSpfX3JpZ2h0JyxcbiAgJy5saXN0LWl0ZW1fX2xhYmVsJzogJ2xpc3QtaXRlbS0tKl9fbGFiZWwnLFxuICAnLmxpc3QtaXRlbV9fdGl0bGUnOiAnbGlzdC1pdGVtLS0qX190aXRsZScsXG4gICcubGlzdC1pdGVtX19zdWJ0aXRsZSc6ICdsaXN0LWl0ZW0tLSpfX3N1YnRpdGxlJyxcbiAgJy5saXN0LWl0ZW1fX3RodW1ibmFpbCc6ICdsaXN0LWl0ZW0tLSpfX3RodW1ibmFpbCcsXG4gICcubGlzdC1pdGVtX19pY29uJzogJ2xpc3QtaXRlbS0tKl9faWNvbidcbn07XG5cbmNvbnN0IF9hbmltYXRvckRpY3QgPSB7XG4gICdkZWZhdWx0JzogU2xpZGVMaXN0SXRlbUFuaW1hdG9yLFxuICAnbm9uZSc6IExpc3RJdGVtQW5pbWF0b3Jcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWxpc3QtaXRlbVxuICogQGNhdGVnb3J5IGxpc3RcbiAqIEBtb2RpZmllciB0YXBwYWJsZVxuICogICBbZW5dTWFrZSB0aGUgbGlzdCBpdGVtIGNoYW5nZSBhcHBlYXJhbmNlIHdoZW4gaXQncyB0YXBwZWQuIE9uIGlPUyBpdCBpcyBiZXR0ZXIgdG8gdXNlIHRoZSBcInRhcHBhYmxlXCIgYW5kIFwidGFwLWJhY2tncm91bmQtY29sb3JcIiBhdHRyaWJ1dGUgZm9yIGJldHRlciBiZWhhdmlvciB3aGVuIHNjcm9sbGluZy5bL2VuXVxuICogICBbamFd44K/44OD44OX44KE44Kv44Oq44OD44Kv44GX44Gf5pmC44Gr5Yq55p6c44GM6KGo56S644GV44KM44KL44KI44GG44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAqIEBtb2RpZmllciBjaGV2cm9uXG4gKiAgIFtlbl1EaXNwbGF5IGEgY2hldnJvbiBhdCB0aGUgcmlnaHQgZW5kIG9mIHRoZSBsaXN0IGl0ZW0gYW5kIG1ha2UgaXQgY2hhbmdlIGFwcGVhcmFuY2Ugd2hlbiB0YXBwZWQuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAbW9kaWZpZXIgbG9uZ2RpdmlkZXJcbiAqICAgW2VuXURpc3BsYXlzIGEgbG9uZyBob3Jpem9udGFsIGRpdmlkZXIgYmV0d2VlbiBpdGVtcy5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBtb2RpZmllciBub2RpdmlkZXJcbiAqICAgW2VuXVJlbW92ZXMgdGhlIGRpdmlkZXIgYmV0d2VlbiBsaXN0IGl0ZW1zLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1EaXNwbGF5IGEgTWF0ZXJpYWwgRGVzaWduIGxpc3QgaXRlbS5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgQ29tcG9uZW50IHRoYXQgcmVwcmVzZW50cyBlYWNoIGl0ZW0gaW4gYSBsaXN0LiBUaGUgbGlzdCBpdGVtIGlzIGNvbXBvc2VkIG9mIGZvdXIgcGFydHMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgd2l0aCB0aGUgYGxlZnRgLCBgY2VudGVyYCwgYHJpZ2h0YCBhbmQgYGV4cGFuZGFibGUtY29udGVudGAgY2xhc3Nlcy4gVGhlc2UgY2xhc3NlcyBjYW4gYmUgdXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgY29udGVudCBvZiB0aGUgbGlzdCBpdGVtcyBpcyBwcm9wZXJseSBhbGlnbmVkLlxuICpcbiAqICAgICBgYGBcbiAqICAgICA8b25zLWxpc3QtaXRlbT5cbiAqICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+TGVmdDwvZGl2PlxuICogICAgICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPkNlbnRlcjwvZGl2PlxuICogICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0XCI+UmlnaHQ8L2Rpdj5cbiAqICAgICAgIDxkaXYgY2xhc3M9XCJleHBhbmRhYmxlLWNvbnRlbnRcIj5FeHBhbmRhYmxlIGNvbnRlbnQ8L2Rpdj5cbiAqICAgICA8L29ucy1saXN0LWl0ZW0+XG4gKiAgICAgYGBgXG4gKlxuICogICAgIFRoZXJlIGFyZSBhbHNvIGEgbnVtYmVyIG9mIGNsYXNzZXMgKHByZWZpeGVkIHdpdGggYGxpc3QtaXRlbV9fKmApIHRoYXQgaGVscCB3aGVuIHB1dHRpbmcgdGhpbmdzIGxpa2UgaWNvbnMgYW5kIHRodW1ibmFpbHMgaW50byB0aGUgbGlzdCBpdGVtcy5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtbGlzdFxuICogICBbZW5db25zLWxpc3QgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1saXN044Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1saXN0LWhlYWRlclxuICogICBbZW5db25zLWxpc3QtaGVhZGVyIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtbGlzdC1oZWFkZXLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGNvZGVwZW4geXhjQ3RcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9saXN0XG4gKiBAZXhhbXBsZVxuICogPG9ucy1saXN0LWl0ZW0+XG4gKiAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gKiAgICAgPG9ucy1pY29uIGljb249XCJtZC1mYWNlXCIgY2xhc3M9XCJsaXN0LWl0ZW1fX2ljb25cIj48L29ucy1pY29uPlxuICogICA8L2Rpdj5cbiAqICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICogICAgIDxkaXYgY2xhc3M9XCJsaXN0LWl0ZW1fX3RpdGxlXCI+VGl0bGU8L2Rpdj5cbiAqICAgICA8ZGl2IGNsYXNzPVwibGlzdC1pdGVtX19zdWJ0aXRsZVwiPlN1YnRpdGxlPC9kaXY+XG4gKiAgIDwvZGl2PlxuICogICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAqICAgICA8b25zLXN3aXRjaD48L29ucy1zd2l0Y2g+XG4gKiAgIDwvZGl2PlxuICogPC9vbnMtbGlzdC1pdGVtPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXN0SXRlbUVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBsaXN0IGl0ZW0uWy9lbl1cbiAgICogICBbamFd5ZCE6KaB57Sg44Gu6KGo54++44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbG9jay1vbi1kcmFnXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUHJldmVudCB2ZXJ0aWNhbCBzY3JvbGxpbmcgd2hlbiB0aGUgdXNlciBkcmFncyBob3Jpem9udGFsbHkuWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL44Go44CB44Om44O844K244O844GM44GT44Gu6KaB57Sg44KS5qiq5pa55ZCR44Gr44OJ44Op44OD44Kw44GX44Gm44GE44KL5pmC44Gr44CB57im5pa55ZCR44Gu44K544Kv44Ot44O844Or44GM6LW344GN44Gq44GE44KI44GG44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBsb2NrT25EcmFnXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUHJldmVudCB2ZXJ0aWNhbCBzY3JvbGxpbmcgd2hlbiB0aGUgdXNlciBkcmFncyBob3Jpem9udGFsbHkuWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL44Go44CB44Om44O844K244O844GM44GT44Gu6KaB57Sg44KS5qiq5pa55ZCR44Gr44OJ44Op44OD44Kw44GX44Gm44GE44KL5pmC44Gr44CB57im5pa55ZCR44Gu44K544Kv44Ot44O844Or44GM6LW344GN44Gq44GE44KI44GG44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdGFwcGFibGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1NYWtlcyB0aGUgZWxlbWVudCByZWFjdCB0byB0YXBzLiBgcHJldmVudC10YXBgIGF0dHJpYnV0ZSBjYW4gYmUgYWRkZWQgdG8gY2hpbGQgZWxlbWVudHMgbGlrZSBidXR0b25zIG9yIGlucHV0cyB0byBwcmV2ZW50IHRoaXMgZWZmZWN0LiBgb25zLSpgIGVsZW1lbnRzIGFyZSBpZ25vcmVkIGJ5IGRlZmF1bHQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB0YXBwYWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXU1ha2VzIHRoZSBlbGVtZW50IHJlYWN0IHRvIHRhcHMuIGBwcmV2ZW50LXRhcGAgYXR0cmlidXRlIGNhbiBiZSBhZGRlZCB0byBjaGlsZCBlbGVtZW50cyBsaWtlIGJ1dHRvbnMgb3IgaW5wdXRzIHRvIHByZXZlbnQgdGhpcyBlZmZlY3QuIGBvbnMtKmAgZWxlbWVudHMgYXJlIGlnbm9yZWQgYnkgZGVmYXVsdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB0YXAtYmFja2dyb3VuZC1jb2xvclxuICAgKiBAdHlwZSB7Q29sb3J9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl0gQ2hhbmdlcyB0aGUgYmFja2dyb3VuZCBjb2xvciB3aGVuIHRhcHBlZC4gRm9yIHRoaXMgdG8gd29yaywgdGhlIGF0dHJpYnV0ZSBcInRhcHBhYmxlXCIgbmVlZHMgdG8gYmUgc2V0LiBUaGUgZGVmYXVsdCBjb2xvciBpcyBcIiNkOWQ5ZDlcIi4gSXQgd2lsbCBkaXNwbGF5IGFzIGEgcmlwcGxlIGVmZmVjdCBvbiBBbmRyb2lkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdGFwQmFja2dyb3VuZENvbG9yXG4gICAqIEB0eXBlIHtDb2xvcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXSBDaGFuZ2VzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHdoZW4gdGFwcGVkLiBGb3IgdGhpcyB0byB3b3JrLCB0aGUgYXR0cmlidXRlIFwidGFwcGFibGVcIiBuZWVkcyB0byBiZSBzZXQuIFRoZSBkZWZhdWx0IGNvbG9yIGlzIFwiI2Q5ZDlkOVwiLiBJdCB3aWxsIGRpc3BsYXkgYXMgYSByaXBwbGUgZWZmZWN0IG9uIEFuZHJvaWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZXhwYW5kYWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXU1ha2VzIHRoZSBlbGVtZW50IGFibGUgdG8gYmUgZXhwYW5kZWQgdG8gcmV2ZWFsIGV4dHJhIGNvbnRlbnQuIEZvciB0aGlzIHRvIHdvcmssIHRoZSBleHBhbmRhYmxlIGNvbnRlbnQgbXVzdCBiZSBkZWZpbmVkIGluIGBkaXYuZXhwYW5kYWJsZS1jb250ZW50YC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGV4cGFuZGFibGVcbiAgICogQGluaXRvbmx5XG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dTWFrZXMgdGhlIGVsZW1lbnQgYWJsZSB0byBiZSBleHBhbmRlZCB0byByZXZlYWwgZXh0cmEgY29udGVudC4gRm9yIHRoaXMgdG8gd29yaywgdGhlIGV4cGFuZGFibGUgY29udGVudCBtdXN0IGJlIGRlZmluZWQgaW4gYGRpdi5leHBhbmRhYmxlLWNvbnRlbnRgLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGV4cGFuZGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRm9yIGV4cGFuZGFibGUgbGlzdCBpdGVtcywgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGV4cGFuZGFibGUgY29udGVudCBpcyBleHBhbmRlZCBvciBub3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBleHBhbmRlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZvciBleHBhbmRhYmxlIGxpc3QgaXRlbXMsIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBleHBhbmRhYmxlIGNvbnRlbnQgaXMgZXhwYW5kZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgZXhwYW5kXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Gb3IgZXhwYW5kYWJsZSBsaXN0IGl0ZW1zLCBmaXJlcyB3aGVuIHRoZSBsaXN0IGl0ZW0gaXMgZXhwYW5kZWQgb3IgY29udHJhY3RlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlZmF1bHQgZGVmYXVsdFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBzaG93aW5nIGFuZCBoaWRpbmcgdGhlIGV4cGFuZGFibGUgY29udGVudC4gQ2FuIGJlIGVpdGhlciBgXCJkZWZhdWx0XCJgIG9yIGBcIm5vbmVcImAuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFuaW1hdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCBkZWZhdWx0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhbmltYXRpb24gdXNlZCB3aGVuIHNob3dpbmcgYW5kIGhpZGluZyB0aGUgZXhwYW5kYWJsZSBjb250ZW50LiBDYW4gYmUgZWl0aGVyIGBcImRlZmF1bHRcImAgb3IgYFwibm9uZVwiYC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9hbmltYXRvckZhY3RvcnkgPSB0aGlzLl91cGRhdGVBbmltYXRvckZhY3RvcnkoKTtcblxuICAgIC8vIEVsZW1lbnRzIGlnbm9yZWQgd2hlbiB0YXBwaW5nXG4gICAgY29uc3QgcmUgPSAvXm9ucy0oPyFjb2wkfHJvdyR8aWYkKS9pO1xuICAgIHRoaXMuX3Nob3VsZElnbm9yZVRhcCA9IGUgPT4gZS5oYXNBdHRyaWJ1dGUoJ3ByZXZlbnQtdGFwJykgfHwgcmUudGVzdChlLnRhZ05hbWUpO1xuXG4gICAgLy8gc2hvdyBhbmQgaGlkZSBmdW5jdGlvbnMgZm9yIFZ1ZSBoaWRhYmxlIG1peGluXG4gICAgdGhpcy5zaG93ID0gdGhpcy5zaG93RXhwYW5zaW9uO1xuICAgIHRoaXMuaGlkZSA9IHRoaXMuaGlkZUV4cGFuc2lvbjtcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGlsZXMgdGhlIGxpc3QgaXRlbS5cbiAgICpcbiAgICogVmFyaW91cyBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiB0aGUgYm9keSBvZiBhIGxpc3QgaXRlbTpcbiAgICpcbiAgICogIC0gZGl2LmxlZnQsIGRpdi5yaWdodCwgYW5kIGRpdi5jZW50ZXIgYXJlIGFsbG93ZWQgYXMgZGlyZWN0IGNoaWxkcmVuXG4gICAqICAtIGlmIGRpdi5jZW50ZXIgaXMgbm90IGRlZmluZWQsIGFueXRoaW5nIHRoYXQgaXNuJ3QgZGl2LmxlZnQsIGRpdi5yaWdodCBvciBkaXYuZXhwYW5kYWJsZS1jb250ZW50IHdpbGwgYmUgcHV0IGluIGEgZGl2LmNlbnRlclxuICAgKiAgLSBpZiBkaXYuY2VudGVyIGlzIGRlZmluZWQsIGFueXRoaW5nIHRoYXQgaXNuJ3QgZGl2LmxlZnQsIGRpdi5yaWdodCBvciBkaXYuZXhwYW5kYWJsZS1jb250ZW50IHdpbGwgYmUgaWdub3JlZFxuICAgKiAgLSBpZiBsaXN0IGl0ZW0gaGFzIGV4cGFuZGFibGUgYXR0cmlidXRlOlxuICAgKiAgICAgIC0gZGl2LmV4cGFuZGFibGUtY29udGVudCBpcyBhbGxvd2VkIGFzIGEgZGlyZWN0IGNoaWxkXG4gICAqICAgICAgLSBkaXYudG9wIGlzIGFsbG93ZWQgYXMgZGlyZWN0IGNoaWxkXG4gICAqICAgICAgLSBpZiBkaXYudG9wIGlzIGRlZmluZWQsIGFueXRoaW5nIHRoYXQgaXNuJ3QgZGl2LmV4cGFuZGFibGUtY29udGVudCBzaG91bGQgYmUgaW5zaWRlIGRpdi50b3AgLSBhbnl0aGluZyBlbHNlIHdpbGwgYmUgaWdub3JlZFxuICAgKiAgICAgIC0gaWYgZGl2LnJpZ2h0IGlzIG5vdCBkZWZpbmVkLCBhIGRpdi5yaWdodCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCBhIGRyb3AtZG93biBjaGV2cm9uXG4gICAqXG4gICAqIFNlZSB0aGUgdGVzdHMgZm9yIGV4YW1wbGVzLlxuICAgKi9cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKGRlZmF1bHRDbGFzc05hbWUpO1xuXG4gICAgbGV0IHRvcCwgZXhwYW5kYWJsZUNvbnRlbnQ7XG4gICAgbGV0IHRvcENvbnRlbnQgPSBbXTtcbiAgICBBcnJheS5mcm9tKHRoaXMuY2hpbGROb2RlcykuZm9yRWFjaChub2RlID0+IHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICB0b3BDb250ZW50LnB1c2gobm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCd0b3AnKSkge1xuICAgICAgICB0b3AgPSBub2RlO1xuICAgICAgfSBlbHNlIGlmIChub2RlLmNsYXNzTGlzdC5jb250YWlucygnZXhwYW5kYWJsZS1jb250ZW50JykpIHtcbiAgICAgICAgZXhwYW5kYWJsZUNvbnRlbnQgPSBub2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdG9wQ29udGVudC5wdXNoKG5vZGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5ub2RlTmFtZSAhPT0gJ09OUy1SSVBQTEUnKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdG9wQ29udGVudCA9IHRvcCA/IEFycmF5LmZyb20odG9wLmNoaWxkTm9kZXMpIDogdG9wQ29udGVudDtcblxuICAgIGxldCBsZWZ0LCByaWdodCwgY2VudGVyO1xuICAgIGNvbnN0IGNlbnRlckNvbnRlbnQgPSBbXTtcbiAgICB0b3BDb250ZW50LmZvckVhY2gobm9kZSA9PiB7XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgY2VudGVyQ29udGVudC5wdXNoKG5vZGUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLmNsYXNzTGlzdC5jb250YWlucygnbGVmdCcpKSB7XG4gICAgICAgIGxlZnQgPSBub2RlO1xuICAgICAgfSBlbHNlIGlmIChub2RlLmNsYXNzTGlzdC5jb250YWlucygncmlnaHQnKSkge1xuICAgICAgICByaWdodCA9IG5vZGU7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdjZW50ZXInKSkge1xuICAgICAgICBjZW50ZXIgPSBub2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2VudGVyQ29udGVudC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdleHBhbmRhYmxlJykpIHtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtLS1leHBhbmRhYmxlJyk7XG5cbiAgICAgIGlmICghdG9wKSB7XG4gICAgICAgIHRvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0b3AuY2xhc3NMaXN0LmFkZCgndG9wJyk7XG4gICAgICB9XG4gICAgICB0b3AuY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtX190b3AnKTtcbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodG9wKTtcbiAgICAgIHRoaXMuX3RvcCA9IHRvcDtcblxuICAgICAgaWYgKGV4cGFuZGFibGVDb250ZW50KSB7XG4gICAgICAgIGV4cGFuZGFibGVDb250ZW50LmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbV9fZXhwYW5kYWJsZS1jb250ZW50Jyk7XG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoZXhwYW5kYWJsZUNvbnRlbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJpZ2h0KSB7XG4gICAgICAgIHJpZ2h0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHJpZ2h0LmNsYXNzTGlzdC5hZGQoJ2xpc3QtaXRlbV9fcmlnaHQnLCAncmlnaHQnKTtcblxuICAgICAgICAvLyBXZSBjYW5ub3QgdXNlIGEgcHNldWRvLWVsZW1lbnQgZm9yIHRoaXMgY2hldnJvbiwgYXMgd2UgY2Fubm90IGFuaW1hdGUgaXQgdXNpbmdcbiAgICAgICAgLy8gSlMuIFNvLCB3ZSBtYWtlIGEgY2hldnJvbiBzcGFuIGluc3RlYWQuXG4gICAgICAgIGNvbnN0IGNoZXZyb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIGNoZXZyb24uY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtX19leHBhbmQtY2hldnJvbicpO1xuICAgICAgICByaWdodC5hcHBlbmRDaGlsZChjaGV2cm9uKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNhc2Ugd2hlcmUgdGhlIGxpc3QgaXRlbSBzaG91bGQgYWxyZWFkeSBzdGFydCBleHBhbmRlZC5cbiAgICAgIC8vIEFkZGluZyB0aGUgY2xhc3MgZWFybHkgc3RvcHMgdGhlIGFuaW1hdGlvbiBmcm9tIHJ1bm5pbmcgYXQgc3RhcnR1cC5cbiAgICAgIGlmICh0aGlzLmV4cGFuZGVkKSB7XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtLS1leHBhbmRlZCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0b3AgPSB0aGlzO1xuICAgIH1cblxuICAgIGlmICghY2VudGVyKSB7XG4gICAgICBjZW50ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNlbnRlci5jbGFzc0xpc3QuYWRkKCdjZW50ZXInKTtcbiAgICAgIGNlbnRlckNvbnRlbnQuZm9yRWFjaChub2RlID0+IGNlbnRlci5hcHBlbmRDaGlsZChub2RlKSk7XG4gICAgfVxuICAgIGNlbnRlci5jbGFzc0xpc3QuYWRkKCdsaXN0LWl0ZW1fX2NlbnRlcicpO1xuICAgIHRvcC5hcHBlbmRDaGlsZChjZW50ZXIpO1xuXG4gICAgaWYgKGxlZnQpIHtcbiAgICAgIGxlZnQuY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtX19sZWZ0Jyk7XG4gICAgICB0b3AuYXBwZW5kQ2hpbGQobGVmdCk7XG4gICAgfVxuICAgIGlmIChyaWdodCkge1xuICAgICAgcmlnaHQuY2xhc3NMaXN0LmFkZCgnbGlzdC1pdGVtX19yaWdodCcpO1xuICAgICAgdG9wLmFwcGVuZENoaWxkKHJpZ2h0KTtcbiAgICB9XG5cbiAgICB1dGlsLnVwZGF0ZVJpcHBsZSh0aGlzKTtcbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzaG93RXhwYW5zaW9uXG4gICAqIEBzaWduYXR1cmUgc2hvd0V4cGFuc2lvbigpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHRoZSBleHBhbmRhYmxlIGNvbnRlbnQgaWYgdGhlIGVsZW1lbnQgaXMgZXhwYW5kYWJsZS5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgc2hvd0V4cGFuc2lvbigpIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGhpZGVFeHBhbnNpb25cbiAgICogQHNpZ25hdHVyZSBoaWRlRXhwYW5zaW9uKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUhpZGUgdGhlIGV4cGFuZGFibGUgY29udGVudCBpZiB0aGUgZWxlbWVudCBleHBhbmRhYmxlLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBoaWRlRXhwYW5zaW9uKCkge1xuICAgIHRoaXMuZXhwYW5kZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHRvZ2dsZUV4cGFuc2lvbigpIHtcbiAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuZXhwYW5kZWQ7XG4gIH1cblxuICBfYW5pbWF0ZUV4cGFuc2lvbigpIHtcbiAgICAvLyBTdG9wcyB0aGUgYW5pbWF0aW9uIGZyb20gcnVubmluZyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgbGlzdCBpdGVtIHNob3VsZCBzdGFydCBhbHJlYWR5IGV4cGFuZGVkXG4gICAgY29uc3QgZXhwYW5kZWRBdFN0YXJ0dXAgPSB0aGlzLmV4cGFuZGVkICYmIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaXN0LWl0ZW0tLWV4cGFuZGVkJyk7XG5cbiAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdleHBhbmRhYmxlJykgfHwgdGhpcy5fZXhwYW5kaW5nIHx8IGV4cGFuZGVkQXRTdGFydHVwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZXhwYW5kaW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IGV4cGFuZGVkQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9leHBhbmRpbmcgPSBmYWxzZTtcblxuICAgICAgaWYgKHRoaXMuZXhwYW5kZWQpIHtcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdsaXN0LWl0ZW0tLWV4cGFuZGVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoJ2xpc3QtaXRlbS0tZXhwYW5kZWQnKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgYW5pbWF0b3IgPSB0aGlzLl9hbmltYXRvckZhY3RvcnkubmV3QW5pbWF0b3IoKTtcblxuICAgIGlmIChhbmltYXRvci5fYW5pbWF0ZUV4cGFuc2lvbikge1xuICAgICAgYW5pbWF0b3IuX2FuaW1hdGVFeHBhbnNpb24odGhpcywgdGhpcy5leHBhbmRlZCwgZXhwYW5kZWRDYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4cGFuZGVkQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlQW5pbWF0b3JGYWN0b3J5KCkge1xuICAgIHJldHVybiBuZXcgQW5pbWF0b3JGYWN0b3J5KHtcbiAgICAgIGFuaW1hdG9yczogX2FuaW1hdG9yRGljdCxcbiAgICAgIGJhc2VDbGFzczogTGlzdEl0ZW1BbmltYXRvcixcbiAgICAgIGJhc2VDbGFzc05hbWU6ICdMaXN0SXRlbUFuaW1hdG9yJyxcbiAgICAgIGRlZmF1bHRBbmltYXRpb246IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKSB8fCAnZGVmYXVsdCdcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ2NsYXNzJywgJ3JpcHBsZScsICdhbmltYXRpb24nLCAnZXhwYW5kZWQnXTtcbiAgfVxuXG4gIGdldCBleHBhbmRhYmxlQ29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCcubGlzdC1pdGVtX19leHBhbmRhYmxlLWNvbnRlbnQnKTtcbiAgfVxuXG4gIGdldCBleHBhbmRDaGV2cm9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJy5saXN0LWl0ZW1fX2V4cGFuZC1jaGV2cm9uJyk7XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCBkZWZhdWx0Q2xhc3NOYW1lLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlwcGxlJzpcbiAgICAgICAgdXRpbC51cGRhdGVSaXBwbGUodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYW5pbWF0aW9uJzpcbiAgICAgICAgdGhpcy5fYW5pbWF0b3JGYWN0b3J5ID0gdGhpcy5fdXBkYXRlQW5pbWF0b3JGYWN0b3J5KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXhwYW5kZWQnOlxuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fYW5pbWF0ZUV4cGFuc2lvbigpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX3NldHVwTGlzdGVuZXJzKHRydWUpO1xuICAgICAgdGhpcy5fb3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnN0eWxlLmJhY2tncm91bmRDb2xvcjtcbiAgICAgIHRoaXMudGFwcGVkID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9zZXR1cExpc3RlbmVycyhmYWxzZSk7XG4gIH1cblxuICBfc2V0dXBMaXN0ZW5lcnMoYWRkKSB7XG4gICAgY29uc3QgYWN0aW9uID0gKGFkZCA/ICdhZGQnIDogJ3JlbW92ZScpICsgJ0V2ZW50TGlzdGVuZXInO1xuICAgIHV0aWxbYWN0aW9uXSh0aGlzLCAndG91Y2hzdGFydCcsIHRoaXMuX29uVG91Y2gsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICB1dGlsW2FjdGlvbl0odGhpcywgJ3RvdWNobW92ZScsIHRoaXMuX29uUmVsZWFzZSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIHRoaXNbYWN0aW9uXSgndG91Y2hjYW5jZWwnLCB0aGlzLl9vblJlbGVhc2UpO1xuICAgIHRoaXNbYWN0aW9uXSgndG91Y2hlbmQnLCB0aGlzLl9vblJlbGVhc2UpO1xuICAgIHRoaXNbYWN0aW9uXSgndG91Y2hsZWF2ZScsIHRoaXMuX29uUmVsZWFzZSk7XG4gICAgdGhpc1thY3Rpb25dKCdkcmFnJywgdGhpcy5fb25EcmFnKTtcbiAgICB0aGlzW2FjdGlvbl0oJ21vdXNlZG93bicsIHRoaXMuX29uVG91Y2gpO1xuICAgIHRoaXNbYWN0aW9uXSgnbW91c2V1cCcsIHRoaXMuX29uUmVsZWFzZSk7XG4gICAgdGhpc1thY3Rpb25dKCdtb3VzZW91dCcsIHRoaXMuX29uUmVsZWFzZSk7XG5cbiAgICBpZiAodGhpcy5fdG9wKSB7XG4gICAgICB0aGlzLl90b3BbYWN0aW9uXSgnY2xpY2snLCB0aGlzLl9vbkNsaWNrVG9wLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIF9vbkNsaWNrVG9wKCkge1xuICAgIGlmICghdGhpcy5fZXhwYW5kaW5nKSB7XG4gICAgICB0aGlzLnRvZ2dsZUV4cGFuc2lvbigpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnZXhwYW5kJykpO1xuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnZXhwYW5zaW9uJykpOyAvLyBleHBhbnNpb24gaXMgZGVwcmVjYXRlZCBidXQgZW1pdCB0byBhdm9pZCBicmVha2luZyB1c2VyIGNvZGVcbiAgICB9XG4gIH1cblxuICBfb25EcmFnKGV2ZW50KSB7XG4gICAgY29uc3QgZ2VzdHVyZSA9IGV2ZW50Lmdlc3R1cmU7XG4gICAgLy8gUHJldmVudCB2ZXJ0aWNhbCBzY3JvbGxpbmcgaWYgdGhlIHVzZXJzIHBhbnMgbGVmdCBvciByaWdodC5cbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2xvY2stb24tZHJhZycpICYmIFsnbGVmdCcsICdyaWdodCddLmluZGV4T2YoZ2VzdHVyZS5kaXJlY3Rpb24pID4gLTEpIHtcbiAgICAgIGdlc3R1cmUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBfb25Ub3VjaChlKSB7XG4gICAgaWYgKHRoaXMudGFwcGVkIHx8XG4gICAgICAodGhpcyAhPT0gZS50YXJnZXQgJiYgKHRoaXMuX3Nob3VsZElnbm9yZVRhcChlLnRhcmdldCkgfHwgdXRpbC5maW5kUGFyZW50KGUudGFyZ2V0LCB0aGlzLl9zaG91bGRJZ25vcmVUYXAsIHAgPT4gcCA9PT0gdGhpcykpKVxuICAgICkge1xuICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgdGFwXG4gICAgfVxuXG4gICAgdGhpcy50YXBwZWQgPSB0cnVlO1xuICAgIGNvbnN0IHRvdWNoU3R5bGUgPSB7IHRyYW5zaXRpb246ICdiYWNrZ3JvdW5kLWNvbG9yIDAuMHMgbGluZWFyIDAuMDJzLCBib3gtc2hhZG93IDAuMHMgbGluZWFyIDAuMDJzJyB9O1xuXG4gICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCd0YXBwYWJsZScpKSB7XG4gICAgICBpZiAodGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgdGhpcy5fb3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLnN0eWxlLmJhY2tncm91bmRDb2xvcjtcbiAgICAgIH1cblxuICAgICAgdG91Y2hTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmdldEF0dHJpYnV0ZSgndGFwLWJhY2tncm91bmQtY29sb3InKSB8fCAnI2Q5ZDlkOSc7XG4gICAgICB0b3VjaFN0eWxlLmJveFNoYWRvdyA9IGAwcHggLTFweCAwcHggMHB4ICR7dG91Y2hTdHlsZS5iYWNrZ3JvdW5kQ29sb3J9YDtcbiAgICB9XG5cbiAgICBzdHlsZXIodGhpcywgdG91Y2hTdHlsZSk7XG4gIH1cblxuICBfb25SZWxlYXNlKCkge1xuICAgIHRoaXMudGFwcGVkID0gZmFsc2U7XG4gICAgdGhpcy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLl9vcmlnaW5hbEJhY2tncm91bmRDb2xvciB8fCAnJztcbiAgICBzdHlsZXIuY2xlYXIodGhpcywgJ3RyYW5zaXRpb24gYm94U2hhZG93Jyk7XG4gIH1cbn1cblxudXRpbC5kZWZpbmVCb29sZWFuUHJvcGVydGllcyhMaXN0SXRlbUVsZW1lbnQsIFsnZXhwYW5kZWQnLCAnZXhwYW5kYWJsZScsICd0YXBwYWJsZScsICdsb2NrLW9uLWRyYWcnXSk7XG51dGlsLmRlZmluZVN0cmluZ1Byb3BlcnRpZXMoTGlzdEl0ZW1FbGVtZW50LCBbJ2FuaW1hdGlvbicsICd0YXAtYmFja2dyb3VuZC1jb2xvciddKTtcblxub25zRWxlbWVudHMuTGlzdEl0ZW0gPSBMaXN0SXRlbUVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1saXN0LWl0ZW0nLCBMaXN0SXRlbUVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnbGlzdCc7XG5jb25zdCBzY2hlbWUgPSB7Jyc6ICdsaXN0LS0qJ307XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWxpc3RcbiAqIEBjYXRlZ29yeSBsaXN0XG4gKiBAbW9kaWZpZXIgaW5zZXRcbiAqICAgW2VuXUluc2V0IGxpc3QgdGhhdCBkb2Vzbid0IGNvdmVyIHRoZSB3aG9sZSB3aWR0aCBvZiB0aGUgcGFyZW50LlsvZW5dXG4gKiAgIFtqYV3opqropoHntKDjga7nlLvpnaLjgYTjgaPjgbHjgYTjgavluoPjgYzjgonjgarjgYTjg6rjgrnjg4jjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQG1vZGlmaWVyIG5vYm9yZGVyXG4gKiAgIFtlbl1BIGxpc3Qgd2l0aCBubyBib3JkZXJzIGF0IHRoZSB0b3AgYW5kIGJvdHRvbS5bL2VuXVxuICogICBbamFd44Oq44K544OI44Gu5LiK5LiL44Gu44Oc44O844OA44O844GM54Sh44GE44Oq44K544OI44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQ29tcG9uZW50IHRvIGRlZmluZSBhIGxpc3QsIGFuZCB0aGUgY29udGFpbmVyIGZvciBvbnMtbGlzdC1pdGVtKHMpLlsvZW5dXG4gKiAgIFtqYV3jg6rjgrnjg4jjgpLooajnj77jgZnjgovjgZ/jgoHjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjgIJvbnMtbGlzdC1pdGVt44Gu44Kz44Oz44OG44OK44Go44GX44Gm5L2/55So44GX44G+44GZ44CCWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1saXN0LWl0ZW1cbiAqICAgW2VuXW9ucy1saXN0LWl0ZW0gY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1saXN0LWl0ZW3jgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWxpc3QtaGVhZGVyXG4gKiAgIFtlbl1vbnMtbGlzdC1oZWFkZXIgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1saXN0LWhlYWRlcuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtbGF6eS1yZXBlYXRcbiAqICAgW2VuXW9ucy1sYXp5LXJlcGVhdCBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLWxhenktcmVwZWF044Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBjb2RlcGVuIHl4Y0N0XG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvbGlzdFxuICogQGV4YW1wbGVcbiAqIDxvbnMtbGlzdD5cbiAqICAgPG9ucy1saXN0LWhlYWRlcj5IZWFkZXIgVGV4dDwvb25zLWxpc3QtaGVhZGVyPlxuICogICA8b25zLWxpc3QtaXRlbT5JdGVtPC9vbnMtbGlzdC1pdGVtPlxuICogICA8b25zLWxpc3QtaXRlbT5JdGVtPC9vbnMtbGlzdC1pdGVtPlxuICogPC9vbnMtbGlzdD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlzdEVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBsaXN0LlsvZW5dXG4gICAqICAgW2phXeODquOCueODiOOBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9jb21waWxlKCk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInLCAnY2xhc3MnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIGRlZmF1bHRDbGFzc05hbWUsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbm9uc0VsZW1lbnRzLkxpc3QgPSBMaXN0RWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLWxpc3QnLCBMaXN0RWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi4vLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uLy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBJTlBVVF9BVFRSSUJVVEVTID0gW1xuICAnYXV0b2NhcGl0YWxpemUnLFxuICAnYXV0b2NvbXBsZXRlJyxcbiAgJ2F1dG9jb3JyZWN0JyxcbiAgJ2F1dG9mb2N1cycsXG4gICdkaXNhYmxlZCcsXG4gICdpbnB1dG1vZGUnLFxuICAnbWF4JyxcbiAgJ21heGxlbmd0aCcsXG4gICdtaW4nLFxuICAnbWlubGVuZ3RoJyxcbiAgJ25hbWUnLFxuICAncGF0dGVybicsXG4gICdwbGFjZWhvbGRlcicsXG4gICdyZWFkb25seScsXG4gICdyZXF1aXJlZCcsXG4gICdzaXplJyxcbiAgJ3NwZWxsY2hlY2snLFxuICAnc3RlcCcsXG4gICd2YWxpZGF0b3InLFxuICAndmFsdWUnXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlSW5wdXRFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIF91cGRhdGUoKSB7fSAvLyBPcHRpb25hbGx5IGltcGxlbWVudGVkXG5cbiAgZ2V0IF9zY2hlbWUoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ2V0dGVyLXJldHVyblxuICAgIHV0aWwudGhyb3dNZW1iZXIoKTtcbiAgfVxuXG4gIGdldCBfdGVtcGxhdGUoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ2V0dGVyLXJldHVyblxuICAgIHV0aWwudGhyb3dNZW1iZXIoKTtcbiAgfVxuXG4gIGdldCB0eXBlKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGdldHRlci1yZXR1cm5cbiAgICB1dGlsLnRocm93TWVtYmVyKCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VJbnB1dEVsZW1lbnQpIHtcbiAgICAgIHV0aWwudGhyb3dBYnN0cmFjdCgpO1xuICAgIH1cblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl9jb21waWxlKCkpO1xuICAgIHRoaXMuX2JvdW5kRGVsZWdhdGVFdmVudCA9IHRoaXMuX2RlbGVnYXRlRXZlbnQuYmluZCh0aGlzKTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuICAgIHRoaXMuX2RlZmF1bHRDbGFzc05hbWUgJiYgdGhpcy5jbGFzc0xpc3QuYWRkKHRoaXMuX2RlZmF1bHRDbGFzc05hbWUpO1xuXG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoICE9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hcHBlbmRDaGlsZCh1dGlsLmNyZWF0ZUZyYWdtZW50KHRoaXMuX3RlbXBsYXRlKSk7XG5cbiAgICB0aGlzLl9zZXRJbnB1dElkKCk7XG5cbiAgICB0aGlzLl91cGRhdGVCb3VuZEF0dHJpYnV0ZXMoKTtcblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgdGhpcy5fc2NoZW1lKTtcbiAgfVxuXG4gIF91cGRhdGVCb3VuZEF0dHJpYnV0ZXMoKSB7XG4gICAgSU5QVVRfQVRUUklCVVRFUy5mb3JFYWNoKGF0dHIgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKGF0dHIpKSB7XG4gICAgICAgIHRoaXMuX2lucHV0LnNldEF0dHJpYnV0ZShhdHRyLCB0aGlzLmdldEF0dHJpYnV0ZShhdHRyKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pbnB1dC5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgfVxuXG4gIF9kZWxlZ2F0ZUV2ZW50KGV2ZW50KSB7XG4gICAgY29uc3QgZSA9IG5ldyBDdXN0b21FdmVudChldmVudC50eXBlLCB7XG4gICAgICBidWJibGVzOiBmYWxzZSxcbiAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoZSk7XG4gIH1cblxuICBfc2V0SW5wdXRJZCgpIHtcbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2lucHV0LWlkJykpIHtcbiAgICAgIHRoaXMuX2lucHV0LmlkID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lucHV0LWlkJyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IF9kZWZhdWx0Q2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGdldCBfaW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5wdXQgPT09IG51bGxcbiAgICAgID8gdGhpcy5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJylcbiAgICAgIDogdGhpcy5faW5wdXQudmFsdWU7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHZhbCA9IHZhbC50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9pbnB1dC52YWx1ZSA9IHZhbDtcbiAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fYm91bmREZWxlZ2F0ZUV2ZW50KTtcbiAgICAgIHRoaXMuX2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLl9ib3VuZERlbGVnYXRlRXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2lucHV0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fYm91bmREZWxlZ2F0ZUV2ZW50KTtcbiAgICAgIHRoaXMuX2lucHV0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLl9ib3VuZERlbGVnYXRlRXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInLCAnaW5wdXQtaWQnLCAnY2xhc3MnLCAuLi5JTlBVVF9BVFRSSUJVVEVTXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdtb2RpZmllcic6XG4gICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgdGhpcy5fc2NoZW1lKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW5wdXQtaWQnOlxuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fc2V0SW5wdXRJZCgpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIHRoaXMuX2RlZmF1bHRDbGFzc05hbWUsIHRoaXMuX3NjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChJTlBVVF9BVFRSSUJVVEVTLmluZGV4T2YobmFtZSkgPj0gMCkge1xuICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX3VwZGF0ZUJvdW5kQXR0cmlidXRlcygpKTtcbiAgICB9XG4gIH1cblxuICBibHVyKCkge1xuICAgIHRoaXMuX2lucHV0LmJsdXIoKTtcbiAgfVxuXG4gIGZvY3VzKCkge1xuICAgIHRoaXMuX2lucHV0LmZvY3VzKCk7XG4gIH1cbn1cblxudXRpbC5kZWZpbmVCb29sZWFuUHJvcGVydGllcyhCYXNlSW5wdXRFbGVtZW50LCBbJ2Rpc2FibGVkJ10pO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IEJhc2VJbnB1dEVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtaW5wdXQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJy50ZXh0LWlucHV0JzogJ3RleHQtaW5wdXQtLSonLFxuICAnLnRleHQtaW5wdXRfX2xhYmVsJzogJ3RleHQtaW5wdXQtLSpfX2xhYmVsJ1xufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtaW5wdXRcbiAqIEBjYXRlZ29yeSBmb3JtXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICBbZW5dRGlzcGxheXMgYSBNYXRlcmlhbCBEZXNpZ24gaW5wdXQuWy9lbl1cbiAqICBbamFdWy9qYV1cbiAqIEBtb2RpZmllciB1bmRlcmJhclxuICogIFtlbl1EaXNwbGF5cyBhIGhvcml6b250YWwgbGluZSB1bmRlcm5lYXRoIGEgdGV4dCBpbnB1dC5bL2VuXVxuICogIFtqYV1bL2phXVxuICogQG1vZGlmaWVyIHRyYW5zcGFyZW50XG4gKiAgW2VuXURpc3BsYXlzIGEgdHJhbnNwYXJlbnQgaW5wdXQuIFdvcmtzIGZvciBNYXRlcmlhbCBEZXNpZ24uWy9lbl1cbiAqICBbamFdWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1cbiAqICAgIEFuIGlucHV0IGVsZW1lbnQuIFRoZSBgdHlwZWAgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgaW5wdXQgdHlwZS4gQWxsIHRleHQgaW5wdXQgdHlwZXMgYXJlIHN1cHBvcnRlZC5cbiAqXG4gKiAgICBUaGUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSByZW5kZXIgYXMgYSBNYXRlcmlhbCBEZXNpZ24gaW5wdXQgb24gQW5kcm9pZCBkZXZpY2VzLlxuICpcbiAqICAgIE1vc3QgYXR0cmlidXRlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciBhIG5vcm1hbCBgPGlucHV0PmAgZWxlbWVudCBjYW4gYWxzbyBiZSB1c2VkIG9uIHRoZSBgPG9ucy1pbnB1dD5gIGVsZW1lbnQuXG4gKiAgWy9lbl1cbiAqICBbamFdWy9qYV1cbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9pbnB1dFxuICogQHNlZWFsc28gb25zLWNoZWNrYm94XG4gKiAgIFtlbl1UaGUgYDxvbnMtY2hlY2tib3g+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIGNoZWNrYm94LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXJhZGlvXG4gKiAgIFtlbl1UaGUgYDxvbnMtcmFkaW8+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHJhZGlvIGJ1dHRvbi5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1yYW5nZVxuICogICBbZW5dVGhlIGA8b25zLXJhbmdlPmAgZWxlbWVudCBpcyB1c2VkIHRvIGRpc3BsYXkgYSByYW5nZSBzbGlkZXIuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtc3dpdGNoXG4gKiAgIFtlbl1UaGUgYDxvbnMtc3dpdGNoPmAgZWxlbWVudCBpcyB1c2VkIHRvIGRpc3BsYXkgYSBkcmFnZ2FibGUgdG9nZ2xlIHN3aXRjaC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1zZWxlY3RcbiAqICAgW2VuXVRoZSBgPG9ucy1zZWxlY3Q+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHNlbGVjdCBib3guWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI21vZGlmaWVycyBbZW5dTW9yZSBkZXRhaWxzIGFib3V0IHRoZSBgbW9kaWZpZXJgIGF0dHJpYnV0ZVsvZW5dW2phXW1vZGlmaWVy5bGe5oCn44Gu5L2/44GE5pa5Wy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLWlucHV0IHBsYWNlaG9sZGVyPVwiVXNlcm5hbWVcIiBmbG9hdD48L29ucy1pbnB1dD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW5wdXRFbGVtZW50IGV4dGVuZHMgQmFzZUlucHV0RWxlbWVudCB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2JvdW5kT25JbnB1dCA9IHRoaXMuX3VwZGF0ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2JvdW5kT25Gb2N1c2luID0gdGhpcy5fdXBkYXRlLmJpbmQodGhpcyk7XG4gIH1cblxuICAvKiBJbmhlcml0ZWQgcHJvcHMgKi9cblxuICBfdXBkYXRlKCkge1xuICAgIHRoaXMuX3VwZGF0ZUxhYmVsKCk7XG4gICAgdGhpcy5fdXBkYXRlTGFiZWxDbGFzcygpO1xuICB9XG5cbiAgZ2V0IF9zY2hlbWUoKSB7XG4gICAgcmV0dXJuIHNjaGVtZTtcbiAgfVxuXG4gIGdldCBfdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxpbnB1dCB0eXBlPVwiJHt0aGlzLnR5cGV9XCIgY2xhc3M9XCJ0ZXh0LWlucHV0XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInRleHQtaW5wdXRfX2xhYmVsXCI+PC9zcGFuPlxuICAgIGA7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3R5cGUnKTtcbiAgICByZXR1cm4gKFsnY2hlY2tib3gnLCAncmFkaW8nXS5pbmRleE9mKHR5cGUpIDwgMCkgJiYgdHlwZSB8fCAndGV4dCc7XG4gIH1cblxuICBzZXQgdHlwZSh2YWx1ZSkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCd0eXBlJywgdmFsdWUpO1xuICB9XG5cbiAgLyogT3duIHByb3BzICovXG5cbiAgX3VwZGF0ZUxhYmVsKCkge1xuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJykgfHwgJyc7XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuX2hlbHBlci50ZXh0Q29udGVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuX2hlbHBlci50ZXh0Q29udGVudCA9IGxhYmVsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9oZWxwZXIuaW5uZXJUZXh0ID0gbGFiZWw7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZUxhYmVsQ2xhc3MoKSB7XG4gICAgaWYgKHRoaXMudmFsdWUgPT09ICcnKSB7XG4gICAgICB0aGlzLl9oZWxwZXIuY2xhc3NMaXN0LnJlbW92ZSgndGV4dC1pbnB1dC0tbWF0ZXJpYWxfX2xhYmVsLS1hY3RpdmUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faGVscGVyLmNsYXNzTGlzdC5hZGQoJ3RleHQtaW5wdXQtLW1hdGVyaWFsX19sYWJlbC0tYWN0aXZlJyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IF9oZWxwZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3Rvcignc3BhbicpO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl9pbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIHRoaXMuX2JvdW5kT25JbnB1dCk7XG4gICAgICB0aGlzLl9pbnB1dC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgdGhpcy5fYm91bmRPbkZvY3VzaW4pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCd0eXBlJyk7XG4gICAgaWYgKFsnY2hlY2tib3gnLCAncmFkaW8nXS5pbmRleE9mKHR5cGUpID49IDApIHtcbiAgICAgIHV0aWwud2FybihgV2FybjogPG9ucy1pbnB1dCB0eXBlPVwiJHt0eXBlfVwiPiBpcyBkZXByZWNhdGVkIHNpbmNlIHYyLjQuMC4gVXNlIDxvbnMtJHt0eXBlfT4gaW5zdGVhZC5gKTtcbiAgICB9XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2lucHV0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdGhpcy5fYm91bmRPbklucHV0KTtcbiAgICAgIHRoaXMuX2lucHV0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCB0aGlzLl9ib3VuZE9uRm9jdXNpbik7XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWy4uLnN1cGVyLm9ic2VydmVkQXR0cmlidXRlcywgJ3R5cGUnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICd0eXBlJzpcbiAgICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2lucHV0LnNldEF0dHJpYnV0ZSgndHlwZScsIHRoaXMudHlwZSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBwbGFjZWhvbGRlclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUGxhY2Vob2xkZXIgdGV4dC4gSW4gTWF0ZXJpYWwgRGVzaWduLCB0aGlzIHBsYWNlaG9sZGVyIHdpbGwgYmUgYSBmbG9hdGluZyBsYWJlbC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBmbG9hdFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCB0aGUgcGxhY2Vob2xkZXIgd2lsbCBiZSBhbmltYXRlZCBpbiBNYXRlcmlhbCBEZXNpZ24uWy9lbl1cbiAgICogIFtqYV3jgZPjga7lsZ7mgKfjgYzoqK3lrprjgZXjgozjgZ/mmYLjgIHjg6njg5njg6vjga/jgqLjg4vjg6Hjg7zjgrfjg6fjg7PjgZnjgovjgojjgYbjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGZsb2F0XG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JZiB0aGlzIHByb3BlcnR5IGlzIHByZXNlbnQsIHRoZSBwbGFjZWhvbGRlciB3aWxsIGJlIGFuaW1hdGVkIGluIE1hdGVyaWFsIERlc2lnbi5bL2VuXVxuICAgKiAgW2phXeOBk+OBruWxnuaAp+OBjOioreWumuOBleOCjOOBn+aZguOAgeODqeODmeODq+OBr+OCouODi+ODoeODvOOCt+ODp+ODs+OBmeOCi+OCiOOBhuOBq+OBquOCiuOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHR5cGVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICAgIFNwZWNpZnkgdGhlIGlucHV0IHR5cGUuIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIFwidHlwZVwiIGF0dHJpYnV0ZSBmb3Igbm9ybWFsIGlucHV0cy4gSXQgZXhwZWN0cyBzdHJpY3QgdGV4dCB0eXBlcyBzdWNoIGFzIGB0ZXh0YCwgYHBhc3N3b3JkYCwgZXRjLiBGb3IgY2hlY2tib3gsIHJhZGlvIGJ1dHRvbiwgc2VsZWN0IG9yIHJhbmdlLCBwbGVhc2UgaGF2ZSBhIGxvb2sgYXQgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMuXG4gICAqXG4gICAqICAgIFBsZWFzZSB0YWtlIGEgbG9vayBhdCBbTUROXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQjYXR0ci10eXBlKSBmb3IgYW4gZXhoYXVzdGl2ZSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcy4gRGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSBhbmQgYnJvd3NlciB2ZXJzaW9uIHNvbWUgb2YgdGhlc2UgbWlnaHQgbm90IHdvcmsuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGlucHV0LWlkXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIFwiaWRcIiBhdHRyaWJ1dGUgb2YgdGhlIGlubmVyIGA8aW5wdXQ+YCBlbGVtZW50LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIGA8bGFiZWwgZm9yPVwiLi4uXCI+YCBlbGVtZW50cy5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmFsdWVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBpbnB1dC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgaW5wdXQgaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGZvY3VzXG4gICAqIEBzaWduYXR1cmUgZm9jdXMoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRm9jdXNlcyB0aGUgaW5wdXQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYmx1clxuICAgKiBAc2lnbmF0dXJlIGJsdXIoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmVtb3ZlcyBmb2N1cyBmcm9tIHRoZSBpbnB1dC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbn1cblxudXRpbC5kZWZpbmVCb29sZWFuUHJvcGVydGllcyhJbnB1dEVsZW1lbnQsIFsnZmxvYXQnXSk7XG5cbm9uc0VsZW1lbnRzLklucHV0ID0gSW5wdXRFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtaW5wdXQnLCBJbnB1dEVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBCYXNlSW5wdXRFbGVtZW50IGZyb20gJy4vYmFzZS1pbnB1dC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uLy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUNoZWNrYm94RWxlbWVudCBleHRlbmRzIEJhc2VJbnB1dEVsZW1lbnQge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciA9PT0gQmFzZUNoZWNrYm94RWxlbWVudCkge1xuICAgICAgdXRpbC50aHJvd0Fic3RyYWN0KCk7XG4gICAgfVxuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCdjaGVja2VkJywgbnVsbCwgdGhpcy5nZXRBdHRyaWJ1dGUoJ2NoZWNrZWQnKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiBJbmhlcml0ZWQgcHJvcHMgKi9cblxuICBnZXQgX3RlbXBsYXRlKCkge1xuICAgIHJldHVybiBgXG4gICAgICA8aW5wdXQgdHlwZT1cIiR7dGhpcy50eXBlfVwiIGNsYXNzPVwiJHt0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lfV9faW5wdXRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiJHt0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lfV9fY2hlY2ttYXJrXCI+PC9zcGFuPlxuICAgIGA7XG4gIH1cblxuICAvKiBPd24gcHJvcHMgKi9cblxuICBnZXQgX2hlbHBlcigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdzcGFuJyk7XG4gIH1cblxuICBnZXQgY2hlY2tlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5wdXQuY2hlY2tlZDtcbiAgfVxuXG4gIHNldCBjaGVja2VkKHZhbCkge1xuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl9pbnB1dC5jaGVja2VkID0gdmFsO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsuLi5zdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXMsICdjaGVja2VkJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2hlY2tlZCc6XG4gICAgICAgIHRoaXMuY2hlY2tlZCA9IGN1cnJlbnQgIT09IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpO1xuICAgIH1cbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IEJhc2VDaGVja2JveEVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtY2hlY2tib3guanMnO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcuY2hlY2tib3gnOiAnY2hlY2tib3gtLSonLFxuICAnLmNoZWNrYm94X19pbnB1dCc6ICdjaGVja2JveC0tKl9faW5wdXQnLFxuICAnLmNoZWNrYm94X19jaGVja21hcmsnOiAnY2hlY2tib3gtLSpfX2NoZWNrbWFyaydcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLWNoZWNrYm94XG4gKiBAY2F0ZWdvcnkgZm9ybVxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgW2VuXURpc3BsYXlzIGEgTWF0ZXJpYWwgRGVzaWduIGNoZWNrYm94LlsvZW5dXG4gKiAgW2phXVsvamFdXG4gKiBAbW9kaWZpZXIgbm9ib3JkZXJcbiAqICBbZW5daU9TIGJvcmRlcmxlc3MgY2hlY2tib3guWy9lbl1cbiAqICBbamFdWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1cbiAqICAgIEEgY2hlY2tib3ggZWxlbWVudC4gVGhlIGNvbXBvbmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVuZGVyIGFzIGEgTWF0ZXJpYWwgRGVzaWduIGNoZWNrYm94IG9uIEFuZHJvaWQgZGV2aWNlcy5cbiAqXG4gKiAgICBNb3N0IGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYSBub3JtYWwgYDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIj5gIGVsZW1lbnQgY2FuIGFsc28gYmUgdXNlZCBvbiB0aGUgYDxvbnMtY2hlY2tib3g+YCBlbGVtZW50LlxuICogIFsvZW5dXG4gKiAgW2phXVsvamFdXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvY2hlY2tib3hcbiAqIEBzZWVhbHNvIG9ucy1zd2l0Y2hcbiAqICAgW2VuXVRoZSBgPG9ucy1zd2l0Y2g+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIGRyYWdnYWJsZSB0b2dnbGUgc3dpdGNoLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXJhZGlvXG4gKiAgIFtlbl1UaGUgYDxvbnMtcmFkaW8+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHJhZGlvIGJ1dHRvbi5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1pbnB1dFxuICogICBbZW5dVGhlIGA8b25zLWlucHV0PmAgZWxlbWVudCBpcyB1c2VkIHRvIGRpc3BsYXkgYSB0ZXh0IGlucHV0LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXNlYXJjaC1pbnB1dFxuICogICBbZW5dVGhlIGA8b25zLXNlYXJjaC1pbnB1dD5gIGVsZW1lbnQgaXMgdXNlZCB0byBkaXNwbGF5IGEgc2VhcmNoIGlucHV0LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXJhbmdlXG4gKiAgIFtlbl1UaGUgYDxvbnMtcmFuZ2U+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHJhbmdlIHNsaWRlci5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1zZWxlY3RcbiAqICAgW2VuXVRoZSBgPG9ucy1zZWxlY3Q+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHNlbGVjdCBib3guWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI21vZGlmaWVycyBbZW5dTW9yZSBkZXRhaWxzIGFib3V0IHRoZSBgbW9kaWZpZXJgIGF0dHJpYnV0ZVsvZW5dW2phXW1vZGlmaWVy5bGe5oCn44Gu5L2/44GE5pa5Wy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLWNoZWNrYm94IGNoZWNrZWQ+PC9vbnMtY2hlY2tib3g+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoZWNrYm94RWxlbWVudCBleHRlbmRzIEJhc2VDaGVja2JveEVsZW1lbnQge1xuXG4gIGdldCBfc2NoZW1lKCkge1xuICAgIHJldHVybiBzY2hlbWU7XG4gIH1cblxuICBnZXQgX2RlZmF1bHRDbGFzc05hbWUoKSB7XG4gICAgcmV0dXJuICdjaGVja2JveCc7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ2NoZWNrYm94JztcbiAgfVxuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGlucHV0LWlkXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIFwiaWRcIiBhdHRyaWJ1dGUgb2YgdGhlIGlubmVyIGA8aW5wdXQ+YCBlbGVtZW50LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIGA8bGFiZWwgZm9yPVwiLi4uXCI+YCBlbGVtZW50cy5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmFsdWVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjaGVja2JveC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGNoZWNrZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBjaGVja2JveCBpcyBjaGVja2VkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGRpc2FibGVkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgY2hlY2tib3ggaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGZvY3VzXG4gICAqIEBzaWduYXR1cmUgZm9jdXMoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRm9jdXNlcyB0aGUgY2hlY2tib3guWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYmx1clxuICAgKiBAc2lnbmF0dXJlIGJsdXIoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmVtb3ZlcyBmb2N1cyBmcm9tIHRoZSBjaGVja2JveC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbn1cblxub25zRWxlbWVudHMuQ2hlY2tib3ggPSBDaGVja2JveEVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1jaGVja2JveCcsIENoZWNrYm94RWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgQmFzZUNoZWNrYm94RWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1jaGVja2JveC5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJy5yYWRpby1idXR0b24nOiAncmFkaW8tYnV0dG9uLS0qJyxcbiAgJy5yYWRpby1idXR0b25fX2lucHV0JzogJ3JhZGlvLWJ1dHRvbi0tKl9faW5wdXQnLFxuICAnLnJhZGlvLWJ1dHRvbl9fY2hlY2ttYXJrJzogJ3JhZGlvLWJ1dHRvbi0tKl9fY2hlY2ttYXJrJ1xufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtcmFkaW9cbiAqIEBjYXRlZ29yeSBmb3JtXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICBbZW5dRGlzcGxheXMgYSBNYXRlcmlhbCBEZXNpZ24gcmFkaW8gYnV0dG9uLlsvZW5dXG4gKiAgW2phXVsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dXG4gKiAgICBBIHJhZGlvIGJ1dHRvbiBlbGVtZW50LiBUaGUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSByZW5kZXIgYXMgYSBNYXRlcmlhbCBEZXNpZ24gcmFkaW8gYnV0dG9uIG9uIEFuZHJvaWQgZGV2aWNlcy5cbiAqXG4gKiAgICBNb3N0IGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYSBub3JtYWwgYDxpbnB1dCB0eXBlPVwicmFkaW9cIj5gIGVsZW1lbnQgY2FuIGFsc28gYmUgdXNlZCBvbiB0aGUgYDxvbnMtcmFkaW8+YCBlbGVtZW50LlxuICogIFsvZW5dXG4gKiAgW2phXVsvamFdXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvcmFkaW9cbiAqIEBzZWVhbHNvIG9ucy1zZWxlY3RcbiAqICAgW2VuXVRoZSBgPG9ucy1zZWxlY3Q+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHNlbGVjdCBib3guWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtY2hlY2tib3hcbiAqICAgW2VuXVRoZSBgPG9ucy1jaGVja2JveD5gIGVsZW1lbnQgaXMgdXNlZCB0byBkaXNwbGF5IGEgY2hlY2tib3guWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtc3dpdGNoXG4gKiAgIFtlbl1UaGUgYDxvbnMtc3dpdGNoPmAgZWxlbWVudCBpcyB1c2VkIHRvIGRpc3BsYXkgYSBkcmFnZ2FibGUgdG9nZ2xlIHN3aXRjaC5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1pbnB1dFxuICogICBbZW5dVGhlIGA8b25zLWlucHV0PmAgZWxlbWVudCBpcyB1c2VkIHRvIGRpc3BsYXkgYSB0ZXh0IGlucHV0LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXNlYXJjaC1pbnB1dFxuICogICBbZW5dVGhlIGA8b25zLXNlYXJjaC1pbnB1dD5gIGVsZW1lbnQgaXMgdXNlZCB0byBkaXNwbGF5IGEgc2VhcmNoIGlucHV0LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXJhbmdlXG4gKiAgIFtlbl1UaGUgYDxvbnMtcmFuZ2U+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHJhbmdlIHNsaWRlci5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjbW9kaWZpZXJzIFtlbl1Nb3JlIGRldGFpbHMgYWJvdXQgdGhlIGBtb2RpZmllcmAgYXR0cmlidXRlWy9lbl1bamFdbW9kaWZpZXLlsZ7mgKfjga7kvb/jgYTmlrlbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtcmFkaW8gY2hlY2tlZD48L29ucy1yYWRpbz5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFkaW9FbGVtZW50IGV4dGVuZHMgQmFzZUNoZWNrYm94RWxlbWVudCB7XG5cbiAgZ2V0IF9zY2hlbWUoKSB7XG4gICAgcmV0dXJuIHNjaGVtZTtcbiAgfVxuXG4gIGdldCBfZGVmYXVsdENsYXNzTmFtZSgpIHtcbiAgICByZXR1cm4gJ3JhZGlvLWJ1dHRvbic7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ3JhZGlvJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGlucHV0LWlkXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIFwiaWRcIiBhdHRyaWJ1dGUgb2YgdGhlIGlubmVyIGA8aW5wdXQ+YCBlbGVtZW50LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIGA8bGFiZWwgZm9yPVwiLi4uXCI+YCBlbGVtZW50cy5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmFsdWVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSByYWRpbyBidXR0b24uWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBjaGVja2VkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgcmFkaW8gYnV0dG9uIGlzIGNoZWNrZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSByYWRpbyBidXR0b24gaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGZvY3VzXG4gICAqIEBzaWduYXR1cmUgZm9jdXMoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRm9jdXNlcyB0aGUgcmFkaW8gYnV0dG9uLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJsdXJcbiAgICogQHNpZ25hdHVyZSBibHVyKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJlbW92ZXMgZm9jdXMgZnJvbSB0aGUgcmFkaW8gYnV0dG9uLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xufVxuXG5vbnNFbGVtZW50cy5SYWRpbyA9IFJhZGlvRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXJhZGlvJywgUmFkaW9FbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCBCYXNlSW5wdXRFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWlucHV0LmpzJztcblxuY29uc3Qgc2NoZW1lID0ge1xuICAnLnNlYXJjaC1pbnB1dCc6ICdzZWFyY2gtaW5wdXQtLSonXG59O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1zZWFyY2gtaW5wdXRcbiAqIEBjYXRlZ29yeSBmb3JtXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICBbZW5dRGlzcGxheXMgYSBNYXRlcmlhbCBEZXNpZ24gc2VhcmNoIGlucHV0LlsvZW5dXG4gKiAgW2phXVsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dXG4gKiAgICBBIHNlYXJjaCBpbnB1dCBlbGVtZW50LiBUaGUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSByZW5kZXIgYXMgYSBNYXRlcmlhbCBEZXNpZ24gc2VhcmNoIGlucHV0IG9uIEFuZHJvaWQgZGV2aWNlcy5cbiAqXG4gKiAgICBNb3N0IGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYSBub3JtYWwgYDxpbnB1dD5gIGVsZW1lbnQgY2FuIGFsc28gYmUgdXNlZCBvbiB0aGUgYDxvbnMtc2VhcmNoLWlucHV0PmAgZWxlbWVudC5cbiAqICBbL2VuXVxuICogIFtqYV1bL2phXVxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3NlYXJjaC1pbnB1dFxuICogQHNlZWFsc28gb25zLWlucHV0XG4gKiAgIFtlbl1UaGUgYDxvbnMtaW5wdXQ+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHRleHQgaW5wdXQuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtcmFuZ2VcbiAqICAgW2VuXVRoZSBgPG9ucy1yYW5nZT5gIGVsZW1lbnQgaXMgdXNlZCB0byBkaXNwbGF5IGEgcmFuZ2Ugc2xpZGVyLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXN3aXRjaFxuICogICBbZW5dVGhlIGA8b25zLXN3aXRjaD5gIGVsZW1lbnQgaXMgdXNlZCB0byBkaXNwbGF5IGEgZHJhZ2dhYmxlIHRvZ2dsZSBzd2l0Y2guWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtc2VsZWN0XG4gKiAgIFtlbl1UaGUgYDxvbnMtc2VsZWN0PmAgZWxlbWVudCBpcyB1c2VkIHRvIGRpc3BsYXkgYSBzZWxlY3QgYm94LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLWNoZWNrYm94XG4gKiAgIFtlbl1UaGUgYDxvbnMtY2hlY2tib3g+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIGNoZWNrYm94LlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHNlZWFsc28gb25zLXJhZGlvXG4gKiAgIFtlbl1UaGUgYDxvbnMtcmFkaW8+YCBlbGVtZW50IGlzIHVzZWQgdG8gZGlzcGxheSBhIHJhZGlvIGJ1dHRvbi5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjbW9kaWZpZXJzIFtlbl1Nb3JlIGRldGFpbHMgYWJvdXQgdGhlIGBtb2RpZmllcmAgYXR0cmlidXRlWy9lbl1bamFdbW9kaWZpZXLlsZ7mgKfjga7kvb/jgYTmlrlbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtc2VhcmNoLWlucHV0IHBsYWNlaG9sZGVyPVwiU2VhcmNoXCI+PC9vbnMtc2VhcmNoLWlucHV0PlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWFyY2hJbnB1dEVsZW1lbnQgZXh0ZW5kcyBCYXNlSW5wdXRFbGVtZW50IHtcblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4gc2NoZW1lO1xuICB9XG5cbiAgZ2V0IF90ZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gYFxuICAgICAgPGlucHV0IHR5cGU9XCIke3RoaXMudHlwZX1cIiBjbGFzcz1cInNlYXJjaC1pbnB1dFwiPlxuICAgIGA7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ3NlYXJjaCc7XG4gIH1cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBpbnB1dC1pZFxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBcImlkXCIgYXR0cmlidXRlIG9mIHRoZSBpbm5lciBgPGlucHV0PmAgZWxlbWVudC4gVGhpcyBpcyB1c2VmdWwgd2hlbiB1c2luZyBgPGxhYmVsIGZvcj1cIi4uLlwiPmAgZWxlbWVudHMuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhbHVlXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgaW5wdXQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGlucHV0IGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBmb2N1c1xuICAgKiBAc2lnbmF0dXJlIGZvY3VzKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZvY3VzZXMgdGhlIGlucHV0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJsdXJcbiAgICogQHNpZ25hdHVyZSBibHVyKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJlbW92ZXMgZm9jdXMgZnJvbSB0aGUgaW5wdXQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG59XG5cbm9uc0VsZW1lbnRzLlNlYXJjaElucHV0ID0gU2VhcmNoSW5wdXRFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtc2VhcmNoLWlucHV0JywgU2VhcmNoSW5wdXRFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBCYXNlQW5pbWF0b3IgZnJvbSAnLi4vLi4vb25zL2Jhc2UtYW5pbWF0b3IuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2RhbEFuaW1hdG9yIGV4dGVuZHMgQmFzZUFuaW1hdG9yIHtcblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMudGltaW5nXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmR1cmF0aW9uXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmRlbGF5XG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2xpbmVhcicsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjJ9ID0ge30pIHtcbiAgICBzdXBlcih7IHRpbWluZywgZGVsYXksIGR1cmF0aW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG1vZGFsXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzaG93KG1vZGFsLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbW9kYWxcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGhpZGUobW9kYWwsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxufVxuIiwiXG4vKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IE1vZGFsQW5pbWF0b3IgZnJvbSAnLi9hbmltYXRvci5qcyc7XG5cbi8qKlxuICogaU9TIHN0eWxlIGFuaW1hdG9yIGZvciBkaWFsb2cuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZhZGVNb2RhbEFuaW1hdG9yIGV4dGVuZHMgTW9kYWxBbmltYXRvciB7XG5cbiAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdsaW5lYXInLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC4zfSA9IHt9KSB7XG4gICAgc3VwZXIoeyB0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBtb2RhbFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgc2hvdyhtb2RhbCwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgYW5pbWl0KG1vZGFsLCB0aGlzLmRlZilcbiAgICAgIC5kZWZhdWx0KHsgb3BhY2l0eTogMCB9LCB7IG9wYWNpdHk6IDEgfSlcbiAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSlcbiAgICAgIC5wbGF5KCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbW9kYWxcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGhpZGUobW9kYWwsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdChtb2RhbCwgdGhpcy5kZWYpXG4gICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDEgfSwgeyBvcGFjaXR5OiAwIH0pXG4gICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pXG4gICAgICAucGxheSgpO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IE1vZGFsQW5pbWF0b3IgZnJvbSAnLi9hbmltYXRvci5qcyc7XG5cbi8qKlxuICogaU9TIHN0eWxlIGFuaW1hdG9yIGZvciBtb2RhbC5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZ0TW9kYWxBbmltYXRvciBleHRlbmRzIE1vZGFsQW5pbWF0b3JcbntcbiAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdjdWJpYy1iZXppZXIoIC4xLCAuNywgLjEsIDEpJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuNH0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbW9kYWxcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNob3cobW9kYWwsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBjYWxsYmFjayA/IGNhbGxiYWNrIDogZnVuY3Rpb24oKSB7fTtcblxuICAgIGFuaW1pdChtb2RhbCwgdGhpcy5kZWYpXG4gICAgICAuZGVmYXVsdChcbiAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAxMDAlLCAwKScgfSxcbiAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScgfVxuICAgICAgKVxuICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9KVxuICAgICAgLnBsYXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBtb2RhbFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZShtb2RhbCwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgYW5pbWl0KG1vZGFsLCB0aGlzLmRlZilcbiAgICAgIC5kZWZhdWx0KFxuICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyB9LFxuICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDEwMCUsIDApJyB9XG4gICAgICApXG4gICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgIH0pXG4gICAgICAucGxheSgpO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEFuaW1hdG9yRmFjdG9yeSBmcm9tICcuLi9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyc7XG5pbXBvcnQgTW9kYWxBbmltYXRvciBmcm9tICcuL29ucy1tb2RhbC9hbmltYXRvci5qcyc7XG5pbXBvcnQgRmFkZU1vZGFsQW5pbWF0b3IgZnJvbSAnLi9vbnMtbW9kYWwvZmFkZS1hbmltYXRvci5qcyc7XG5pbXBvcnQgTGlmdE1vZGFsQW5pbWF0b3IgZnJvbSAnLi9vbnMtbW9kYWwvbGlmdC1hbmltYXRvci5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vb25zL3BsYXRmb3JtLmpzJztcbmltcG9ydCBCYXNlRGlhbG9nRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1kaWFsb2cuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJyc6ICdtb2RhbC0tKicsXG4gICdtb2RhbF9fY29udGVudCc6ICdtb2RhbC0tKl9fY29udGVudCdcbn07XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnbW9kYWwnO1xuXG5jb25zdCBfYW5pbWF0b3JEaWN0ID0ge1xuICAnZGVmYXVsdCc6IE1vZGFsQW5pbWF0b3IsXG4gICdmYWRlJzogRmFkZU1vZGFsQW5pbWF0b3IsXG4gICdsaWZ0JzogTGlmdE1vZGFsQW5pbWF0b3IsXG4gICdub25lJzogTW9kYWxBbmltYXRvclxufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtbW9kYWxcbiAqIEBjYXRlZ29yeSBkaWFsb2dcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgTW9kYWwgY29tcG9uZW50IHRoYXQgbWFza3MgY3VycmVudCBzY3JlZW4uIFVuZGVybHlpbmcgY29tcG9uZW50cyBhcmUgbm90IHN1YmplY3QgdG8gYW55IGV2ZW50cyB3aGlsZSB0aGUgbW9kYWwgY29tcG9uZW50IGlzIHNob3duLlxuICpcbiAqICAgICBUaGlzIGNvbXBvbmVudCBjYW4gYmUgdXNlZCB0byBibG9jayB1c2VyIGlucHV0IHdoaWxlIHNvbWUgb3BlcmF0aW9uIGlzIHJ1bm5pbmcgb3IgdG8gc2hvdyBzb21lIGluZm9ybWF0aW9uIHRvIHRoZSB1c2VyLlxuICogICBbL2VuXVxuICogICBbamFdXG4gKiAgICAg55S76Z2i5YWo5L2T44KS44Oe44K544Kv44GZ44KL44Oi44O844OA44Or55So44Kz44Oz44Od44O844ON44Oz44OI44Gn44GZ44CC5LiL5YG044Gr44GC44KL44Kz44Oz44Od44O844ON44Oz44OI44Gv44CBXG4gKiAgICAg44Oi44O844OA44Or44GM6KGo56S644GV44KM44Gm44GE44KL6ZaT44Gv44Kk44OZ44Oz44OI6YCa55+l44GM6KGM44KP44KM44G+44Gb44KT44CCXG4gKiAgIFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtZGlhbG9nXG4gKiAgIFtlbl1UaGUgYDxvbnMtZGlhbG9nPmAgY29tcG9uZW50IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIG1vZGFsIGRpYWxvZy5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBjb2RlcGVuIGRldklnXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9yZWZlcmVuY2UvbW9kYWxcbiAqIEBleGFtcGxlXG4gKiA8b25zLW1vZGFsIGlkPVwibW9kYWxcIj5cbiAqICAgTW9kYWwgY29udGVudFxuICogPC9vbnMtbW9kYWw+XG4gKiA8c2NyaXB0PlxuICogICB2YXIgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kYWwnKTtcbiAqICAgbW9kYWwuc2hvdygpO1xuICogPC9zY3JpcHQ+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZGFsRWxlbWVudCBleHRlbmRzIEJhc2VEaWFsb2dFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IHByZXNob3dcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCBqdXN0IGJlZm9yZSB0aGUgbW9kYWwgaXMgZGlzcGxheWVkLlsvZW5dXG4gICAqIFtqYV3jg6Ljg7zjg4Djg6vjgYzooajnpLrjgZXjgozjgovnm7TliY3jgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQubW9kYWxcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jYW5jZWxcbiAgICogICBbZW5dRXhlY3V0ZSB0aGlzIGZ1bmN0aW9uIHRvIHN0b3AgdGhlIG1vZGFsIGZyb20gYmVpbmcgc2hvd24uWy9lbl1cbiAgICogICBbamFd44GT44Gu6Zai5pWw44KS5a6f6KGM44GZ44KL44Go44CB44OA44Kk44Ki44Ot44Kw44Gu6KGo56S644GM44Kt44Oj44Oz44K744Or44GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0c2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIG1vZGFsIGlzIGRpc3BsYXllZC5bL2VuXVxuICAgKiBbamFd44Oi44O844OA44Or44GM6KGo56S644GV44KM44Gf55u05b6M44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50Lm1vZGFsXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwcmVoaWRlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBbZW5dRmlyZWQganVzdCBiZWZvcmUgdGhlIG1vZGFsIGlzIGhpZGRlbi5bL2VuXVxuICAgKiBbamFd44Oi44O844OA44Or44GM6Zqg44KM44KL55u05YmN44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50Lm1vZGFsXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUV4ZWN1dGUgdGhpcyBmdW5jdGlvbiB0byBzdG9wIHRoZSBtb2RhbCBmcm9tIGJlaW5nIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7plqLmlbDjgpLlrp/ooYzjgZnjgovjgajjgIHjg4DjgqTjgqLjg63jgrDjga7pnZ7ooajnpLrjgYzjgq3jg6Pjg7Pjgrvjg6vjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3RoaWRlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBbZW5dRmlyZWQganVzdCBhZnRlciB0aGUgbW9kYWwgaXMgaGlkZGVuLlsvZW5dXG4gICAqIFtqYV3jg6Ljg7zjg4Djg6vjgYzpmqDjgozjgZ/lvozjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQubW9kYWxcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlZmF1bHQgZGVmYXVsdFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1UaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBzaG93aW5nIGFuZCBoaWRpbmcgdGhlIG1vZGFsLiBDYW4gYmUgZWl0aGVyIGBcIm5vbmVcImAsIGBcImZhZGVcImAgb3IgYFwibGlmdFwiYC5bL2VuXVxuICAgKiAgW2phXeODouODvOODgOODq+OCkuihqOekuuOBmeOCi+mam+OBruOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglwibm9uZVwi44KC44GX44GP44GvXCJmYWRlXCIsXCJsaWZ0XCLjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb24tb3B0aW9uc1xuICAgKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgIJlLmcuIDxjb2RlPntkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9PC9jb2RlPlsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYW5pbWF0aW9uT3B0aW9uc1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CC5L6L77yae2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB2aXNpYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgbW9kYWwgaXMgdmlzaWJsZSBvciBub3QuWy9lbl1cbiAgICogICBbamFd6KaB57Sg44GM6KaL44GI44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2RlZmF1bHREQkIgPSAoKSA9PiB1bmRlZmluZWQ7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG4gIH1cblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4gc2NoZW1lO1xuICB9XG5cbiAgX3VwZGF0ZUFuaW1hdG9yRmFjdG9yeSgpIHtcbiAgICByZXR1cm4gbmV3IEFuaW1hdG9yRmFjdG9yeSh7XG4gICAgICBhbmltYXRvcnM6IF9hbmltYXRvckRpY3QsXG4gICAgICBiYXNlQ2xhc3M6IE1vZGFsQW5pbWF0b3IsXG4gICAgICBiYXNlQ2xhc3NOYW1lOiAnTW9kYWxBbmltYXRvcicsXG4gICAgICBkZWZhdWx0QW5pbWF0aW9uOiB0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uJylcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1CYWNrLWJ1dHRvbiBoYW5kbGVyLlsvZW5dXG4gICAqICAgW2phXeODkOODg+OCr+ODnOOCv+ODs+ODj+ODs+ODieODqeOAglsvamFdXG4gICAqL1xuXG4gIF9jb21waWxlKCkge1xuICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLnN0eWxlLnpJbmRleCA9IDEwMDAxO1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChkZWZhdWx0Q2xhc3NOYW1lKTtcblxuICAgIGlmICghdXRpbC5maW5kQ2hpbGQodGhpcywgJy5tb2RhbF9fY29udGVudCcpKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ21vZGFsX19jb250ZW50Jyk7XG5cbiAgICAgIHdoaWxlICh0aGlzLmNoaWxkTm9kZXNbMF0pIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuY2hpbGROb2Rlc1swXTtcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZChub2RlKTtcbiAgICAgICAgY29udGVudC5pbnNlcnRCZWZvcmUobm9kZSwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgfVxuXG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCB0aGlzLl9zY2hlbWUpO1xuICB9XG5cbiAgX3RvZ2dsZVN0eWxlKHNob3VsZFNob3cpIHtcbiAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSBzaG91bGRTaG93ID8gJ3RhYmxlJyA6ICdub25lJztcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2aXNpYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3opoHntKDjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBzaG93XG4gICAqIEBzaWduYXR1cmUgc2hvdyhbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1BbmltYXRpb24gbmFtZS4gQXZhaWxhYmxlIGFuaW1hdGlvbnMgYXJlIGBcIm5vbmVcImAgYW5kIGBcImZhZGVcImAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCXCJub25lXCIsIFwiZmFkZVwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1UaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgbW9kYWwgaGFzIGJlZW4gcmV2ZWFsZWQuWy9lbl1cbiAgICogICBbamFd44Oi44O844OA44Or44GM6KGo56S644GV44KM57WC44KP44Gj44Gf5b6M44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNob3cgbW9kYWwuWy9lbl1cbiAgICogICBbamFd44Oi44O844OA44Or44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIGRpc3BsYXllZCBlbGVtZW50Wy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgdG9nZ2xlXG4gICAqIEBzaWduYXR1cmUgdG9nZ2xlKFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYFwibm9uZVwiYCBhbmQgYFwiZmFkZVwiYC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJcIm5vbmVcIiwgXCJmYWRlXCLjga7jgYTjgZrjgozjgYvjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCBkZWxheSwgdGltaW5n44KS5oyH5a6a44GX44G+44GZ44CCZS5nLiB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBtb2RhbCBoYXMgYmVlbiByZXZlYWxlZC5bL2VuXVxuICAgKiAgIFtqYV3jg6Ljg7zjg4Djg6vjgYzooajnpLrjgZXjgozntYLjgo/jgaPjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVG9nZ2xlIG1vZGFsIHZpc2liaWxpdHkuWy9lbl1cbiAgICogICBbamFd44Oi44O844OA44Or44Gu6KGo56S644KS5YiH44KK5pu/44GI44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaGlkZVxuICAgKiBAc2lnbmF0dXJlIGhpZGUoW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJub25lXCJgIGFuZCBgXCJmYWRlXCJgLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglwibm9uZVwiLCBcImZhZGVcIuOBruOBhOOBmuOCjOOBi+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIGRlbGF5LCB0aW1pbmfjgpLmjIflrprjgZfjgb7jgZnjgIJlLmcuIHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIG1vZGFsIGhhcyBiZWVuIHJldmVhbGVkLlsvZW5dXG4gICAqICAgW2phXeODouODvOODgOODq+OBjOihqOekuuOBleOCjOe1guOCj+OBo+OBn+W+jOOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1IaWRlIG1vZGFsLlsvZW5dXG4gICAqICAgW2phXeODouODvOODgOODq+OCkumdnuihqOekuuOBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBoaWRkZW4gZWxlbWVudFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbLi4uc3VwZXIub2JzZXJ2ZWRBdHRyaWJ1dGVzLCAnY2xhc3MnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgaWYgKG5hbWUgPT09ICdjbGFzcycpIHtcbiAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIGRlZmF1bHRDbGFzc05hbWUsIHNjaGVtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gQW5pbWF0b3JcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlckFuaW1hdG9yKG5hbWUsIEFuaW1hdG9yKSB7XG4gICAgaWYgKCEoQW5pbWF0b3IucHJvdG90eXBlIGluc3RhbmNlb2YgTW9kYWxBbmltYXRvcikpIHtcbiAgICAgIHV0aWwudGhyb3dBbmltYXRvcignTW9kYWwnKTtcbiAgICB9XG4gICAgX2FuaW1hdG9yRGljdFtuYW1lXSA9IEFuaW1hdG9yO1xuICB9XG5cbiAgc3RhdGljIGdldCBhbmltYXRvcnMoKSB7XG4gICAgcmV0dXJuIF9hbmltYXRvckRpY3Q7XG4gIH1cblxuICBzdGF0aWMgZ2V0IE1vZGFsQW5pbWF0b3IoKSB7XG4gICAgcmV0dXJuIE1vZGFsQW5pbWF0b3I7XG4gIH1cbn1cblxub25zRWxlbWVudHMuTW9kYWwgPSBNb2RhbEVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1tb2RhbCcsIE1vZGFsRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuLi8uLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgR2VzdHVyZURldGVjdG9yIGZyb20gJy4uLy4uL29ucy9nZXN0dXJlLWRldGVjdG9yLmpzJztcblxuY29uc3Qgd2lkdGhUb1B4ID0gKHdpZHRoKSA9PiB7XG4gIGNvbnN0IFt2YWx1ZSwgcHhdID0gW3BhcnNlSW50KHdpZHRoLCAxMCksIC9weC8udGVzdCh3aWR0aCldO1xuICByZXR1cm4gcHggPyB2YWx1ZSA6IE1hdGgucm91bmQoZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCAqIHZhbHVlIC8gMTAwKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXBlUmV2ZWFsIHtcblxuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICAnZWxlbWVudCBpZ25vcmVTd2lwZSBpc0luaXRpYWxTdGF0ZSBvbkRyYWdDYWxsYmFjayBzd2lwZU1heCBzd2lwZU1pbiBzd2lwZU1pZCdcbiAgICAgIC5zcGxpdCgvXFxzKy8pLmZvckVhY2goa2V5ID0+IHRoaXNba2V5XSA9IHBhcmFtc1trZXldKTtcblxuICAgIHRoaXMuZWxlbWVudEhhbmRsZXIgPSBwYXJhbXMuZWxlbWVudEhhbmRsZXIgfHwgcGFyYW1zLmVsZW1lbnQ7XG4gICAgdGhpcy5nZXRUaHJlc2hvbGQgPSBwYXJhbXMuZ2V0VGhyZXNob2xkIHx8ICgoKSA9PiAuNSk7XG4gICAgdGhpcy5nZXRTaWRlID0gcGFyYW1zLmdldFNpZGUgfHwgKCgpID0+ICdsZWZ0Jyk7XG5cbiAgICB0aGlzLmhhbmRsZUdlc3R1cmUgPSB0aGlzLmhhbmRsZUdlc3R1cmUuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuX3Nob3VsZEZpeFNjcm9sbCA9IHV0aWwuZ2xvYmFscy5hY3R1YWxNb2JpbGVPUyA9PT0gJ2lvcyc7XG4gIH1cblxuICB1cGRhdGUoc3dpcGVhYmxlID0gdGhpcy5lbGVtZW50Lmhhc0F0dHJpYnV0ZSgnc3dpcGVhYmxlJykpIHtcbiAgICBpZiAoIXRoaXMuZ2VzdHVyZURldGVjdG9yKSB7XG4gICAgICB0aGlzLmdlc3R1cmVEZXRlY3RvciA9IG5ldyBHZXN0dXJlRGV0ZWN0b3IodGhpcy5lbGVtZW50SGFuZGxlciwgeyBkcmFnTWluRGlzdGFuY2U6IDEsIHBhc3NpdmU6ICF0aGlzLl9zaG91bGRGaXhTY3JvbGwgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aW9uID0gc3dpcGVhYmxlID8gJ29uJyA6ICdvZmYnO1xuICAgIHRoaXMuZ2VzdHVyZURldGVjdG9yW2FjdGlvbl0oJ2RyYWcgZHJhZ3N0YXJ0IGRyYWdlbmQnLCB0aGlzLmhhbmRsZUdlc3R1cmUpO1xuICB9XG5cbiAgaGFuZGxlR2VzdHVyZShlKSB7XG4gICAgaWYgKGUuZ2VzdHVyZSkge1xuICAgICAgaWYgKGUudHlwZSA9PT0gJ2RyYWdzdGFydCcpIHtcbiAgICAgICAgdGhpcy5vbkRyYWdTdGFydChlKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lnbm9yZURyYWcpIHtcbiAgICAgICAgZS50eXBlID09PSAnZHJhZ2VuZCcgPyB0aGlzLm9uRHJhZ0VuZChlKSA6IHRoaXMub25EcmFnKGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRHJhZ1N0YXJ0KGV2ZW50KSB7XG4gICAgY29uc3QgZ2V0RGlzdGFuY2UgPSAoKSA9PiB0aGlzLmdldFNpZGUoKSA9PT0gJ2xlZnQnID8gZXZlbnQuZ2VzdHVyZS5jZW50ZXIuY2xpZW50WCA6IHdpbmRvdy5pbm5lcldpZHRoIC0gZXZlbnQuZ2VzdHVyZS5jZW50ZXIuY2xpZW50WDtcbiAgICB0aGlzLl9pZ25vcmVEcmFnID0gZXZlbnQuY29uc3VtZWQgfHwgIXV0aWwuaXNWYWxpZEdlc3R1cmUoZXZlbnQpIHx8IHRoaXMuaWdub3JlU3dpcGUoZXZlbnQsIGdldERpc3RhbmNlKCkpO1xuXG4gICAgaWYgKCF0aGlzLl9pZ25vcmVEcmFnKSB7XG4gICAgICBldmVudC5jb25zdW1lICYmIGV2ZW50LmNvbnN1bWUoKTtcbiAgICAgIGV2ZW50LmNvbnN1bWVkID0gdHJ1ZTtcblxuICAgICAgdGhpcy5fd2lkdGggPSB3aWR0aFRvUHgodGhpcy5lbGVtZW50LnN0eWxlLndpZHRoIHx8ICcxMDAlJyk7XG4gICAgICB0aGlzLl9zdGFydERpc3RhbmNlID0gdGhpcy5fZGlzdGFuY2UgPSAoISh0aGlzLmlzSW5pdGlhbFN0YXRlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHx8IHRoaXMuaXNJbml0aWFsU3RhdGUoKSkgPyAwIDogdGhpcy5fd2lkdGg7XG5cbiAgICAgIHV0aWwuaW9zUHJldmVudFNjcm9sbCh0aGlzLmdlc3R1cmVEZXRlY3Rvcik7XG4gICAgfVxuICB9XG5cbiAgb25EcmFnKGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCBkZWx0YSA9IHRoaXMuZ2V0U2lkZSgpID09PSAnbGVmdCcgPyBldmVudC5nZXN0dXJlLmRlbHRhWCA6IC1ldmVudC5nZXN0dXJlLmRlbHRhWDtcbiAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMuX3dpZHRoLCB0aGlzLl9zdGFydERpc3RhbmNlICsgZGVsdGEpKTtcbiAgICBpZiAoZGlzdGFuY2UgIT09IHRoaXMuX2Rpc3RhbmNlKSB7XG4gICAgICB0aGlzLl9kaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgdGhpcy5zd2lwZU1pZCh0aGlzLl9kaXN0YW5jZSwgdGhpcy5fd2lkdGgpO1xuICAgIH1cbiAgfVxuXG4gIG9uRHJhZ0VuZChldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgZGlyZWN0aW9uID0gZXZlbnQuZ2VzdHVyZS5pbnRlcmltRGlyZWN0aW9uO1xuICAgIGNvbnN0IGlzU3dpcGVNYXggPSB0aGlzLmdldFNpZGUoKSAhPT0gZGlyZWN0aW9uICYmIHRoaXMuX2Rpc3RhbmNlID4gdGhpcy5fd2lkdGggKiB0aGlzLmdldFRocmVzaG9sZCgpO1xuICAgIGlzU3dpcGVNYXggPyB0aGlzLnN3aXBlTWF4KCkgOiB0aGlzLnN3aXBlTWluKCk7XG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuZ2VzdHVyZURldGVjdG9yICYmIHRoaXMuZ2VzdHVyZURldGVjdG9yLmRpc3Bvc2UoKTtcbiAgICB0aGlzLmdlc3R1cmVEZXRlY3RvciA9IHRoaXMuZWxlbWVudCA9IHRoaXMuZWxlbWVudEhhbmRsZXIgPSBudWxsO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuLi8uLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUFuaW1hdG9yIGZyb20gJy4uLy4uL29ucy9iYXNlLWFuaW1hdG9yLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmF2aWdhdG9yQW5pbWF0b3IgZXh0ZW5kcyBCYXNlQW5pbWF0b3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy50aW1pbmdcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZHVyYXRpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZGVsYXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gdXRpbC5leHRlbmQoe1xuICAgICAgdGltaW5nOiAnbGluZWFyJyxcbiAgICAgIGR1cmF0aW9uOiAnMC40JyxcbiAgICAgIGRlbGF5OiAnMCdcbiAgICB9LCBvcHRpb25zIHx8IHt9KTtcblxuICAgIHN1cGVyKG9wdGlvbnMpO1xuICB9XG5cbiAgcHVzaChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgcG9wKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBibG9jayhwYWdlKSB7XG4gICAgY29uc3QgYmxvY2tlciA9IHV0aWwuY3JlYXRlRWxlbWVudChgXG4gICAgICA8ZGl2IHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgei1pbmRleDogMTAwMDAwXCI+PC9kaXY+XG4gICAgYCk7XG4gICAgcGFnZS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGJsb2NrZXIpO1xuICAgIHJldHVybiAoKSA9PiBibG9ja2VyLnJlbW92ZSgpO1xuICB9XG59XG5cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBOYXZpZ2F0b3JBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uLy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5cbi8qKlxuICogQWJzdHJhY3Qgc3dpcGUgYW5pbWF0b3IgZm9yIGlPUyBuYXZpZ2F0b3IgdHJhbnNpdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSU9TU3dpcGVOYXZpZ2F0b3JBbmltYXRvciBleHRlbmRzIE5hdmlnYXRvckFuaW1hdG9yIHtcblxuICBzdGF0aWMgZ2V0IHN3aXBlYWJsZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHsgZHVyYXRpb25SZXN0b3JlID0gMC4xLCBkdXJhdGlvblN3aXBlID0gMC4xNSwgdGltaW5nU3dpcGUgPSAnbGluZWFyJywgLi4ucmVzdCB9ID0ge30pIHtcbiAgICBzdXBlcih7Li4ucmVzdH0pO1xuXG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IElPU1N3aXBlTmF2aWdhdG9yQW5pbWF0b3IpIHtcbiAgICAgIHV0aWwudGhyb3dBYnN0cmFjdCgpO1xuICAgIH1cblxuICAgIHRoaXMuZHVyYXRpb25SZXN0b3JlID0gZHVyYXRpb25SZXN0b3JlO1xuICAgIHRoaXMuZHVyYXRpb25Td2lwZSA9IGR1cmF0aW9uU3dpcGU7XG4gICAgdGhpcy50aW1pbmdTd2lwZSA9IHRpbWluZ1N3aXBlO1xuXG4gICAgdGhpcy5vcHRTd2lwZSA9IHsgdGltaW5nOiB0aW1pbmdTd2lwZSwgZHVyYXRpb246IGR1cmF0aW9uU3dpcGUgfTtcbiAgICB0aGlzLm9wdFJlc3RvcmUgPSB7IHRpbWluZzogdGltaW5nU3dpcGUsIGR1cmF0aW9uOiBkdXJhdGlvblJlc3RvcmUgfTtcblxuICAgIHRoaXMuc3dpcGVTaGFkb3cgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBgPGRpdiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTJweDsgcmlnaHQ6IDEwMCU7IHRvcDogMDsgYm90dG9tOiAwOyB6LWluZGV4OiAtMTtgICtcbiAgICAgICAgYGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgdHJhbnNwYXJlbnQgMCwgcmdiYSgwLDAsMCwuMDQpIDQwJSwgcmdiYSgwLDAsMCwuMTIpIDgwJSwgcmdiYSgwLDAsMCwuMTYpIDEwMCUpO1wiPjwvZGl2PmBcbiAgICApO1xuXG4gICAgdGhpcy5pc0RyYWdTdGFydCA9IHRydWU7XG4gIH1cblxuICBfZGVjb21wb3NlKCkge1xuICAgIHV0aWwudGhyb3dNZW1iZXIoKTtcbiAgfVxuXG4gIF9zaG91bGRBbmltYXRlVG9vbGJhcigpIHtcbiAgICB1dGlsLnRocm93TWVtYmVyKCk7XG4gIH1cblxuICBfY2FsY3VsYXRlRGVsdGEoKSB7XG4gICAgdXRpbC50aHJvd01lbWJlcigpO1xuICB9XG5cbiAgX2RyYWdTdGFydFNldHVwKGVudGVyUGFnZSwgbGVhdmVQYWdlKSB7XG4gICAgdGhpcy5pc0RyYWdTdGFydCA9IGZhbHNlO1xuXG4gICAgLy8gQXZvaWQgY29udGVudCBjbGlja3NcbiAgICB0aGlzLnVuYmxvY2sgPSBzdXBlci5ibG9jayhsZWF2ZVBhZ2UpO1xuXG4gICAgLy8gTWFza1xuICAgIGVudGVyUGFnZS5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZSh0aGlzLmJhY2tncm91bmRNYXNrLCBlbnRlclBhZ2UpO1xuXG4gICAgLy8gRGVjb21wb3NpdGlvblxuICAgIHRoaXMudGFyZ2V0ID0ge1xuICAgICAgZW50ZXI6IHV0aWwuZmluZFRvb2xiYXJQYWdlKGVudGVyUGFnZSkgfHwgZW50ZXJQYWdlLFxuICAgICAgbGVhdmU6IHV0aWwuZmluZFRvb2xiYXJQYWdlKGxlYXZlUGFnZSkgfHwgbGVhdmVQYWdlLFxuICAgIH07XG4gICAgdGhpcy5kZWNvbXAgPSB7XG4gICAgICBlbnRlcjogdGhpcy5fZGVjb21wb3NlKHRoaXMudGFyZ2V0LmVudGVyKSxcbiAgICAgIGxlYXZlOiB0aGlzLl9kZWNvbXBvc2UodGhpcy50YXJnZXQubGVhdmUpXG4gICAgfTtcblxuICAgIC8vIEFuaW1hdGlvbiB2YWx1ZXNcbiAgICB0aGlzLmRlbHRhID0gdGhpcy5fY2FsY3VsYXRlRGVsdGEobGVhdmVQYWdlLCB0aGlzLmRlY29tcC5sZWF2ZSk7XG4gICAgdGhpcy5zaG91bGRBbmltYXRlVG9vbGJhciA9IHRoaXMuX3Nob3VsZEFuaW1hdGVUb29sYmFyKHRoaXMudGFyZ2V0LmVudGVyLCB0aGlzLnRhcmdldC5sZWF2ZSk7XG5cbiAgICAvLyBTaGFkb3cgJiYgc3R5bGVzXG4gICAgaWYgKHRoaXMuc2hvdWxkQW5pbWF0ZVRvb2xiYXIpIHtcbiAgICAgIHRoaXMuc3dpcGVTaGFkb3cuc3R5bGUudG9wID0gdGhpcy5kZWNvbXAubGVhdmUudG9vbGJhci5vZmZzZXRIZWlnaHQgKyAncHgnO1xuICAgICAgdGhpcy50YXJnZXQubGVhdmUuYXBwZW5kQ2hpbGQodGhpcy5zd2lwZVNoYWRvdyk7XG4gICAgICB0aGlzLl9zYXZlU3R5bGUodGhpcy50YXJnZXQuZW50ZXIsIHRoaXMudGFyZ2V0LmxlYXZlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGVhdmVQYWdlLmFwcGVuZENoaWxkKHRoaXMuc3dpcGVTaGFkb3cpO1xuICAgICAgdGhpcy5fc2F2ZVN0eWxlKGVudGVyUGFnZSwgbGVhdmVQYWdlKTtcbiAgICB9XG4gICAgbGVhdmVQYWdlLmNsYXNzTGlzdC5hZGQoJ292ZXJmbG93LXZpc2libGUnKTtcbiAgICB0aGlzLm92ZXJmbG93RWxlbWVudCA9IGxlYXZlUGFnZTtcbiAgICB0aGlzLmRlY29tcC5sZWF2ZS5jb250ZW50LmNsYXNzTGlzdC5hZGQoJ2NvbnRlbnQtc3dpcGluZycpO1xuXG4gIH1cblxuICB0cmFuc2xhdGUoZGlzdGFuY2UsIG1heFdpZHRoLCBlbnRlclBhZ2UsIGxlYXZlUGFnZSkge1xuICAgIHRoaXMuaXNTd2lwaW5nID0gdHJ1ZTtcblxuICAgIGlmIChlbnRlclBhZ2Uuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XG4gICAgICBlbnRlclBhZ2Uuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRHJhZ1N0YXJ0KSB7XG4gICAgICB0aGlzLm1heFdpZHRoID0gbWF4V2lkdGg7XG4gICAgICB0aGlzLl9kcmFnU3RhcnRTZXR1cChlbnRlclBhZ2UsIGxlYXZlUGFnZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3dpcGVSYXRpbyA9IChkaXN0YW5jZSAtIG1heFdpZHRoKSAvIG1heFdpZHRoO1xuXG4gICAgaWYgKHRoaXMuc2hvdWxkQW5pbWF0ZVRvb2xiYXIpIHtcblxuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICAvKiBFbnRlciBwYWdlICovXG5cbiAgICAgICAgYW5pbWl0KFt0aGlzLmRlY29tcC5lbnRlci5jb250ZW50LCB0aGlzLmRlY29tcC5lbnRlci5ib3R0b21Ub29sYmFyLCB0aGlzLmRlY29tcC5lbnRlci5iYWNrZ3JvdW5kXSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHtzd2lwZVJhdGlvICogMjV9JSwgMCwgMClgLFxuICAgICAgICAgICAgb3BhY2l0eTogMSArIHN3aXBlUmF0aW8gKiAxMCAvIDEwMCAvLyAwLjkgLT4gMVxuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLmRlY29tcC5lbnRlci50b29sYmFyQ2VudGVyKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgke3RoaXMuZGVsdGEudGl0bGUgKiBzd2lwZVJhdGlvfXB4LCAwLCAwKWAsXG4gICAgICAgICAgICBvcGFjaXR5OiAxICsgc3dpcGVSYXRpbyAvLyAwIC0+IDFcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQodGhpcy5kZWNvbXAuZW50ZXIuYmFja0J1dHRvbkxhYmVsKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAxICsgc3dpcGVSYXRpbyAqIDEwIC8gMTAwLCAvLyAwLjkgLT4gMVxuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHt0aGlzLmRlbHRhLmxhYmVsICogc3dpcGVSYXRpb31weCwgMCwgMClgXG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuZGVjb21wLmVudGVyLm90aGVyKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAxICsgc3dpcGVSYXRpbyAvLyAwIC0+IDFcbiAgICAgICAgICB9KSxcblxuICAgICAgICAvKiBMZWF2ZSBwYWdlICovXG5cbiAgICAgICAgYW5pbWl0KFt0aGlzLmRlY29tcC5sZWF2ZS5jb250ZW50LCB0aGlzLmRlY29tcC5sZWF2ZS5ib3R0b21Ub29sYmFyLCB0aGlzLmRlY29tcC5sZWF2ZS5iYWNrZ3JvdW5kLCB0aGlzLnN3aXBlU2hhZG93XSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHtkaXN0YW5jZX1weCwgMCwgMClgXG4gICAgICAgICAgfSksXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuZGVjb21wLmxlYXZlLnRvb2xiYXIpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IC0xICogc3dpcGVSYXRpbyAvLyAxIC0+IDBcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQodGhpcy5kZWNvbXAubGVhdmUudG9vbGJhckNlbnRlcilcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHsoMSArIHN3aXBlUmF0aW8pICogMTI1fSUsIDAsIDApYFxuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLmRlY29tcC5sZWF2ZS5iYWNrQnV0dG9uTGFiZWwpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IC0xICogc3dpcGVSYXRpbywgLy8gMSAtPiAwXG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgke3RoaXMuZGVsdGEudGl0bGUgKiAoMSArIHN3aXBlUmF0aW8pfXB4LCAwLCAwKWBcbiAgICAgICAgICB9KSxcblxuXG4gICAgICAgIC8qIE90aGVyICovXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuc3dpcGVTaGFkb3cpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IC0xICogc3dpcGVSYXRpbyAvLyAxIC0+IDBcbiAgICAgICAgICB9KVxuICAgICAgKTtcblxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICAgIGFuaW1pdChsZWF2ZVBhZ2UpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKCR7ZGlzdGFuY2V9cHgsIDAsIDApYFxuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChlbnRlclBhZ2UpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKCR7c3dpcGVSYXRpbyAqIDI1fSUsIDAsIDApYCxcbiAgICAgICAgICAgIG9wYWNpdHk6IDEgKyBzd2lwZVJhdGlvICogMTAgLyAxMDAgLy8gMC45IC0+IDFcbiAgICAgICAgICB9KSxcblxuICAgICAgICBhbmltaXQodGhpcy5zd2lwZVNoYWRvdylcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogLTEgKiBzd2lwZVJhdGlvIC8vIDEgLT4gMFxuICAgICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJlc3RvcmUoZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGNhbGxiYWNrKSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnU3RhcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG91bGRBbmltYXRlVG9vbGJhcikge1xuXG4gICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgIC8qIEVudGVyIHBhZ2UgKi9cblxuICAgICAgICBhbmltaXQoW3RoaXMuZGVjb21wLmVudGVyLmNvbnRlbnQsIHRoaXMuZGVjb21wLmVudGVyLmJvdHRvbVRvb2xiYXIsIHRoaXMuZGVjb21wLmVudGVyLmJhY2tncm91bmRdKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtMjUlLCAwLCAwKScsXG4gICAgICAgICAgICBvcGFjaXR5OiAwLjlcbiAgICAgICAgICB9LCB0aGlzLm9wdFJlc3RvcmUpLFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLmRlY29tcC5lbnRlci50b29sYmFyQ2VudGVyKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgtJHt0aGlzLmRlbHRhLnRpdGxlfXB4LCAwLCAwKWAsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBgb3BhY2l0eSAke3RoaXMuZHVyYXRpb25SZXN0b3JlfXMgbGluZWFyLCB0cmFuc2Zvcm0gJHt0aGlzLmR1cmF0aW9uUmVzdG9yZX1zICR7dGhpcy50aW1pbmdTd2lwZX1gLFxuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLmRlY29tcC5lbnRlci5iYWNrQnV0dG9uTGFiZWwpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKC0ke3RoaXMuZGVsdGEubGFiZWx9cHgsIDAsIDApYFxuICAgICAgICAgIH0sIHRoaXMub3B0UmVzdG9yZSksXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuZGVjb21wLmVudGVyLm90aGVyKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgfSwgdGhpcy5vcHRSZXN0b3JlKSxcblxuICAgICAgICAvKiBMZWF2ZSBwYWdlICovXG5cbiAgICAgICAgYW5pbWl0KFt0aGlzLmRlY29tcC5sZWF2ZS5jb250ZW50LCB0aGlzLmRlY29tcC5sZWF2ZS5ib3R0b21Ub29sYmFyLCB0aGlzLmRlY29tcC5sZWF2ZS5iYWNrZ3JvdW5kLCB0aGlzLnN3aXBlU2hhZG93XSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoMCwgMCwgMClgXG4gICAgICAgICAgfSwgdGhpcy5vcHRSZXN0b3JlKSxcblxuICAgICAgICBhbmltaXQodGhpcy5kZWNvbXAubGVhdmUudG9vbGJhcilcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgIH0sIHRoaXMub3B0UmVzdG9yZSksXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuZGVjb21wLmxlYXZlLnRvb2xiYXJDZW50ZXIpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsIDAsIDApYFxuICAgICAgICAgIH0sIHRoaXMub3B0UmVzdG9yZSksXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuZGVjb21wLmxlYXZlLmJhY2tCdXR0b25MYWJlbClcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMSxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsIDAsIDApYCxcbiAgICAgICAgICAgIHRyYW5zaXRpb246IGBvcGFjaXR5ICR7dGhpcy5kdXJhdGlvblJlc3RvcmV9cyBsaW5lYXIsIHRyYW5zZm9ybSAke3RoaXMuZHVyYXRpb25SZXN0b3JlfXMgJHt0aGlzLnRpbWluZ1N3aXBlfWBcbiAgICAgICAgICB9KSxcblxuXG4gICAgICAgIC8qIE90aGVyICovXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuc3dpcGVTaGFkb3cpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgICB9LCB0aGlzLm9wdFJlc3RvcmUpXG4gICAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVzZXQodGhpcy50YXJnZXQuZW50ZXIsIHRoaXMudGFyZ2V0LmxlYXZlKTtcbiAgICAgICAgICAgIGVudGVyUGFnZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcblxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgYW5pbWl0KGVudGVyUGFnZSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgtMjUlLCAwLCAwKScsXG4gICAgICAgICAgb3BhY2l0eTogMC45XG4gICAgICAgIH0sIHRoaXMub3B0UmVzdG9yZSksXG5cbiAgICAgICAgYW5pbWl0KGxlYXZlUGFnZSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKSdcbiAgICAgICAgfSwgdGhpcy5vcHRSZXN0b3JlKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgdGhpcy5fcmVzZXQoZW50ZXJQYWdlLCBsZWF2ZVBhZ2UpO1xuICAgICAgICAgIGVudGVyUGFnZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwb3BTd2lwZShlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5pc0RyYWdTdGFydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3VsZEFuaW1hdGVUb29sYmFyKSB7XG5cbiAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgLyogRW50ZXIgcGFnZSAqL1xuXG4gICAgICAgIGFuaW1pdChbdGhpcy5kZWNvbXAuZW50ZXIuY29udGVudCwgdGhpcy5kZWNvbXAuZW50ZXIuYm90dG9tVG9vbGJhciwgdGhpcy5kZWNvbXAuZW50ZXIuYmFja2dyb3VuZF0pXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICAgICAgICAgIG9wYWNpdHk6IDFcbiAgICAgICAgICB9LCB0aGlzLm9wdFN3aXBlKSxcblxuICAgICAgICBhbmltaXQodGhpcy5kZWNvbXAuZW50ZXIudG9vbGJhckNlbnRlcilcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoMCwgMCwgMClgLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogYG9wYWNpdHkgJHt0aGlzLmR1cmF0aW9uU3dpcGV9cyBsaW5lYXIsIHRyYW5zZm9ybSAke3RoaXMuZHVyYXRpb25Td2lwZX1zICR7dGhpcy50aW1pbmdTd2lwZX1gLFxuICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLmRlY29tcC5lbnRlci5iYWNrQnV0dG9uTGFiZWwpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsIDAsIDApYFxuICAgICAgICAgIH0sIHRoaXMub3B0U3dpcGUpLFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLmRlY29tcC5lbnRlci5vdGhlcilcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMVxuICAgICAgICAgIH0sIHRoaXMub3B0U3dpcGUpLFxuXG4gICAgICAgIC8qIExlYXZlIHBhZ2UgKi9cblxuICAgICAgICBhbmltaXQoW3RoaXMuZGVjb21wLmxlYXZlLmNvbnRlbnQsIHRoaXMuZGVjb21wLmxlYXZlLmJvdHRvbVRvb2xiYXIsIHRoaXMuZGVjb21wLmxlYXZlLmJhY2tncm91bmRdKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKWBcbiAgICAgICAgICB9LCB0aGlzLm9wdFN3aXBlKSxcblxuICAgICAgICBhbmltaXQodGhpcy5kZWNvbXAubGVhdmUudG9vbGJhcilcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgIH0sIHRoaXMub3B0U3dpcGUpLFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLmRlY29tcC5sZWF2ZS50b29sYmFyQ2VudGVyKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgxMjUlLCAwLCAwKWBcbiAgICAgICAgICB9LCB0aGlzLm9wdFN3aXBlKSxcblxuICAgICAgICBhbmltaXQodGhpcy5kZWNvbXAubGVhdmUuYmFja0J1dHRvbkxhYmVsKVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHt0aGlzLmRlbHRhLnRpdGxlfXB4LCAwLCAwKWAsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBgb3BhY2l0eSAke3RoaXMuZHVyYXRpb25Td2lwZX1zIGxpbmVhciwgdHJhbnNmb3JtICR7dGhpcy5kdXJhdGlvblN3aXBlfXMgJHt0aGlzLnRpbWluZ1N3aXBlfWBcbiAgICAgICAgICB9KSxcblxuXG4gICAgICAgIC8qIE90aGVyICovXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuc3dpcGVTaGFkb3cpXG4gICAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgke3RoaXMubWF4V2lkdGh9cHgsIDAsIDApYFxuICAgICAgICAgIH0sIHRoaXMub3B0U3dpcGUpXG4gICAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVzZXQodGhpcy50YXJnZXQuZW50ZXIsIHRoaXMudGFyZ2V0LmxlYXZlKTtcbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICBhbmltaXQoZW50ZXJQYWdlKVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyxcbiAgICAgICAgICBvcGFjaXR5OiAxLjBcbiAgICAgICAgfSwgdGhpcy5vcHRTd2lwZSksXG5cbiAgICAgICAgYW5pbWl0KGxlYXZlUGFnZSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgxMDAlLCAwLCAwKSdcbiAgICAgICAgfSwgdGhpcy5vcHRTd2lwZSlcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIHRoaXMuX3Jlc2V0KGVudGVyUGFnZSwgbGVhdmVQYWdlKTtcbiAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgX3NhdmVTdHlsZSguLi5hcmdzKSB7XG4gICAgdGhpcy5fc2F2ZWRTdHlsZSA9IG5ldyBXZWFrTWFwKCk7XG4gICAgY29uc3Qgc2F2ZSA9IGVsID0+IHRoaXMuX3NhdmVkU3R5bGUuc2V0KGVsLCBlbC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykpO1xuICAgIGFyZ3MuZm9yRWFjaChzYXZlKTtcblxuICAgIE9iamVjdC5rZXlzKHRoaXMuZGVjb21wKS5mb3JFYWNoKHAgPT4ge1xuICAgICAgT2JqZWN0LmtleXModGhpcy5kZWNvbXBbcF0pLmZvckVhY2goayA9PiB7XG4gICAgICAgICh0aGlzLmRlY29tcFtwXVtrXSBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy5kZWNvbXBbcF1ba10gOiBbdGhpcy5kZWNvbXBbcF1ba11dKS5mb3JFYWNoKHNhdmUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBfcmVzdG9yZVN0eWxlKC4uLmFyZ3MpIHtcbiAgICBjb25zdCByZXN0b3JlID0gZWwgPT4ge1xuICAgICAgdGhpcy5fc2F2ZWRTdHlsZS5nZXQoZWwpID09PSBudWxsID8gZWwucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpIDogZWwuc2V0QXR0cmlidXRlKCdzdHlsZScsIHRoaXMuX3NhdmVkU3R5bGUuZ2V0KGVsKSk7XG4gICAgICB0aGlzLl9zYXZlZFN0eWxlLmRlbGV0ZShlbCk7XG4gICAgfTtcbiAgICBhcmdzLmZvckVhY2gocmVzdG9yZSk7XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLmRlY29tcCkuZm9yRWFjaChwID0+IHtcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuZGVjb21wW3BdKS5mb3JFYWNoKGsgPT4ge1xuICAgICAgICAodGhpcy5kZWNvbXBbcF1ba10gaW5zdGFuY2VvZiBBcnJheSA/IHRoaXMuZGVjb21wW3BdW2tdIDogW3RoaXMuZGVjb21wW3BdW2tdXSkuZm9yRWFjaChyZXN0b3JlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgX3Jlc2V0KC4uLmFyZ3MpIHtcbiAgICB0aGlzLmlzU3dpcGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX3NhdmVkU3R5bGUgJiYgdGhpcy5fcmVzdG9yZVN0eWxlKC4uLmFyZ3MpO1xuICAgIHRoaXMudW5ibG9jayAmJiB0aGlzLnVuYmxvY2soKTtcbiAgICB0aGlzLnN3aXBlU2hhZG93LnJlbW92ZSgpO1xuICAgIHRoaXMuYmFja2dyb3VuZE1hc2sucmVtb3ZlKCk7XG4gICAgdGhpcy5vdmVyZmxvd0VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnb3ZlcmZsb3ctdmlzaWJsZScpO1xuICAgIHRoaXMuZGVjb21wLmxlYXZlLmNvbnRlbnQuY2xhc3NMaXN0LnJlbW92ZSgnY29udGVudC1zd2lwaW5nJyk7XG4gICAgdGhpcy5kZWNvbXAgPSB0aGlzLnRhcmdldCA9IHRoaXMub3ZlcmZsb3dFbGVtZW50ID0gdGhpcy5fc2F2ZWRTdHlsZSA9IG51bGw7XG4gICAgdGhpcy5pc0RyYWdTdGFydCA9IHRydWU7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBJT1NTd2lwZU5hdmlnYXRvckFuaW1hdG9yIGZyb20gJy4vaW9zLXN3aXBlLWFuaW1hdG9yLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uLy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uLy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuY29uc3QgdHJhbnNsYXRlM2QgPSAoeCA9IDAsIHkgPSAwLCB6ID0gMCkgPT4gYHRyYW5zbGF0ZTNkKCR7eH0sICR7eX0sICR7en0pYDtcblxuLyoqXG4gKiBTbGlkZSBhbmltYXRvciBmb3IgbmF2aWdhdG9yIHRyYW5zaXRpb24gbGlrZSBpT1MncyBzY3JlZW4gc2xpZGUgdHJhbnNpdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSU9TU2xpZGVOYXZpZ2F0b3JBbmltYXRvciBleHRlbmRzIElPU1N3aXBlTmF2aWdhdG9yQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHsgdGltaW5nID0gJ2N1YmljLWJlemllcigwLjMsIC40LCAwLCAuOSknLCBkZWxheSA9IDAsIGR1cmF0aW9uID0gMC40LCAuLi5yZXN0IH0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24sIC4uLnJlc3QgfSk7XG5cbiAgICB0aGlzLmJhY2tncm91bmRNYXNrID0gdXRpbC5jcmVhdGVFbGVtZW50KFxuICAgICAgYDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7YCArXG4gICAgICAgIGBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgei1pbmRleDogMlwiPjwvZGl2PmBcbiAgICApO1xuICB9XG5cbiAgX2RlY29tcG9zZShwYWdlKSB7XG4gICAgY29uc3QgdG9vbGJhciA9IHBhZ2UuX2dldFRvb2xiYXJFbGVtZW50KCk7XG4gICAgY29uc3QgbGVmdCA9IHRvb2xiYXIuX2dldFRvb2xiYXJMZWZ0SXRlbXNFbGVtZW50KCk7XG4gICAgY29uc3QgcmlnaHQgPSB0b29sYmFyLl9nZXRUb29sYmFyUmlnaHRJdGVtc0VsZW1lbnQoKTtcblxuICAgIGNvbnN0IGV4Y2x1ZGVCYWNrQnV0dG9uID0gZnVuY3Rpb24oZWxlbWVudHMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChlbGVtZW50c1tpXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnb25zLWJhY2stYnV0dG9uJykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGVsZW1lbnRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBjb25zdCBvdGhlciA9IFtdXG4gICAgICAuY29uY2F0KGxlZnQuY2hpbGRyZW4ubGVuZ3RoID09PSAwID8gbGVmdCA6IGV4Y2x1ZGVCYWNrQnV0dG9uKGxlZnQuY2hpbGRyZW4pKVxuICAgICAgLmNvbmNhdChyaWdodC5jaGlsZHJlbi5sZW5ndGggPT09IDAgPyByaWdodCA6IGV4Y2x1ZGVCYWNrQnV0dG9uKHJpZ2h0LmNoaWxkcmVuKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG9vbGJhckNlbnRlcjogdG9vbGJhci5fZ2V0VG9vbGJhckNlbnRlckl0ZW1zRWxlbWVudCgpLFxuICAgICAgYmFja0J1dHRvbkljb246IHRvb2xiYXIuX2dldFRvb2xiYXJCYWNrQnV0dG9uSWNvbkVsZW1lbnQoKSxcbiAgICAgIGJhY2tCdXR0b25MYWJlbDogdG9vbGJhci5fZ2V0VG9vbGJhckJhY2tCdXR0b25MYWJlbEVsZW1lbnQoKSxcbiAgICAgIG90aGVyOiBvdGhlcixcbiAgICAgIGNvbnRlbnQ6IHBhZ2UuX2dldENvbnRlbnRFbGVtZW50KCksXG4gICAgICBiYWNrZ3JvdW5kOiBwYWdlLl9nZXRCYWNrZ3JvdW5kRWxlbWVudCgpLFxuICAgICAgdG9vbGJhcjogdG9vbGJhcixcbiAgICAgIGJvdHRvbVRvb2xiYXI6IHBhZ2UuX2dldEJvdHRvbVRvb2xiYXJFbGVtZW50KClcbiAgICB9O1xuICB9XG5cbiAgX3Nob3VsZEFuaW1hdGVUb29sYmFyKGVudGVyUGFnZSwgbGVhdmVQYWdlKSB7XG4gICAgY29uc3QgdG9vbGJhcnMgPSBlbnRlclBhZ2UuX2NhbkFuaW1hdGVUb29sYmFyKCkgJiYgbGVhdmVQYWdlLl9jYW5BbmltYXRlVG9vbGJhcigpO1xuXG4gICAgY29uc3QgZW50ZXJUb29sYmFyID0gZW50ZXJQYWdlLl9nZXRUb29sYmFyRWxlbWVudCgpO1xuICAgIGNvbnN0IGxlYXZlVG9vbGJhciA9IGxlYXZlUGFnZS5fZ2V0VG9vbGJhckVsZW1lbnQoKTtcblxuICAgIGNvbnN0IGlzU3RhdGljID0gZW50ZXJUb29sYmFyLmhhc0F0dHJpYnV0ZSgnc3RhdGljJykgfHwgbGVhdmVUb29sYmFyLmhhc0F0dHJpYnV0ZSgnc3RhdGljJyk7XG4gICAgY29uc3QgaXNNYXRlcmlhbCA9IHV0aWwuaGFzTW9kaWZpZXIoZW50ZXJUb29sYmFyLCAnbWF0ZXJpYWwnKSB8fCB1dGlsLmhhc01vZGlmaWVyKGxlYXZlVG9vbGJhciwgJ21hdGVyaWFsJyk7XG4gICAgY29uc3QgaXNUcmFuc3BhcmVudCA9IHV0aWwuaGFzTW9kaWZpZXIoZW50ZXJUb29sYmFyLCAndHJhbnNwYXJlbnQnKSB8fCB1dGlsLmhhc01vZGlmaWVyKGxlYXZlVG9vbGJhciwgJ3RyYW5zcGFyZW50Jyk7XG5cbiAgICByZXR1cm4gdG9vbGJhcnMgJiYgIWlzU3RhdGljICYmICFpc01hdGVyaWFsICYmICFpc1RyYW5zcGFyZW50O1xuICB9XG5cbiAgX2NhbGN1bGF0ZURlbHRhKGVsZW1lbnQsIGRlY29tcG9zaXRpb24pIHtcbiAgICBsZXQgdGl0bGUsIGxhYmVsO1xuXG4gICAgY29uc3QgcGFnZVJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChkZWNvbXBvc2l0aW9uLmJhY2tCdXR0b25MYWJlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2JhY2stYnV0dG9uX19sYWJlbCcpKSB7XG4gICAgICBjb25zdCBsYWJlbFJlY3QgPSBkZWNvbXBvc2l0aW9uLmJhY2tCdXR0b25MYWJlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRpdGxlID0gTWF0aC5yb3VuZChwYWdlUmVjdC53aWR0aCAvIDIgLSBsYWJlbFJlY3Qud2lkdGggLyAyIC0gbGFiZWxSZWN0LmxlZnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aXRsZSA9IE1hdGgucm91bmQoKHBhZ2VSZWN0LndpZHRoIC8gMikgKiAwLjYpO1xuICAgIH1cblxuICAgIGlmIChkZWNvbXBvc2l0aW9uLmJhY2tCdXR0b25JY29uLmNsYXNzTGlzdC5jb250YWlucygnYmFjay1idXR0b25fX2ljb24nKSkge1xuICAgICAgbGFiZWwgPSBkZWNvbXBvc2l0aW9uLmJhY2tCdXR0b25JY29uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0IC0gMjtcbiAgICB9XG5cbiAgICByZXR1cm4ge3RpdGxlLCBsYWJlbH07XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGVudGVyUGFnZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbGVhdmVQYWdlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBwdXNoKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgIHRoaXMuYmFja2dyb3VuZE1hc2sucmVtb3ZlKCk7XG4gICAgbGVhdmVQYWdlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuYmFja2dyb3VuZE1hc2ssIGxlYXZlUGFnZSk7XG5cbiAgICBjb25zdCB1bmJsb2NrID0gc3VwZXIuYmxvY2soZW50ZXJQYWdlKTtcblxuICAgIGNvbnRlbnRSZWFkeShlbnRlclBhZ2UsICgpID0+IHtcbiAgICAgIGNvbnN0IGVudGVyUGFnZVRhcmdldCA9IHV0aWwuZmluZFRvb2xiYXJQYWdlKGVudGVyUGFnZSkgfHwgZW50ZXJQYWdlO1xuICAgICAgY29uc3QgbGVhdmVQYWdlVGFyZ2V0ID0gdXRpbC5maW5kVG9vbGJhclBhZ2UobGVhdmVQYWdlKSB8fCBsZWF2ZVBhZ2U7XG4gICAgICBjb25zdCBlbnRlclBhZ2VEZWNvbXBvc2l0aW9uID0gdGhpcy5fZGVjb21wb3NlKGVudGVyUGFnZVRhcmdldCk7XG4gICAgICBjb25zdCBsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uID0gdGhpcy5fZGVjb21wb3NlKGxlYXZlUGFnZVRhcmdldCk7XG5cbiAgICAgIGNvbnN0IGRlbHRhID0gdGhpcy5fY2FsY3VsYXRlRGVsdGEobGVhdmVQYWdlLCBlbnRlclBhZ2VEZWNvbXBvc2l0aW9uKTtcblxuICAgICAgY29uc3Qgc2hvdWxkQW5pbWF0ZVRvb2xiYXIgPSB0aGlzLl9zaG91bGRBbmltYXRlVG9vbGJhcihlbnRlclBhZ2VUYXJnZXQsIGxlYXZlUGFnZVRhcmdldCk7XG5cbiAgICAgIGlmIChzaG91bGRBbmltYXRlVG9vbGJhcikge1xuXG4gICAgICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgICAgICBhbmltaXQoW2VudGVyUGFnZURlY29tcG9zaXRpb24uY29udGVudCwgZW50ZXJQYWdlRGVjb21wb3NpdGlvbi5ib3R0b21Ub29sYmFyLCBlbnRlclBhZ2VEZWNvbXBvc2l0aW9uLmJhY2tncm91bmRdLCB0aGlzLmRlZilcbiAgICAgICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoJzEwMCUnKSB9LFxuICAgICAgICAgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoKSB9XG4gICAgICAgICAgICApLFxuXG4gICAgICAgICAgYW5pbWl0KGVudGVyUGFnZURlY29tcG9zaXRpb24udG9vbGJhciwgdGhpcy5kZWYpXG4gICAgICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDAgfSwgeyBvcGFjaXR5OiAxIH0pLFxuXG4gICAgICAgICAgYW5pbWl0KGVudGVyUGFnZURlY29tcG9zaXRpb24udG9vbGJhckNlbnRlciwgdGhpcy5kZWYpXG4gICAgICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCcxMjUlJyksIG9wYWNpdHk6IDEgfSxcbiAgICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCksIG9wYWNpdHk6IDEgfVxuICAgICAgICAgICAgKSxcblxuICAgICAgICAgIGFuaW1pdChlbnRlclBhZ2VEZWNvbXBvc2l0aW9uLmJhY2tCdXR0b25MYWJlbCwgdGhpcy5kZWYpXG4gICAgICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKGAke2RlbHRhLnRpdGxlfXB4YCksIG9wYWNpdHk6IDAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoKSxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb246IGBvcGFjaXR5ICR7dGhpcy5kdXJhdGlvbn1zIGxpbmVhciwgdHJhbnNmb3JtICR7dGhpcy5kdXJhdGlvbn1zICR7dGhpcy50aW1pbmd9YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLFxuXG4gICAgICAgICAgYW5pbWl0KGVudGVyUGFnZURlY29tcG9zaXRpb24ub3RoZXIsIHRoaXMuZGVmKVxuICAgICAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgICAgIHsgb3BhY2l0eTogMCB9LFxuICAgICAgICAgICAgICB7IGNzczogeyBvcGFjaXR5OiAxIH0sIHRpbWluZzogJ2xpbmVhcicgfVxuICAgICAgICAgICAgKSxcblxuICAgICAgICAgIGFuaW1pdChbbGVhdmVQYWdlRGVjb21wb3NpdGlvbi5jb250ZW50LCBsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uLmJvdHRvbVRvb2xiYXIsIGxlYXZlUGFnZURlY29tcG9zaXRpb24uYmFja2dyb3VuZF0sIHRoaXMuZGVmKVxuICAgICAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgICAgIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgpLCBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgICAgIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgnLTI1JScpLCBvcGFjaXR5OiAwLjkgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmJhY2tncm91bmRNYXNrLnJlbW92ZSgpO1xuICAgICAgICAgICAgICB1bmJsb2NrKCk7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgYW5pbWl0KGxlYXZlUGFnZURlY29tcG9zaXRpb24udG9vbGJhckNlbnRlciwgdGhpcy5kZWYpXG4gICAgICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCksIG9wYWNpdHk6IDEgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoYC0ke2RlbHRhLnRpdGxlfXB4YCksXG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiBgb3BhY2l0eSAke3RoaXMuZHVyYXRpb259cyBsaW5lYXIsIHRyYW5zZm9ybSAke3RoaXMuZHVyYXRpb259cyAke3RoaXMudGltaW5nfWBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKSxcblxuICAgICAgICAgIGFuaW1pdChsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uLmJhY2tCdXR0b25MYWJlbCwgdGhpcy5kZWYpXG4gICAgICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCksIG9wYWNpdHk6IDEgfSxcbiAgICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKGAtJHtkZWx0YS5sYWJlbH1weGApLCBvcGFjaXR5OiAwIH1cbiAgICAgICAgICAgICksXG5cbiAgICAgICAgICBhbmltaXQobGVhdmVQYWdlRGVjb21wb3NpdGlvbi5vdGhlciwgdGhpcy5kZWYpXG4gICAgICAgICAgICAuZGVmYXVsdCggeyBvcGFjaXR5OiAxIH0sIHsgY3NzOiB7IG9wYWNpdHk6IDAgfSwgdGltaW5nOiAnbGluZWFyJyB9KVxuXG4gICAgICAgICk7XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICAgIGFuaW1pdChlbnRlclBhZ2UsIHRoaXMuZGVmKVxuICAgICAgICAgICAgLmRlZmF1bHQoIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgnMTAwJScpLCB9LCB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoKSB9KSxcblxuICAgICAgICAgIGFuaW1pdChsZWF2ZVBhZ2UsIHRoaXMuZGVmKVxuICAgICAgICAgICAgLmRlZmF1bHQoIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgpLCBvcGFjaXR5OiAxIH0sIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgnLTI1JScpLCBvcGFjaXR5OiAuOSB9KVxuICAgICAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmJhY2tncm91bmRNYXNrLnJlbW92ZSgpO1xuICAgICAgICAgICAgICB1bmJsb2NrKCk7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHBvcChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5pc1N3aXBpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLnBvcFN3aXBlKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgdGhpcy5iYWNrZ3JvdW5kTWFzay5yZW1vdmUoKTtcbiAgICBlbnRlclBhZ2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5iYWNrZ3JvdW5kTWFzaywgZW50ZXJQYWdlKTtcblxuICAgIGNvbnN0IHVuYmxvY2sgPSBzdXBlci5ibG9jayhlbnRlclBhZ2UpO1xuXG4gICAgY29uc3QgZW50ZXJQYWdlVGFyZ2V0ID0gdXRpbC5maW5kVG9vbGJhclBhZ2UoZW50ZXJQYWdlKSB8fCBlbnRlclBhZ2U7XG4gICAgY29uc3QgbGVhdmVQYWdlVGFyZ2V0ID0gdXRpbC5maW5kVG9vbGJhclBhZ2UobGVhdmVQYWdlKSB8fCBsZWF2ZVBhZ2U7XG4gICAgY29uc3QgZW50ZXJQYWdlRGVjb21wb3NpdGlvbiA9IHRoaXMuX2RlY29tcG9zZShlbnRlclBhZ2VUYXJnZXQpO1xuICAgIGNvbnN0IGxlYXZlUGFnZURlY29tcG9zaXRpb24gPSB0aGlzLl9kZWNvbXBvc2UobGVhdmVQYWdlVGFyZ2V0KTtcblxuICAgIGNvbnN0IGRlbHRhID0gdGhpcy5fY2FsY3VsYXRlRGVsdGEobGVhdmVQYWdlLCBsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uKTtcblxuICAgIGNvbnN0IHNob3VsZEFuaW1hdGVUb29sYmFyID0gdGhpcy5fc2hvdWxkQW5pbWF0ZVRvb2xiYXIoZW50ZXJQYWdlVGFyZ2V0LCBsZWF2ZVBhZ2VUYXJnZXQpO1xuXG4gICAgaWYgKHNob3VsZEFuaW1hdGVUb29sYmFyKSB7XG4gICAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICAgIGFuaW1pdChbZW50ZXJQYWdlRGVjb21wb3NpdGlvbi5jb250ZW50LCBlbnRlclBhZ2VEZWNvbXBvc2l0aW9uLmJvdHRvbVRvb2xiYXIsIGVudGVyUGFnZURlY29tcG9zaXRpb24uYmFja2dyb3VuZF0sIHRoaXMuZGVmKVxuICAgICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCctMjUlJyksIG9wYWNpdHk6IC45IH0sXG4gICAgICAgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoKSwgb3BhY2l0eTogMSB9XG4gICAgICAgICAgKSxcblxuICAgICAgICBhbmltaXQoZW50ZXJQYWdlRGVjb21wb3NpdGlvbi50b29sYmFyQ2VudGVyLCB0aGlzLmRlZilcbiAgICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICAgIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZChgLSR7ZGVsdGEudGl0bGV9cHhgKSwgb3BhY2l0eTogMCB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCksXG4gICAgICAgICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgICAgICAgIHRyYW5zaXRpb246IGBvcGFjaXR5ICR7dGhpcy5kdXJhdGlvbn1zIGxpbmVhciwgdHJhbnNmb3JtICR7dGhpcy5kdXJhdGlvbn1zICR7dGhpcy50aW1pbmd9YFxuICAgICAgICAgICAgfVxuICAgICAgICAgICksXG5cbiAgICAgICAgYW5pbWl0KGVudGVyUGFnZURlY29tcG9zaXRpb24uYmFja0J1dHRvbkxhYmVsLCB0aGlzLmRlZilcbiAgICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICAgIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZChgLSR7ZGVsdGEubGFiZWx9cHhgKSB9LFxuICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCkgfVxuICAgICAgICAgICksXG5cbiAgICAgICAgYW5pbWl0KGVudGVyUGFnZURlY29tcG9zaXRpb24ub3RoZXIsIHRoaXMuZGVmKVxuICAgICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgICAgeyBvcGFjaXR5OiAwIH0sXG4gICAgICAgICAgICB7IGNzczogeyBvcGFjaXR5OiAxIH0sIHRpbWluZzogJ2xpbmVhcicgfVxuICAgICAgICAgICksXG5cbiAgICAgICAgYW5pbWl0KFtsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uLmNvbnRlbnQsIGxlYXZlUGFnZURlY29tcG9zaXRpb24uYm90dG9tVG9vbGJhciwgbGVhdmVQYWdlRGVjb21wb3NpdGlvbi5iYWNrZ3JvdW5kXSwgdGhpcy5kZWYpXG4gICAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoKSB9LFxuICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCcxMDAlJykgfVxuICAgICAgICAgIClcbiAgICAgICAgICAud2FpdCgwKVxuICAgICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICAgIHRoaXMuYmFja2dyb3VuZE1hc2sucmVtb3ZlKCk7XG4gICAgICAgICAgICB1bmJsb2NrKCk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdChsZWF2ZVBhZ2VEZWNvbXBvc2l0aW9uLnRvb2xiYXIsIHRoaXMuZGVmKVxuICAgICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgICAgeyBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgICB7IG9wYWNpdHk6IDAgfVxuICAgICAgICAgICksXG5cbiAgICAgICAgYW5pbWl0KGxlYXZlUGFnZURlY29tcG9zaXRpb24udG9vbGJhckNlbnRlciwgdGhpcy5kZWYpXG4gICAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoKSB9LFxuICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCcxMjUlJykgfVxuICAgICAgICAgICksXG5cbiAgICAgICAgYW5pbWl0KGxlYXZlUGFnZURlY29tcG9zaXRpb24uYmFja0J1dHRvbkxhYmVsLCB0aGlzLmRlZilcbiAgICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICAgIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgpLCBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoYCR7ZGVsdGEudGl0bGV9cHhgKSxcbiAgICAgICAgICAgICAgb3BhY2l0eTogMCxcbiAgICAgICAgICAgICAgdHJhbnNpdGlvbjogYG9wYWNpdHkgJHt0aGlzLmR1cmF0aW9ufXMgbGluZWFyLCB0cmFuc2Zvcm0gJHt0aGlzLmR1cmF0aW9ufXMgJHt0aGlzLnRpbWluZ31gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgICBhbmltaXQoZW50ZXJQYWdlLCB0aGlzLmRlZilcbiAgICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICAgIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgnLTI1JScpLCBvcGFjaXR5OiAuOSB9LFxuICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCksIG9wYWNpdHk6IDEgfVxuICAgICAgICAgICksXG5cbiAgICAgICAgYW5pbWl0KGxlYXZlUGFnZSwgdGhpcy5kZWYpXG4gICAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoKSB9LFxuICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKCcxMDAlJykgfVxuICAgICAgICAgIClcbiAgICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmJhY2tncm91bmRNYXNrLnJlbW92ZSgpO1xuICAgICAgICAgICAgdW5ibG9jaygpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBOYXZpZ2F0b3JBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uLy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5cbi8qKlxuICogTGlmdCBzY3JlZW4gdHJhbnNpdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSU9TTGlmdE5hdmlnYXRvckFuaW1hdG9yIGV4dGVuZHMgTmF2aWdhdG9yQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjEsIDEpJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuNH0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG5cbiAgICB0aGlzLmJhY2tncm91bmRNYXNrID0gdXRpbC5jcmVhdGVFbGVtZW50KFxuICAgICAgJzxkaXYgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7JyArXG4gICAgICAgICdiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoYmxhY2ssIHdoaXRlKTtcIj48L2Rpdj4nXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHB1c2goZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5iYWNrZ3JvdW5kTWFzay5yZW1vdmUoKTtcbiAgICBsZWF2ZVBhZ2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5iYWNrZ3JvdW5kTWFzaywgbGVhdmVQYWdlKTtcblxuICAgIGNvbnN0IHVuYmxvY2sgPSBzdXBlci5ibG9jayhlbnRlclBhZ2UpO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGVudGVyUGFnZSwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMTAwJSwgMCknIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScgfVxuICAgICAgICApLFxuXG4gICAgICBhbmltaXQobGVhdmVQYWdlLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScsIG9wYWNpdHk6IDEgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIC0xMCUsIDApJywgb3BhY2l0eTogLjkgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICB0aGlzLmJhY2tncm91bmRNYXNrLnJlbW92ZSgpO1xuICAgICAgICAgIHVuYmxvY2soKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBlbnRlclBhZ2VcbiAgICogQHBhcmFtIHtPYmplY3R9IGxlYXZlUGFnZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgcG9wKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgIHRoaXMuYmFja2dyb3VuZE1hc2sucmVtb3ZlKCk7XG4gICAgZW50ZXJQYWdlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuYmFja2dyb3VuZE1hc2ssIGVudGVyUGFnZSk7XG5cbiAgICBjb25zdCB1bmJsb2NrID0gc3VwZXIuYmxvY2soZW50ZXJQYWdlKTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChlbnRlclBhZ2UsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIC00M3B4LCAwKScsIG9wYWNpdHk6IC45IH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzRCgwLCAwLCAwKScsIG9wYWNpdHk6IDEgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICB0aGlzLmJhY2tncm91bmRNYXNrLnJlbW92ZSgpO1xuICAgICAgICAgIHVuYmxvY2soKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSksXG5cbiAgICAgIGFuaW1pdChsZWF2ZVBhZ2UsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDAsIDApJyB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMTAwJSwgMCknIH1cbiAgICAgICAgKVxuICAgICk7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBOYXZpZ2F0b3JBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uLy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5cbmNvbnN0IHRyYW5zZm9ybSA9ICd0cmFuc2xhdGUzZCgwLCAwLCAwKSc7XG5cbi8qKlxuICogRmFkZS1pbiBzY3JlZW4gdHJhbnNpdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSU9TRmFkZU5hdmlnYXRvckFuaW1hdG9yIGV4dGVuZHMgTmF2aWdhdG9yQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnbGluZWFyJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuNH0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGVudGVyUGFnZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbGVhdmVQYWdlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBwdXNoKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHVuYmxvY2sgPSBzdXBlci5ibG9jayhlbnRlclBhZ2UpO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGVudGVyUGFnZSwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtLCBvcGFjaXR5OiAwIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm0sIG9wYWNpdHk6IDEgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICB1bmJsb2NrKCk7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pLFxuICAgICk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgKi9cbiAgcG9wKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHVuYmxvY2sgPSBzdXBlci5ibG9jayhlbnRlclBhZ2UpO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGxlYXZlUGFnZSwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtLCBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm0sIG9wYWNpdHk6IDAgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICB1bmJsb2NrKCk7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi4vLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IE5hdmlnYXRvckFuaW1hdG9yIGZyb20gJy4vYW5pbWF0b3IuanMnO1xuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi8uLi9vbnMvYW5pbWl0LmpzJztcblxuLyoqXG4gKiBTbGlkZSBhbmltYXRvciBmb3IgbmF2aWdhdG9yIHRyYW5zaXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1EU2xpZGVOYXZpZ2F0b3JBbmltYXRvciBleHRlbmRzIE5hdmlnYXRvckFuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2N1YmljLWJlemllciguMSwgLjcsIC40LCAxKScsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjN9ID0ge30pIHtcbiAgICBzdXBlcih7dGltaW5nLCBkZWxheSwgZHVyYXRpb259KTtcblxuICAgIHRoaXMuYmxhY2tNYXNrT3BhY2l0eSA9IDAuNDtcbiAgICB0aGlzLmJhY2tncm91bmRNYXNrID0gdXRpbC5jcmVhdGVFbGVtZW50KFxuICAgICAgJzxkaXYgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IHotaW5kZXg6IDI7JyArXG4gICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsgb3BhY2l0eTogMDtcIj48L2Rpdj4nXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHB1c2goZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5iYWNrZ3JvdW5kTWFzay5yZW1vdmUoKTtcbiAgICBsZWF2ZVBhZ2UucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5iYWNrZ3JvdW5kTWFzaywgbGVhdmVQYWdlLm5leHRTaWJsaW5nKTtcblxuICAgIGNvbnN0IHVuYmxvY2sgPSBzdXBlci5ibG9jayhlbnRlclBhZ2UpO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KHRoaXMuYmFja2dyb3VuZE1hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJywgb3BhY2l0eTogMCB9LFxuICAgICAgICAgIHsgb3BhY2l0eTogdGhpcy5ibGFja01hc2tPcGFjaXR5IH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kTWFzay5yZW1vdmUoKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pLFxuXG4gICAgICBhbmltaXQoZW50ZXJQYWdlLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKScgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyB9XG4gICAgICAgICksXG5cbiAgICAgIGFuaW1pdChsZWF2ZVBhZ2UsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTQ1JSwgMCwgMCknIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgdW5ibG9jaygpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R9IGVudGVyUGFnZVxuICAgKiBAcGFyYW0ge09iamVjdH0gbGVhdmVQYWdlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBwb3AoZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5iYWNrZ3JvdW5kTWFzay5yZW1vdmUoKTtcbiAgICBlbnRlclBhZ2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5iYWNrZ3JvdW5kTWFzaywgZW50ZXJQYWdlLm5leHRTaWJsaW5nKTtcblxuICAgIGNvbnN0IHVuYmxvY2sgPSBzdXBlci5ibG9jayhlbnRlclBhZ2UpO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KHRoaXMuYmFja2dyb3VuZE1hc2ssIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJywgb3BhY2l0eTogdGhpcy5ibGFja01hc2tPcGFjaXR5IH0sXG4gICAgICAgICAgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kTWFzay5yZW1vdmUoKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pLFxuXG4gICAgICBhbmltaXQoZW50ZXJQYWdlLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtNDUlLCAwLCAwKScsIG9wYWNpdHk6IC45IH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsIG9wYWNpdHk6IDEgfVxuICAgICAgICApLFxuXG4gICAgICBhbmltaXQobGVhdmVQYWdlLCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDEwMCUsIDAsIDApJyB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIHVuYmxvY2soKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgTmF2aWdhdG9yQW5pbWF0b3IgZnJvbSAnLi9hbmltYXRvci5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi8uLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuXG4vKipcbiAqIExpZnQgc2NyZWVuIHRyYW5zaXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ETGlmdE5hdmlnYXRvckFuaW1hdG9yIGV4dGVuZHMgTmF2aWdhdG9yQW5pbWF0b3Ige1xuXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjEsIDEpJywgZGVsYXkgPSAwLjA1LCBkdXJhdGlvbiA9IDAuNH0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG5cbiAgICB0aGlzLmJhY2tncm91bmRNYXNrID0gdXRpbC5jcmVhdGVFbGVtZW50KFxuICAgICAgJzxkaXYgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7JyArXG4gICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztcIj48L2Rpdj4nXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHB1c2goZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5iYWNrZ3JvdW5kTWFzay5yZW1vdmUoKTtcbiAgICBsZWF2ZVBhZ2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5iYWNrZ3JvdW5kTWFzaywgbGVhdmVQYWdlKTtcblxuICAgIGNvbnN0IHVuYmxvY2sgPSBzdXBlci5ibG9jayhlbnRlclBhZ2UpO1xuXG4gICAgY29uc3QgbWFza0NsZWFyID0gYW5pbWl0KHRoaXMuYmFja2dyb3VuZE1hc2spXG4gICAgICAud2FpdCh0aGlzLmRlbGF5ICsgdGhpcy5kdXJhdGlvbilcbiAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kTWFzay5yZW1vdmUoKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSk7XG5cbiAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICBtYXNrQ2xlYXIsXG5cbiAgICAgIGFuaW1pdChlbnRlclBhZ2UsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDEwMCUsIDApJyB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknIH1cbiAgICAgICAgKSxcblxuICAgICAgYW5pbWl0KGxlYXZlUGFnZSwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KHsgb3BhY2l0eTogMSB9LCB7IG9wYWNpdHk6IC40IH0pXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICB1bmJsb2NrKCk7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHBvcChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmJhY2tncm91bmRNYXNrLnJlbW92ZSgpO1xuICAgIGVudGVyUGFnZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmJhY2tncm91bmRNYXNrLCBlbnRlclBhZ2UpO1xuXG4gICAgY29uc3QgdW5ibG9jayA9IHN1cGVyLmJsb2NrKGVudGVyUGFnZSk7XG5cbiAgICBhbmltaXQucnVuQWxsKFxuXG4gICAgICBhbmltaXQodGhpcy5iYWNrZ3JvdW5kTWFzaylcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSArIHRoaXMuZHVyYXRpb24pXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICB0aGlzLmJhY2tncm91bmRNYXNrLnJlbW92ZSgpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSksXG5cbiAgICAgIGFuaW1pdChlbnRlclBhZ2UsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IC40IH0sIHsgb3BhY2l0eTogMSB9KVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgdW5ibG9jaygpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KSxcblxuICAgICAgYW5pbWl0KGxlYXZlUGFnZSwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAxMDAlLCAwKScgfVxuICAgICAgICApXG4gICAgKTtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IE5hdmlnYXRvckFuaW1hdG9yIGZyb20gJy4vYW5pbWF0b3IuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi8uLi9vbnMvYW5pbWl0LmpzJztcblxuLyoqXG4gKiBGYWRlLWluICsgTGlmdCBzY3JlZW4gdHJhbnNpdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTURGYWRlTmF2aWdhdG9yQW5pbWF0b3IgZXh0ZW5kcyBOYXZpZ2F0b3JBbmltYXRvciB7XG5cbiAgY29uc3RydWN0b3Ioe3RpbWluZyA9ICdjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpJywgdGltaW5nUG9wID0gJ2N1YmljLWJlemllcigwLjQsIDAsIDEsIDEpJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMn0gPSB7fSkge1xuICAgIHN1cGVyKHt0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbn0pO1xuICAgIHRoaXMudGltaW5nUG9wID0gdGltaW5nUG9wO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBlbnRlclBhZ2VcbiAgICogQHBhcmFtIHtPYmplY3R9IGxlYXZlUGFnZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgcHVzaChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCB1bmJsb2NrID0gc3VwZXIuYmxvY2soZW50ZXJQYWdlKTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG5cbiAgICAgIGFuaW1pdChlbnRlclBhZ2UsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNEKDAsIDQycHgsIDApJywgb3BhY2l0eTogMCB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLCBvcGFjaXR5OiAxIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgdW5ibG9jaygpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZW50ZXJQYWdlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBsZWF2ZVBhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgKi9cbiAgcG9wKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHVuYmxvY2sgPSBzdXBlci5ibG9jayhlbnRlclBhZ2UpO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcblxuICAgICAgYW5pbWl0KGxlYXZlUGFnZSwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMCwgMCknLCBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgeyBjc3M6IHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM0QoMCwgMzhweCwgMCknLCBvcGFjaXR5OiAwIH0sIHRpbWluZzogdGhpcy50aW1pbmdQb3AgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICB1bmJsb2NrKCk7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IE5hdmlnYXRvckFuaW1hdG9yIGZyb20gJy4vYW5pbWF0b3IuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOb25lTmF2aWdhdG9yQW5pbWF0b3IgZXh0ZW5kcyBOYXZpZ2F0b3JBbmltYXRvciB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgfVxuICBwdXNoKGVudGVyUGFnZSwgbGVhdmVQYWdlLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBwb3AoZW50ZXJQYWdlLCBsZWF2ZVBhZ2UsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgaW50ZXJuYWwgZnJvbSAnLi4vb25zL2ludGVybmFsL2luZGV4LmpzJztcbmltcG9ydCBTd2lwZVJldmVhbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvc3dpcGUtcmV2ZWFsLmpzJztcbmltcG9ydCBBbmltYXRvckZhY3RvcnkgZnJvbSAnLi4vb25zL2ludGVybmFsL2FuaW1hdG9yLWZhY3RvcnkuanMnO1xuaW1wb3J0IE5hdmlnYXRvckFuaW1hdG9yIGZyb20gJy4vb25zLW5hdmlnYXRvci9hbmltYXRvci5qcyc7XG5pbXBvcnQgSU9TU2xpZGVOYXZpZ2F0b3JBbmltYXRvciBmcm9tICcuL29ucy1uYXZpZ2F0b3IvaW9zLXNsaWRlLWFuaW1hdG9yLmpzJztcbmltcG9ydCBJT1NMaWZ0TmF2aWdhdG9yQW5pbWF0b3IgZnJvbSAnLi9vbnMtbmF2aWdhdG9yL2lvcy1saWZ0LWFuaW1hdG9yLmpzJztcbmltcG9ydCBJT1NGYWRlTmF2aWdhdG9yQW5pbWF0b3IgZnJvbSAnLi9vbnMtbmF2aWdhdG9yL2lvcy1mYWRlLWFuaW1hdG9yLmpzJztcbmltcG9ydCBNRFNsaWRlTmF2aWdhdG9yQW5pbWF0b3IgZnJvbSAnLi9vbnMtbmF2aWdhdG9yL21kLXNsaWRlLWFuaW1hdG9yLmpzJztcbmltcG9ydCBNRExpZnROYXZpZ2F0b3JBbmltYXRvciBmcm9tICcuL29ucy1uYXZpZ2F0b3IvbWQtbGlmdC1hbmltYXRvci5qcyc7XG5pbXBvcnQgTURGYWRlTmF2aWdhdG9yQW5pbWF0b3IgZnJvbSAnLi9vbnMtbmF2aWdhdG9yL21kLWZhZGUtYW5pbWF0b3IuanMnO1xuaW1wb3J0IE5vbmVOYXZpZ2F0b3JBbmltYXRvciBmcm9tICcuL29ucy1uYXZpZ2F0b3Ivbm9uZS1hbmltYXRvci5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vb25zL3BsYXRmb3JtLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGRldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyIGZyb20gJy4uL29ucy9pbnRlcm5hbC9kZXZpY2UtYmFjay1idXR0b24tZGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQge1BhZ2VMb2FkZXIsIGRlZmF1bHRQYWdlTG9hZGVyLCBpbnN0YW50UGFnZUxvYWRlcn0gZnJvbSAnLi4vb25zL3BhZ2UtbG9hZGVyLmpzJztcblxuY29uc3QgX2FuaW1hdG9yRGljdCA9IHtcbiAgJ2RlZmF1bHQnOiBmdW5jdGlvbiAoKSB7IHJldHVybiBwbGF0Zm9ybS5pc0FuZHJvaWQoKSA/IE1ERmFkZU5hdmlnYXRvckFuaW1hdG9yIDogSU9TU2xpZGVOYXZpZ2F0b3JBbmltYXRvcjsgfSxcbiAgJ3NsaWRlJzogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBNRFNsaWRlTmF2aWdhdG9yQW5pbWF0b3IgOiBJT1NTbGlkZU5hdmlnYXRvckFuaW1hdG9yOyB9LFxuICAnbGlmdCc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBsYXRmb3JtLmlzQW5kcm9pZCgpID8gTURMaWZ0TmF2aWdhdG9yQW5pbWF0b3IgOiBJT1NMaWZ0TmF2aWdhdG9yQW5pbWF0b3I7IH0sXG4gICdmYWRlJzogZnVuY3Rpb24gKCkgeyByZXR1cm4gcGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBNREZhZGVOYXZpZ2F0b3JBbmltYXRvciA6IElPU0ZhZGVOYXZpZ2F0b3JBbmltYXRvcjsgfSxcbiAgJ3NsaWRlLWlvcyc6IElPU1NsaWRlTmF2aWdhdG9yQW5pbWF0b3IsXG4gICdzbGlkZS1tZCc6IE1EU2xpZGVOYXZpZ2F0b3JBbmltYXRvcixcbiAgJ2xpZnQtaW9zJzogSU9TTGlmdE5hdmlnYXRvckFuaW1hdG9yLFxuICAnbGlmdC1tZCc6IE1ETGlmdE5hdmlnYXRvckFuaW1hdG9yLFxuICAnZmFkZS1pb3MnOiBJT1NGYWRlTmF2aWdhdG9yQW5pbWF0b3IsXG4gICdmYWRlLW1kJzogTURGYWRlTmF2aWdhdG9yQW5pbWF0b3IsXG4gICdub25lJzogTm9uZU5hdmlnYXRvckFuaW1hdG9yXG59O1xuXG5jb25zdCByZXdyaXRhYmxlcyA9IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbmF2aWdhdG9yU2lkZUVsZW1lbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHJlYWR5KG5hdmlnYXRvckVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxufTtcblxuY29uc3QgdmVyaWZ5UGFnZUVsZW1lbnQgPSBlbCA9PiAoZWwubm9kZU5hbWUgIT09ICdPTlMtUEFHRScpICYmIHV0aWwudGhyb3coICdPbmx5IHBhZ2UgZWxlbWVudHMgY2FuIGJlIGNoaWxkcmVuIG9mIG5hdmlnYXRvcicpO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1uYXZpZ2F0b3JcbiAqIEBjYXRlZ29yeSBuYXZpZ2F0aW9uXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIEEgY29tcG9uZW50IHRoYXQgcHJvdmlkZXMgcGFnZSBzdGFjayBtYW5hZ2VtZW50IGFuZCBuYXZpZ2F0aW9uLiBTdGFjayBuYXZpZ2F0aW9uIGlzIHRoZSBtb3N0IGNvbW1vbiBuYXZpZ2F0aW9uIHBhdHRlcm4gZm9yIG1vYmlsZSBhcHBzLlxuICpcbiAqICAgICBXaGVuIGEgcGFnZSBpcyBwdXNoZWQgb24gdG9wIG9mIHRoZSBzdGFjayBpdCBpcyBkaXNwbGF5ZWQgd2l0aCBhIHRyYW5zaXRpb24gYW5pbWF0aW9uLiBXaGVuIHRoZSB1c2VyIHJldHVybnMgdG8gdGhlIHByZXZpb3VzIHBhZ2UgdGhlIHRvcCBwYWdlIHdpbGwgYmUgcG9wcGVkIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kIGhpZGRlbiB3aXRoIGFuIG9wcG9zaXRlIHRyYW5zaXRpb24gYW5pbWF0aW9uLlxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBjb2RlcGVuIHlyaHR2XG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvbmF2aWdhdG9yXG4gKiBAZ3VpZGUgbGlmZWN5Y2xlLmh0bWwjZXZlbnRzXG4gKiAgIFtlbl1PdmVydmlldyBvZiBwYWdlIGV2ZW50c1svZW5dXG4gKiAgIFtqYV1PdmVydmlldyBvZiBwYWdlIGV2ZW50c1svamFdXG4gKiBAc2VlYWxzbyBvbnMtdG9vbGJhclxuICogICBbZW5dVGhlIGA8b25zLXRvb2xiYXI+YCBjb21wb25lbnQgaXMgdXNlZCB0byBkaXNwbGF5IGEgdG9vbGJhciBvbiB0aGUgdG9wIG9mIGEgcGFnZS5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1iYWNrLWJ1dHRvblxuICogICBbZW5dVGhlIGA8b25zLWJhY2stYnV0dG9uPmAgY29tcG9uZW50IGxldHMgdGhlIHVzZXIgcmV0dXJuIHRvIHRoZSBwcmV2aW91cyBwYWdlLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtbmF2aWdhdG9yIGlkPVwibmF2aWdhdG9yXCI+XG4gKiAgIDxvbnMtcGFnZT5cbiAqICAgICA8b25zLXRvb2xiYXI+XG4gKiAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyXCI+XG4gKiAgICAgICAgIFRpdGxlXG4gKiAgICAgICA8L2Rpdj5cbiAqICAgICA8L29ucy10b29sYmFyPlxuICogICAgIDxwPlxuICogICAgICAgPG9ucy1idXR0b25cbiAqICAgICAgICAgb25jbGljaz1cImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduYXZpZ2F0b3InKS5wdXNoUGFnZSgncGFnZS5odG1sJylcIj5cbiAqICAgICAgICAgUHVzaCBwYWdlXG4gKiAgICAgICA8L29ucy1idXR0b24+XG4gKiAgICAgPC9wPlxuICogICA8L29ucy1wYWdlPlxuICogPC9vbnMtbmF2aWdhdG9yPlxuICpcbiAqIDx0ZW1wbGF0ZSBpZD1cInBhZ2UuaHRtbFwiPlxuICogICA8b25zLXBhZ2U+XG4gKiAgICAgPG9ucy10b29sYmFyPlxuICogICAgICAgPGRpdiBjbGFzcz1cImxlZnRcIj5cbiAqICAgICAgICAgPG9ucy1iYWNrLWJ1dHRvbj5CYWNrPC9vbnMtYmFjay1idXR0b24+XG4gKiAgICAgICA8L2Rpdj5cbiAqICAgICAgIDxkaXYgY2xhc3M9XCJjZW50ZXJcIj5cbiAqICAgICAgICAgQW5vdGhlciBwYWdlXG4gKiAgICAgICA8L2Rpdj5cbiAqICAgICA8L29ucy10b29sYmFyPlxuICogICA8L29ucy1wYWdlPlxuICogPC90ZW1wbGF0ZT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTmF2aWdhdG9yRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBwYWdlXG4gICAqIEBpbml0b25seVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyc3QgcGFnZSB0byBzaG93IHdoZW4gbmF2aWdhdG9yIGlzIGluaXRpYWxpemVkLlsvZW5dXG4gICAqICAgW2phXeODiuODk+OCsuODvOOCv+ODvOOBjOWIneacn+WMluOBleOCjOOBn+aZguOBq+ihqOekuuOBmeOCi+ODmuODvOOCuOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHN3aXBlYWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUVuYWJsZSBpT1MgXCJzd2lwZSB0byBwb3BcIiBmZWF0dXJlLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHN3aXBlLXRhcmdldC13aWR0aFxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCAyMHB4XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgd2lkdGggb2Ygc3dpcGVhYmxlIGFyZWEgY2FsY3VsYXRlZCBmcm9tIHRoZSBlZGdlIChpbiBwaXhlbHMpLiBVc2UgdGhpcyB0byBlbmFibGUgc3dpcGUgb25seSB3aGVuIHRoZSBmaW5nZXIgdG91Y2ggb24gdGhlIHNjcmVlbiBlZGdlLlsvZW5dXG4gICAqICAgW2phXeOCueODr+OCpOODl+OBruWIpOWumumgmOWfn+OCkuODlOOCr+OCu+ODq+WNmOS9jeOBp+aMh+WumuOBl+OBvuOBmeOAgueUu+mdouOBruerr+OBi+OCieaMh+WumuOBl+OBn+i3nembouOBq+mBlOOBmeOCi+OBqOODmuODvOOCuOOBjOihqOekuuOBleOCjOOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHN3aXBlLXRocmVzaG9sZFxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVmYXVsdCAwLjJcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSBob3cgbXVjaCB0aGUgcGFnZSBuZWVkcyB0byBiZSBzd2lwZWQgYmVmb3JlIHBvcHBpbmcuIEEgdmFsdWUgYmV0d2VlbiBgMGAgYW5kIGAxYC5bL2VuXVxuICAgKiAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCBkZWZhdWx0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1cbiAgICogICAgIEFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYFwic2xpZGVcImAsIGBcImxpZnRcImAsIGBcImZhZGVcImAgYW5kIGBcIm5vbmVcImAuXG4gICAqXG4gICAqICAgICBUaGVzZSBhcmUgcGxhdGZvcm0gYmFzZWQgYW5pbWF0aW9ucy4gRm9yIGZpeGVkIGFuaW1hdGlvbnMsIGFkZCBgXCItaW9zXCJgIG9yIGBcIi1tZFwiYCBzdWZmaXggdG8gdGhlIGFuaW1hdGlvbiBuYW1lLiBFLmcuIGBcImxpZnQtaW9zXCJgLCBgXCJsaWZ0LW1kXCJgLiBEZWZhdWx0cyB2YWx1ZXMgYXJlIGBcInNsaWRlLWlvc1wiYCBhbmQgYFwiZmFkZS1tZFwiYCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvbi1vcHRpb25zXG4gICAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgdGltaW5nIGFuZCBkZWxheSB3aXRoIGFuIG9iamVjdCBsaXRlcmFsLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWBbL2VuXVxuICAgKiAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CCZS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBhbmltYXRpb25PcHRpb25zXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YFsvZW5dXG4gICAqICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgIJlLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHByZXB1c2hcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYmVmb3JlIGEgcGFnZSBpcyBwdXNoZWQuWy9lbl1cbiAgICogICBbamFdcGFnZeOBjHB1c2jjgZXjgozjgovnm7TliY3jgavnmbrngavjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQubmF2aWdhdG9yXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmN1cnJlbnRQYWdlXG4gICAqICAgW2VuXUN1cnJlbnQgcGFnZSBvYmplY3QuWy9lbl1cbiAgICogICBbamFd54++5Zyo44GucGFnZeOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNhbmNlbFxuICAgKiAgIFtlbl1DYWxsIHRoaXMgZnVuY3Rpb24gdG8gY2FuY2VsIHRoZSBwdXNoLlsvZW5dXG4gICAqICAgW2phXeOBk+OBrumWouaVsOOCkuWRvOOBs+WHuuOBmeOBqOOAgXB1c2jlh6bnkIbjgYzjgq3jg6Pjg7Pjgrvjg6vjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHByZXBvcFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBiZWZvcmUgYSBwYWdlIGlzIHBvcHBlZC5bL2VuXVxuICAgKiAgIFtqYV1wYWdl44GMcG9w44GV44KM44KL55u05YmN44Gr55m654Gr44GV44KM44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50Lm5hdmlnYXRvclxuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5jdXJyZW50UGFnZVxuICAgKiAgIFtlbl1DdXJyZW50IHBhZ2Ugb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBrnBhZ2Xjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jYW5jZWxcbiAgICogICBbZW5dQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGNhbmNlbCB0aGUgcG9wLlsvZW5dXG4gICAqICAgW2phXeOBk+OBrumWouaVsOOCkuWRvOOBs+WHuuOBmeOBqOOAgXBhZ2Xjga5wb3DjgYzjgq3jg6Pjg7Pjgrvjg6vjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3RwdXNoXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGFmdGVyIGEgcGFnZSBpcyBwdXNoZWQuWy9lbl1cbiAgICogICBbamFdcGFnZeOBjHB1c2jjgZXjgozjgabjgqLjg4vjg6Hjg7zjgrfjg6fjg7PjgYzntYLkuobjgZfjgabjgYvjgonnmbrngavjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQubmF2aWdhdG9yXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmVudGVyUGFnZVxuICAgKiAgIFtlbl1PYmplY3Qgb2YgdGhlIG5leHQgcGFnZS5bL2VuXVxuICAgKiAgIFtqYV1wdXNo44GV44KM44GfcGFnZeOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5sZWF2ZVBhZ2VcbiAgICogICBbZW5dT2JqZWN0IG9mIHRoZSBwcmV2aW91cyBwYWdlLlsvZW5dXG4gICAqICAgW2phXeS7peWJjeOBrnBhZ2Xjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3Rwb3BcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgYSBwYWdlIGlzIHBvcHBlZC5bL2VuXVxuICAgKiAgIFtqYV1wYWdl44GMcG9w44GV44KM44Gm44Ki44OL44Oh44O844K344On44Oz44GM57WC44KP44Gj44Gf5b6M44Gr55m654Gr44GV44KM44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50Lm5hdmlnYXRvclxuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5lbnRlclBhZ2VcbiAgICogICBbZW5dT2JqZWN0IG9mIHRoZSBuZXh0IHBhZ2UuWy9lbl1cbiAgICogICBbamFdcG9w44GV44KM44Gm6KGo56S644GV44KM44KL44Oa44O844K444Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LmxlYXZlUGFnZVxuICAgKiAgIFtlbl1PYmplY3Qgb2YgdGhlIHByZXZpb3VzIHBhZ2UuWy9lbl1cbiAgICogICBbamFdcG9w44GV44KM44Gm5raI44GI44KL44Oa44O844K444Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnN3aXBlVG9Qb3BcbiAgICogICBbZW5dVHJ1ZSBpZiB0aGUgcG9wIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIgc3dpcGluZyB0byBwb3AuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50Lm9uc0JhY2tCdXR0b25cbiAgICogICBbZW5dVHJ1ZSBpZiB0aGUgcG9wIHdhcyBjYXVzZWQgYnkgcHJlc3NpbmcgYW4gb25zLWJhY2stYnV0dG9uLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgc3dpcGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHdoZW5ldmVyIHRoZSB1c2VyIHNsaWRlcyB0aGUgbmF2aWdhdG9yIChzd2lwZS10by1wb3ApLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5yYXRpb1xuICAgKiAgIFtlbl1EZWNpbWFsIHJhdGlvICgwLTEpLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5hbmltYXRpb25PcHRpb25zXG4gICAqICAgW2VuXVsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIGdldCBhbmltYXRvckZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FuaW1hdG9yRmFjdG9yeTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHRoaXMuX3BhZ2VMb2FkZXIgPSBkZWZhdWx0UGFnZUxvYWRlcjtcbiAgICB0aGlzLl9wYWdlTWFwID0gbmV3IFdlYWtNYXAoKTtcblxuICAgIHRoaXMuX3VwZGF0ZUFuaW1hdG9yRmFjdG9yeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBwYWdlTG9hZGVyXG4gICAqIEB0eXBlIHtQYWdlTG9hZGVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUGFnZUxvYWRlciBpbnN0YW5jZS4gSXQgY2FuIGJlIG92ZXJyaWRlbiB0byBjaGFuZ2UgdGhlIHdheSBwYWdlcyBhcmUgbG9hZGVkIGJ5IHRoaXMgZWxlbWVudC4gVXNlZnVsIGZvciBsaWIgZGV2ZWxvcGVycy5bL2VuXVxuICAgKiAgIFtqYV1QYWdlTG9hZGVy44Kk44Oz44K544K/44Oz44K544KS5qC857SN44GX44Gm44GE44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGdldCBwYWdlTG9hZGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlTG9hZGVyO1xuICB9XG5cbiAgc2V0IHBhZ2VMb2FkZXIocGFnZUxvYWRlcikge1xuICAgIGlmICghKHBhZ2VMb2FkZXIgaW5zdGFuY2VvZiBQYWdlTG9hZGVyKSkge1xuICAgICAgdXRpbC50aHJvd1BhZ2VMb2FkZXIoKTtcbiAgICB9XG4gICAgdGhpcy5fcGFnZUxvYWRlciA9IHBhZ2VMb2FkZXI7XG4gIH1cblxuICBfZ2V0UGFnZVRhcmdldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZSB8fCB0aGlzLmdldEF0dHJpYnV0ZSgncGFnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBwYWdlXG4gICAqIEB0eXBlIHsqfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgcGFnZSB0byBiZSBsb2FkZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBUaGlzIHZhbHVlIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgYHBhZ2VgIGF0dHJpYnV0ZS4gVXNlZnVsIGZvciBsaWIgZGV2ZWxvcGVycy5bL2VuXVxuICAgKiAgIFtqYV3liJ3mnJ/ljJbmmYLjgavoqq3jgb/ovrzjgoDjg5rjg7zjgrjjgpLmjIflrprjgZfjgb7jgZnjgIJgcGFnZWDlsZ7mgKfjgafmjIflrprjgZfjgZ/lgKTjgojjgorjgoJgcGFnZWDjg5fjg63jg5Hjg4bjgqPjgavmjIflrprjgZfjgZ/lgKTjgpLlhKrlhYjjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgZ2V0IHBhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2U7XG4gIH1cblxuICBzZXQgcGFnZShwYWdlKSB7XG4gICAgdGhpcy5fcGFnZSA9IHBhZ2U7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLm9uRGV2aWNlQmFja0J1dHRvbiA9IHRoaXMuX29uRGV2aWNlQmFja0J1dHRvbi5iaW5kKHRoaXMpO1xuXG4gICAgaWYgKCFwbGF0Zm9ybS5pc0FuZHJvaWQoKSB8fCB0aGlzLmdldEF0dHJpYnV0ZSgnc3dpcGVhYmxlJykgPT09ICdmb3JjZScpIHtcbiAgICAgIGxldCBzd2lwZUFuaW1hdG9yO1xuXG4gICAgICB0aGlzLl9zd2lwZSA9IG5ldyBTd2lwZVJldmVhbCh7XG4gICAgICAgIGVsZW1lbnQ6IHRoaXMsXG4gICAgICAgIGdldFRocmVzaG9sZDogKCkgPT4gTWF0aC5tYXgoMC4yLCBwYXJzZUZsb2F0KHRoaXMuZ2V0QXR0cmlidXRlKCdzd2lwZS10aHJlc2hvbGQnKSkgfHwgMCksXG5cbiAgICAgICAgc3dpcGVNYXg6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCByYXRpbyA9IDE7XG4gICAgICAgICAgY29uc3QgYW5pbWF0aW9uT3B0aW9ucyA9IHsgZHVyYXRpb246IHN3aXBlQW5pbWF0b3IuZHVyYXRpb25Td2lwZSwgdGltaW5nOiBzd2lwZUFuaW1hdG9yLnRpbWluZ1N3aXBlIH07XG4gICAgICAgICAgdGhpcy5fb25Td2lwZSAmJiB0aGlzLl9vblN3aXBlKHJhdGlvLCBhbmltYXRpb25PcHRpb25zKTtcbiAgICAgICAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3N3aXBlJywgeyByYXRpbywgYW5pbWF0aW9uT3B0aW9ucyB9KTtcbiAgICAgICAgICB0aGlzW3RoaXMuc3dpcGVNYXggPyAnc3dpcGVNYXgnIDogJ3BvcFBhZ2UnXSh7IGFuaW1hdG9yOiBzd2lwZUFuaW1hdG9yLCBzd2lwZVRvUG9wOiB0cnVlIH0pO1xuICAgICAgICAgIHN3aXBlQW5pbWF0b3IgPSBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBzd2lwZU1pZDogKGRpc3RhbmNlLCB3aWR0aCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJhdGlvID0gZGlzdGFuY2UgLyB3aWR0aDtcbiAgICAgICAgICB0aGlzLl9vblN3aXBlICYmIHRoaXMuX29uU3dpcGUocmF0aW8pO1xuICAgICAgICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAnc3dpcGUnLCB7IHJhdGlvIH0pO1xuICAgICAgICAgIHN3aXBlQW5pbWF0b3IudHJhbnNsYXRlKGRpc3RhbmNlLCB3aWR0aCwgdGhpcy50b3BQYWdlLnByZXZpb3VzRWxlbWVudFNpYmxpbmcsIHRoaXMudG9wUGFnZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHN3aXBlTWluOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmF0aW8gPSAwO1xuICAgICAgICAgIGNvbnN0IGFuaW1hdGlvbk9wdGlvbnMgPSB7IGR1cmF0aW9uOiBzd2lwZUFuaW1hdG9yLmR1cmF0aW9uUmVzdG9yZSwgdGltaW5nOiBzd2lwZUFuaW1hdG9yLnRpbWluZ1N3aXBlIH07XG4gICAgICAgICAgdGhpcy5fb25Td2lwZSAmJiB0aGlzLl9vblN3aXBlKHJhdGlvLCBhbmltYXRpb25PcHRpb25zKTtcbiAgICAgICAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3N3aXBlJywgeyByYXRpbywgYW5pbWF0aW9uT3B0aW9ucyB9KTtcbiAgICAgICAgICBzd2lwZUFuaW1hdG9yLnJlc3RvcmUodGhpcy50b3BQYWdlLnByZXZpb3VzRWxlbWVudFNpYmxpbmcsIHRoaXMudG9wUGFnZSk7XG4gICAgICAgICAgc3dpcGVBbmltYXRvciA9IG51bGw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaWdub3JlU3dpcGU6IChldmVudCwgZGlzdGFuY2UpID0+IHtcbiAgICAgICAgICAvLyBCYXNpYyBjb25kaXRpb25zXG4gICAgICAgICAgaWYgKCF0aGlzLl9pc1J1bm5pbmcgJiYgdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAxKSB7XG5cbiAgICAgICAgICAgIC8vIEFyZWEgb3IgZGlyZWN0aW9uYWwgaXNzdWVzXG4gICAgICAgICAgICBjb25zdCBhcmVhID0gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ3N3aXBlLXRhcmdldC13aWR0aCcpIHx8IDI1LCAxMCk7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZ2VzdHVyZS5kaXJlY3Rpb24gPT09ICAncmlnaHQnICYmIGFyZWEgPiBkaXN0YW5jZSkge1xuXG4gICAgICAgICAgICAgIC8vIFN3aXBlcyBvbiBvbnMtYmFjay1idXR0b24gYW5kIGl0cyBjaGlsZHJlblxuICAgICAgICAgICAgICBjb25zdCBpc0JCID0gZWwgPT4gL29ucy1iYWNrLWJ1dHRvbi9pLnRlc3QoZWwudGFnTmFtZSk7XG4gICAgICAgICAgICAgIGlmICghaXNCQihldmVudC50YXJnZXQpICYmICF1dGlsLmZpbmRQYXJlbnQoZXZlbnQudGFyZ2V0LCBpc0JCLCBwID0+IC9vbnMtcGFnZS9pLnRlc3QocC50YWdOYW1lKSkpIHtcblxuICAgICAgICAgICAgICAgIC8vIEFuaW1hdG9yIGlzIHN3aXBlYWJsZVxuICAgICAgICAgICAgICAgIGNvbnN0IGFuaW1hdGlvbiA9ICh0aGlzLnRvcFBhZ2UucHVzaGVkT3B0aW9ucyB8fCB7fSkuYW5pbWF0aW9uIHx8IHRoaXMuYW5pbWF0b3JGYWN0b3J5Ll9hbmltYXRpb247XG4gICAgICAgICAgICAgICAgY29uc3QgQW5pbWF0b3IgPSBfYW5pbWF0b3JEaWN0W2FuaW1hdGlvbl0gaW5zdGFuY2VvZiBGdW5jdGlvblxuICAgICAgICAgICAgICAgICAgPyBfYW5pbWF0b3JEaWN0W2FuaW1hdGlvbl0uY2FsbCgpXG4gICAgICAgICAgICAgICAgICA6IF9hbmltYXRvckRpY3RbYW5pbWF0aW9uXTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgQW5pbWF0b3IgIT09ICd1bmRlZmluZWQnICYmIEFuaW1hdG9yLnN3aXBlYWJsZSkge1xuICAgICAgICAgICAgICAgICAgc3dpcGVBbmltYXRvciA9IG5ldyBBbmltYXRvcigpOyAvLyBQcmVwYXJlIGZvciB0aGUgc3dpcGVcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gSWdub3JlIHN3aXBlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaygnc3dpcGVhYmxlJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgZGVmZXJyZWQgPSB1dGlsLmRlZmVyKCk7XG4gICAgdGhpcy5sb2FkZWQgPSBkZWZlcnJlZC5wcm9taXNlO1xuXG4gICAgcmV3cml0YWJsZXMucmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgY29uc3Qgc2hvdyA9ICF1dGlsLmhhc0FueUNvbXBvbmVudEFzUGFyZW50KHRoaXMpO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHsgYW5pbWF0aW9uOiAnbm9uZScsIHNob3cgfTtcblxuICAgICAgaWYgKHRoaXMucGFnZXMubGVuZ3RoID09PSAwICYmIHRoaXMuX2dldFBhZ2VUYXJnZXQoKSkge1xuICAgICAgICB0aGlzLnB1c2hQYWdlKHRoaXMuX2dldFBhZ2VUYXJnZXQoKSwgb3B0aW9ucykudGhlbigoKSA9PiBkZWZlcnJlZC5yZXNvbHZlKCkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmVyaWZ5UGFnZUVsZW1lbnQodGhpcy5wYWdlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50b3BQYWdlKSB7XG4gICAgICAgICAgY29udGVudFJlYWR5KHRoaXMudG9wUGFnZSwgKCkgPT5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgIHNob3cgJiYgdGhpcy50b3BQYWdlLl9zaG93KCk7XG4gICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUxhc3RQYWdlQmFja0J1dHRvbigpO1xuICAgICAgICAgICAgfSwgMClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnBhZ2VzLmxlbmd0aCA9PT0gMCAmJiB0aGlzLl9nZXRQYWdlVGFyZ2V0KCkpIHtcbiAgICAgICAgICAgIHRoaXMucHVzaFBhZ2UodGhpcy5fZ2V0UGFnZVRhcmdldCgpLCBvcHRpb25zKS50aGVuKCgpID0+IGRlZmVycmVkLnJlc29sdmUoKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX3VwZGF0ZUFuaW1hdG9yRmFjdG9yeSgpIHtcbiAgICB0aGlzLl9hbmltYXRvckZhY3RvcnkgPSBuZXcgQW5pbWF0b3JGYWN0b3J5KHtcbiAgICAgIGFuaW1hdG9yczogX2FuaW1hdG9yRGljdCxcbiAgICAgIGJhc2VDbGFzczogTmF2aWdhdG9yQW5pbWF0b3IsXG4gICAgICBiYXNlQ2xhc3NOYW1lOiAnTmF2aWdhdG9yQW5pbWF0b3InLFxuICAgICAgZGVmYXVsdEFuaW1hdGlvbjogdGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbicpXG4gICAgfSk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9iYWNrQnV0dG9uSGFuZGxlci5kZXN0cm95KCk7XG4gICAgdGhpcy5fYmFja0J1dHRvbkhhbmRsZXIgPSBudWxsO1xuXG4gICAgdGhpcy5fc3dpcGUgJiYgdGhpcy5fc3dpcGUuZGlzcG9zZSgpO1xuICAgIHRoaXMuX3N3aXBlID0gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ2FuaW1hdGlvbicsICdzd2lwZWFibGUnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdhbmltYXRpb24nOlxuICAgICAgICB0aGlzLl91cGRhdGVBbmltYXRvckZhY3RvcnkoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzd2lwZWFibGUnOlxuICAgICAgICB0aGlzLl9zd2lwZSAmJiB0aGlzLl9zd2lwZS51cGRhdGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgcG9wUGFnZVxuICAgKiBAc2lnbmF0dXJlIHBvcFBhZ2UoW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dXG4gICAqICAgICBBbmltYXRpb24gbmFtZS4gQXZhaWxhYmxlIGFuaW1hdGlvbnMgYXJlIGBcInNsaWRlXCJgLCBgXCJsaWZ0XCJgLCBgXCJmYWRlXCJgIGFuZCBgXCJub25lXCJgLlxuICAgKlxuICAgKiAgICAgVGhlc2UgYXJlIHBsYXRmb3JtIGJhc2VkIGFuaW1hdGlvbnMuIEZvciBmaXhlZCBhbmltYXRpb25zLCBhZGQgYFwiLWlvc1wiYCBvciBgXCItbWRcImAgc3VmZml4IHRvIHRoZSBhbmltYXRpb24gbmFtZS4gRS5nLiBgXCJsaWZ0LWlvc1wiYCwgYFwibGlmdC1tZFwiYC4gRGVmYXVsdHMgdmFsdWVzIGFyZSBgXCJzbGlkZS1pb3NcImAgYW5kIGBcImZhZGUtbWRcImAuXG4gICAqICAgWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1GdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSB0cmFuc2l0aW9uIGhhcyBlbmRlZC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7jg6Hjgr3jg4Pjg4njgavjgojjgovnlLvpnaLpgbfnp7vjgYzntYLkuobjgZfjgZ/pmpvjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuZGF0YV1cbiAgICogICBbZW5dQ3VzdG9tIGRhdGEgdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgbmV3IHBhZ2UgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudGltZXNdXG4gICAqICAgW2VuXU51bWJlciBvZiBwYWdlcyB0byBiZSBwb3BwZWQuIE9ubHkgb25lIGFuaW1hdGlvbiB3aWxsIGJlIHNob3duLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gdGhlIHJldmVhbGVkIHBhZ2UuWy9lbl1cbiAgICogICBbamFd5piO44KJ44GL44Gr44GX44Gf44Oa44O844K444KS6Kej5rG644GZ44KLUHJvbWlzZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Qb3BzIHRoZSBjdXJyZW50IHBhZ2UgZnJvbSB0aGUgcGFnZSBzdGFjay4gVGhlIHByZXZpb3VzIHBhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQuWy9lbl1cbiAgICogICBbamFd54++5Zyo6KGo56S65Lit44Gu44Oa44O844K444KS44Oa44O844K444K544K/44OD44Kv44GL44KJ5Y+W44KK6Zmk44GN44G+44GZ44CC5LiA44Gk5YmN44Gu44Oa44O844K444Gr5oi744KK44G+44GZ44CCWy9qYV1cbiAgICovXG4gIHBvcFBhZ2Uob3B0aW9ucyA9IHt9KSB7XG4gICAgKHtvcHRpb25zfSA9IHRoaXMuX3ByZXBhcmVQYWdlQW5kT3B0aW9ucyhudWxsLCBvcHRpb25zKSk7XG5cbiAgICBpZiAodXRpbC5pc0ludGVnZXIob3B0aW9ucy50aW1lcykgJiYgb3B0aW9ucy50aW1lcyA+IDEpIHtcbiAgICAgIHRoaXMuX3JlbW92ZVBhZ2VzKG9wdGlvbnMudGltZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcFVwZGF0ZSA9ICgpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLl9wYWdlTG9hZGVyLnVubG9hZCh0aGlzLnBhZ2VzW3RoaXMucGFnZXMubGVuZ3RoIC0gMV0pO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX3BvcFBhZ2Uob3B0aW9ucywgcG9wVXBkYXRlKTtcbiAgfVxuXG4gIF9wb3BQYWdlKG9wdGlvbnMsIHVwZGF0ZSA9ICgpID0+IFByb21pc2UucmVzb2x2ZSgpKSB7XG4gICAgaWYgKHRoaXMuX2lzUnVubmluZykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdwb3BQYWdlIGlzIGFscmVhZHkgcnVubmluZy4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wYWdlcy5sZW5ndGggPD0gMSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdvbnMtbmF2aWdhdG9yXFwncyBwYWdlIHN0YWNrIGlzIGVtcHR5LicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9lbWl0UHJlUG9wRXZlbnQoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdDYW5jZWxlZCBpbiBwcmVwb3AgZXZlbnQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5wYWdlcy5sZW5ndGg7XG5cbiAgICB0aGlzLl9pc1J1bm5pbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5wYWdlc1tsZW5ndGggLSAyXS51cGRhdGVCYWNrQnV0dG9uKChsZW5ndGggLSAyKSA+IDApO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgY29uc3QgbGVhdmVQYWdlID0gdGhpcy5wYWdlc1tsZW5ndGggLSAxXTtcbiAgICAgIGNvbnN0IGVudGVyUGFnZSA9IHRoaXMucGFnZXNbbGVuZ3RoIC0gMl07XG5cbiAgICAgIG9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zIHx8IHt9LCBvcHRpb25zKTtcblxuICAgICAgaWYgKG9wdGlvbnMuZGF0YSkge1xuICAgICAgICBlbnRlclBhZ2UuZGF0YSA9IHV0aWwuZXh0ZW5kKHt9LCBlbnRlclBhZ2UuZGF0YSB8fCB7fSwgb3B0aW9ucy5kYXRhIHx8IHt9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZG9uZSA9ICgpID0+IHtcbiAgICAgICAgdXBkYXRlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICBlbnRlclBhZ2UuX3Nob3coKTtcbiAgICAgICAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3Bvc3Rwb3AnLCB7XG4gICAgICAgICAgICBsZWF2ZVBhZ2UsXG4gICAgICAgICAgICBlbnRlclBhZ2UsXG4gICAgICAgICAgICBuYXZpZ2F0b3I6IHRoaXMsXG4gICAgICAgICAgICBzd2lwZVRvUG9wOiAhIW9wdGlvbnMuc3dpcGVUb1BvcCwgICAgICAgIC8vIHdoZXRoZXIgdGhlIHBvcCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyIHN3aXBpbmdcbiAgICAgICAgICAgIG9uc0JhY2tCdXR0b246ICEhb3B0aW9ucy5vbnNCYWNrQnV0dG9uICAgLy8gd2hldGhlciB0aGUgcG9wIHdhcyB0cmlnZ2VyZWQgYnkgY2xpY2tpbmcgb25zLWJhY2stYnV0dG9uXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrICYmIG9wdGlvbnMuY2FsbGJhY2soZW50ZXJQYWdlKTtcblxuICAgICAgICAgIHJlc29sdmUoZW50ZXJQYWdlKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBsZWF2ZVBhZ2UuX2hpZGUoKTtcbiAgICAgIGVudGVyUGFnZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG5cbiAgICAgIGNvbnN0IGFuaW1hdG9yID0gb3B0aW9ucy5hbmltYXRvciB8fCB0aGlzLl9hbmltYXRvckZhY3RvcnkubmV3QW5pbWF0b3Iob3B0aW9ucyk7XG4gICAgICBhbmltYXRvci5wb3AodGhpcy5wYWdlc1tsZW5ndGggLSAyXSwgdGhpcy5wYWdlc1tsZW5ndGggLSAxXSwgZG9uZSk7XG4gICAgfSkuY2F0Y2goKCkgPT4gdGhpcy5faXNSdW5uaW5nID0gZmFsc2UpO1xuICB9XG5cblxuICAvKipcbiAgICogQG1ldGhvZCBwdXNoUGFnZVxuICAgKiBAc2lnbmF0dXJlIHB1c2hQYWdlKHBhZ2UsIFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhZ2VcbiAgICogICBbZW5dUGFnZSBVUkwuIENhbiBiZSBlaXRoZXIgYSBIVE1MIGRvY3VtZW50IG9yIGEgdGVtcGxhdGUgZGVmaW5lZCB3aXRoIHRoZSBgPHRlbXBsYXRlPmAgdGFnLlsvZW5dXG4gICAqICAgW2phXXBhZ2Xjga5VUkzjgYvjgIHjgoLjgZfjgY/jga9gPHRlbXBsYXRlPmDjgaflrqPoqIDjgZfjgZ/jg4bjg7Pjg5fjg6zjg7zjg4jjga5pZOWxnuaAp+OBruWApOOCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucGFnZV1cbiAgICogICBbZW5dUGFnZSBVUkwuIE9ubHkgbmVjZXNzYXJ5IGlmIGBwYWdlYCBwYXJhbWV0ZXIgaXMgbnVsbCBvciB1bmRlZmluZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnBhZ2VIVE1MXVxuICAgKiAgIFtlbl1IVE1MIGNvZGUgdGhhdCB3aWxsIGJlIGNvbXB1dGVkIGFzIGEgbmV3IHBhZ2UuIE92ZXJ3cml0ZXMgYHBhZ2VgIHBhcmFtZXRlci5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1cbiAgICogICAgIEFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYFwic2xpZGVcImAsIGBcImxpZnRcImAsIGBcImZhZGVcImAgYW5kIGBcIm5vbmVcImAuXG4gICAqXG4gICAqICAgICBUaGVzZSBhcmUgcGxhdGZvcm0gYmFzZWQgYW5pbWF0aW9ucy4gRm9yIGZpeGVkIGFuaW1hdGlvbnMsIGFkZCBgXCItaW9zXCJgIG9yIGBcIi1tZFwiYCBzdWZmaXggdG8gdGhlIGFuaW1hdGlvbiBuYW1lLiBFLmcuIGBcImxpZnQtaW9zXCJgLCBgXCJsaWZ0LW1kXCJgLiBEZWZhdWx0cyB2YWx1ZXMgYXJlIGBcInNsaWRlLWlvc1wiYCBhbmQgYFwiZmFkZS1tZFwiYC5cbiAgICogICBbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIGRlbGF5LCB0aW1pbmfjgpLmjIflrprjgZfjgb7jgZnjgIJlLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YCBbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dRnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdHJhbnNpdGlvbiBoYXMgZW5kZWQuWy9lbl1cbiAgICogICBbamFdcHVzaFBhZ2UoKeOBq+OCiOOCi+eUu+mdoumBt+enu+OBjOe1guS6huOBl+OBn+aZguOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5kYXRhXVxuICAgKiAgIFtlbl1DdXN0b20gZGF0YSB0aGF0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBuZXcgcGFnZSBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gdGhlIHB1c2hlZCBwYWdlLlsvZW5dXG4gICAqICAgW2phXei/veWKoOOBl+OBn+ODmuODvOOCuOOCkuino+axuuOBmeOCi1Byb21pc2XjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUHVzaGVzIHRoZSBzcGVjaWZpZWQgcGFnZSBpbnRvIHRoZSBzdGFjay5bL2VuXVxuICAgKiAgIFtqYV3mjIflrprjgZfjgZ9wYWdl44KS5paw44GX44GE44Oa44O844K444K544K/44OD44Kv44Gr6L+95Yqg44GX44G+44GZ44CC5paw44GX44GE44Oa44O844K444GM6KGo56S644GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG4gIHB1c2hQYWdlKHBhZ2UsIG9wdGlvbnMgPSB7fSkge1xuICAgICh7cGFnZSwgb3B0aW9uc30gPSB0aGlzLl9wcmVwYXJlUGFnZUFuZE9wdGlvbnMocGFnZSwgb3B0aW9ucykpO1xuXG4gICAgY29uc3QgcHJlcGFyZSA9IHBhZ2VFbGVtZW50ID0+IHtcbiAgICAgIHZlcmlmeVBhZ2VFbGVtZW50KHBhZ2VFbGVtZW50KTtcbiAgICAgIHRoaXMuX3BhZ2VNYXAuc2V0KHBhZ2VFbGVtZW50LCBwYWdlKTtcbiAgICAgIHBhZ2VFbGVtZW50ID0gdXRpbC5leHRlbmQocGFnZUVsZW1lbnQsIHtcbiAgICAgICAgZGF0YTogb3B0aW9ucy5kYXRhXG4gICAgICB9KTtcbiAgICAgIHBhZ2VFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICB9O1xuXG4gICAgaWYgKG9wdGlvbnMucGFnZUhUTUwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wdXNoUGFnZShvcHRpb25zLCAoKSA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgaW5zdGFudFBhZ2VMb2FkZXIubG9hZCh7cGFnZTogb3B0aW9ucy5wYWdlSFRNTCwgcGFyZW50OiB0aGlzLCBwYXJhbXM6IG9wdGlvbnMuZGF0YX0sIHBhZ2VFbGVtZW50ID0+IHtcbiAgICAgICAgICBwcmVwYXJlKHBhZ2VFbGVtZW50KTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9wdXNoUGFnZShvcHRpb25zLCAoKSA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIHRoaXMuX3BhZ2VMb2FkZXIubG9hZCh7cGFnZSwgcGFyZW50OiB0aGlzLCBwYXJhbXM6IG9wdGlvbnMuZGF0YX0sIHBhZ2VFbGVtZW50ID0+IHtcbiAgICAgICAgcHJlcGFyZShwYWdlRWxlbWVudCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSk7XG4gICAgfSkpO1xuICB9XG5cbiAgX3B1c2hQYWdlKG9wdGlvbnMgPSB7fSwgdXBkYXRlID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpIHtcbiAgICBpZiAodGhpcy5faXNSdW5uaW5nKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ3B1c2hQYWdlIGlzIGFscmVhZHkgcnVubmluZy4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZW1pdFByZVB1c2hFdmVudCgpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ0NhbmNlbGVkIGluIHByZXB1c2ggZXZlbnQuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5faXNSdW5uaW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IGFuaW1hdGlvbk9wdGlvbnMgPSB0aGlzLmFuaW1hdGlvbk9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMgfHwge30sIHthbmltYXRpb25PcHRpb25zfSwgb3B0aW9ucyk7XG5cbiAgICBjb25zdCBhbmltYXRvciA9IHRoaXMuX2FuaW1hdG9yRmFjdG9yeS5uZXdBbmltYXRvcihvcHRpb25zKTtcblxuICAgIHJldHVybiB1cGRhdGUoKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IHBhZ2VMZW5ndGggPSB0aGlzLnBhZ2VzLmxlbmd0aDtcblxuICAgICAgY29uc3QgZW50ZXJQYWdlICA9IHRoaXMucGFnZXNbcGFnZUxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgbGVhdmVQYWdlID0gb3B0aW9ucy5sZWF2ZVBhZ2UgfHwgdGhpcy5wYWdlc1twYWdlTGVuZ3RoIC0gMl07XG5cbiAgICAgIHZlcmlmeVBhZ2VFbGVtZW50KGVudGVyUGFnZSk7XG5cbiAgICAgIGVudGVyUGFnZS51cGRhdGVCYWNrQnV0dG9uKHBhZ2VMZW5ndGggPiAob3B0aW9ucy5fcmVwbGFjZVBhZ2UgPyAyIDogMSkpO1xuXG4gICAgICBlbnRlclBhZ2UucHVzaGVkT3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHt9LCBlbnRlclBhZ2UucHVzaGVkT3B0aW9ucyB8fCB7fSwgb3B0aW9ucyB8fCB7fSk7XG4gICAgICBlbnRlclBhZ2UuZGF0YSA9IHV0aWwuZXh0ZW5kKHt9LCBlbnRlclBhZ2UuZGF0YSB8fCB7fSwgb3B0aW9ucy5kYXRhIHx8IHt9KTtcbiAgICAgIGVudGVyUGFnZS51bmxvYWQgPSBlbnRlclBhZ2UudW5sb2FkIHx8IG9wdGlvbnMudW5sb2FkO1xuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICBvcHRpb25zLnNob3cgIT09IGZhbHNlICYmIHNldEltbWVkaWF0ZSgoKSA9PiBlbnRlclBhZ2UuX3Nob3coKSk7XG4gICAgICAgICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdwb3N0cHVzaCcsIHtsZWF2ZVBhZ2UsIGVudGVyUGFnZSwgbmF2aWdhdG9yOiB0aGlzfSk7XG5cbiAgICAgICAgICBpZiAobGVhdmVQYWdlKSB7XG4gICAgICAgICAgICBsZWF2ZVBhZ2Uuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrICYmIG9wdGlvbnMuY2FsbGJhY2soZW50ZXJQYWdlKTtcblxuICAgICAgICAgIHJlc29sdmUoZW50ZXJQYWdlKTtcbiAgICAgICAgfTtcblxuICAgICAgICBlbnRlclBhZ2Uuc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xuICAgICAgICBpZiAobGVhdmVQYWdlKSB7XG4gICAgICAgICAgbGVhdmVQYWdlLl9oaWRlKCk7XG4gICAgICAgICAgYW5pbWF0b3IucHVzaChlbnRlclBhZ2UsIGxlYXZlUGFnZSwgZG9uZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCByZXBsYWNlUGFnZVxuICAgKiBAc2lnbmF0dXJlIHJlcGxhY2VQYWdlKHBhZ2UsIFtvcHRpb25zXSlcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUHJvbWlzZSB3aGljaCByZXNvbHZlcyB0byB0aGUgbmV3IHBhZ2UuWy9lbl1cbiAgICogICBbamFd5paw44GX44GE44Oa44O844K444KS6Kej5rG644GZ44KLUHJvbWlzZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXBsYWNlcyB0aGUgY3VycmVudCB0b3AgcGFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgb25lLiBFeHRlbmRzIGBwdXNoUGFnZSgpYCBwYXJhbWV0ZXJzLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOihqOekuuS4reOBruODmuODvOOCuOOCkuOCkuaMh+WumuOBl+OBn+ODmuODvOOCuOOBq+e9ruOBjeaPm+OBiOOBvuOBmeOAglsvamFdXG4gICAqL1xuICByZXBsYWNlUGFnZShwYWdlLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5wdXNoUGFnZShwYWdlLCBvcHRpb25zKVxuICAgICAgLnRoZW4ocmVzb2x2ZWRWYWx1ZSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB0aGlzLl9wYWdlTG9hZGVyLnVubG9hZCh0aGlzLnBhZ2VzW3RoaXMucGFnZXMubGVuZ3RoIC0gMl0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZUxhc3RQYWdlQmFja0J1dHRvbigpO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzb2x2ZWRWYWx1ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGluc2VydFBhZ2VcbiAgICogQHNpZ25hdHVyZSBpbnNlcnRQYWdlKGluZGV4LCBwYWdlLCBbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgKiAgIFtlbl1UaGUgaW5kZXggd2hlcmUgaXQgc2hvdWxkIGJlIGluc2VydGVkLlsvZW5dXG4gICAqICAgW2phXeOCueOCv+ODg+OCr+OBq+aMv+WFpeOBmeOCi+S9jee9ruOBruOCpOODs+ODh+ODg+OCr+OCueOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgdG8gdGhlIGluc2VydGVkIHBhZ2UuWy9lbl1cbiAgICogICBbamFd5oyH5a6a44GX44Gf44Oa44O844K444KS6Kej5rG644GZ44KLUHJvbWlzZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JbnNlcnQgdGhlIHNwZWNpZmllZCBwYWdlIGludG8gdGhlIHN0YWNrIHdpdGggYXQgYSBwb3NpdGlvbiBkZWZpbmVkIGJ5IHRoZSBgaW5kZXhgIGFyZ3VtZW50LiBFeHRlbmRzIGBwdXNoUGFnZSgpYCBwYXJhbWV0ZXJzLlsvZW5dXG4gICAqICAgW2phXeaMh+WumuOBl+OBn3BhZ2XjgpLjg5rjg7zjgrjjgrnjgr/jg4Pjgq/jga5pbmRleOOBp+aMh+WumuOBl+OBn+S9jee9ruOBq+i/veWKoOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBpbnNlcnRQYWdlKGluZGV4LCBwYWdlLCBvcHRpb25zID0ge30pIHtcbiAgICAoe3BhZ2UsIG9wdGlvbnN9ID0gdGhpcy5fcHJlcGFyZVBhZ2VBbmRPcHRpb25zKHBhZ2UsIG9wdGlvbnMpKTtcbiAgICBpbmRleCA9IHRoaXMuX25vcm1hbGl6ZUluZGV4KGluZGV4KTtcblxuICAgIGlmIChpbmRleCA+PSB0aGlzLnBhZ2VzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRoaXMucHVzaFBhZ2UocGFnZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcGFnZSA9IHR5cGVvZiBvcHRpb25zLnBhZ2VIVE1MID09PSAnc3RyaW5nJyA/IG9wdGlvbnMucGFnZUhUTUwgOiBwYWdlO1xuICAgIGNvbnN0IGxvYWRlciA9IHR5cGVvZiBvcHRpb25zLnBhZ2VIVE1MID09PSAnc3RyaW5nJyA/IGluc3RhbnRQYWdlTG9hZGVyIDogdGhpcy5fcGFnZUxvYWRlcjtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGxvYWRlci5sb2FkKHtwYWdlLCBwYXJlbnQ6IHRoaXN9LCBwYWdlRWxlbWVudCA9PiB7XG4gICAgICAgIHZlcmlmeVBhZ2VFbGVtZW50KHBhZ2VFbGVtZW50KTtcbiAgICAgICAgdGhpcy5fcGFnZU1hcC5zZXQocGFnZUVsZW1lbnQsIHBhZ2UpO1xuICAgICAgICBwYWdlRWxlbWVudCA9IHV0aWwuZXh0ZW5kKHBhZ2VFbGVtZW50LCB7XG4gICAgICAgICAgZGF0YTogb3B0aW9ucy5kYXRhLFxuICAgICAgICAgIHB1c2hlZE9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgb3B0aW9ucy5hbmltYXRpb25PcHRpb25zID0gdXRpbC5leHRlbmQoXG4gICAgICAgICAge30sXG4gICAgICAgICAgdGhpcy5hbmltYXRpb25PcHRpb25zLFxuICAgICAgICAgIG9wdGlvbnMuYW5pbWF0aW9uT3B0aW9ucyB8fCB7fVxuICAgICAgICApO1xuXG4gICAgICAgIHBhZ2VFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKHBhZ2VFbGVtZW50LCB0aGlzLnBhZ2VzW2luZGV4XSk7XG4gICAgICAgIHRoaXMudG9wUGFnZS51cGRhdGVCYWNrQnV0dG9uKHRydWUpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHBhZ2VFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICByZXNvbHZlKHRoaXMucGFnZXNbaW5kZXhdKTtcbiAgICAgICAgfSwgMTAwMCAvIDYwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgcmVtb3ZlUGFnZVxuICAgKiBAc2lnbmF0dXJlIHJlbW92ZVBhZ2UoaW5kZXgsIFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAqICAgW2VuXVRoZSBpbmRleCB3aGVyZSBpdCBzaG91bGQgYmUgcmVtb3ZlZC5bL2VuXVxuICAgKiAgIFtqYV3jgrnjgr/jg4Pjgq/jgYvjgonliYrpmaTjgZnjgovjg5rjg7zjgrjjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1Qcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSByZXZlYWxlZCBwYWdlLlsvZW5dXG4gICAqICAgW2phXeWJiumZpOOBq+OCiOOBo+OBpuihqOekuuOBleOCjOOBn+ODmuODvOOCuOOCkuino+axuuOBmeOCi1Byb21pc2XjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmVtb3ZlIHRoZSBzcGVjaWZpZWQgcGFnZSBhdCBhIHBvc2l0aW9uIGluIHRoZSBzdGFjayBkZWZpbmVkIGJ5IHRoZSBgaW5kZXhgIGFyZ3VtZW50LiBFeHRlbmRzIGBwb3BQYWdlKClgIHBhcmFtZXRlcnMuWy9lbl1cbiAgICogICBbamFd5oyH5a6a44GX44Gf44Kk44Oz44OH44OD44Kv44K544Gr44GC44KL44Oa44O844K444KS5YmK6Zmk44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIHJlbW92ZVBhZ2UoaW5kZXgsIG9wdGlvbnMgPSB7fSkge1xuICAgIGluZGV4ID0gdGhpcy5fbm9ybWFsaXplSW5kZXgoaW5kZXgpO1xuXG4gICAgaWYgKGluZGV4IDwgdGhpcy5wYWdlcy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgIGNvbnN0IGxlYXZlUGFnZSA9IHRoaXMucGFnZXNbaW5kZXhdO1xuICAgICAgICBjb25zdCBlbnRlclBhZ2UgPSB0aGlzLnRvcFBhZ2U7XG5cbiAgICAgICAgdGhpcy5fcGFnZU1hcC5kZWxldGUobGVhdmVQYWdlKTtcbiAgICAgICAgdGhpcy5fcGFnZUxvYWRlci51bmxvYWQobGVhdmVQYWdlKTtcbiAgICAgICAgaWYgKHRoaXMucGFnZXMubGVuZ3RoID09PSAxKSB7IC8vIGVkZ2UgY2FzZVxuICAgICAgICAgIHRoaXMudG9wUGFnZS51cGRhdGVCYWNrQnV0dG9uKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmUoZW50ZXJQYWdlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3BQYWdlKG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHJlc2V0VG9QYWdlXG4gICAqIEBzaWduYXR1cmUgcmVzZXRUb1BhZ2UocGFnZSwgW29wdGlvbnNdKVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1Qcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSBuZXcgdG9wIHBhZ2UuWy9lbl1cbiAgICogICBbamFd5paw44GX44GE44OI44OD44OX44Oa44O844K444KS6Kej5rG644GZ44KLUHJvbWlzZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucG9wXVxuICAgKiAgIFtlbl1QZXJmb3JtcyAncG9wJyBlZmZlY3QgaWYgYHRydWVgIGluc3RlYWQgb2YgJ3B1c2gnIG9yIG5vbmUuIFRoaXMgYWxzbyBzZXRzIGBvcHRpb25zLmFuaW1hdGlvbmAgdmFsdWUgdG8gYGRlZmF1bHRgIGluc3RlYWQgb2YgYG5vbmVgLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DbGVhcnMgcGFnZSBzdGFjayBhbmQgYWRkcyB0aGUgc3BlY2lmaWVkIHBhZ2UgdG8gdGhlIHN0YWNrLiBFeHRlbmRzIGBwdXNoUGFnZSgpYCBwYXJhbWV0ZXJzLlsvZW5dXG4gICAqICAgW2phXeODmuODvOOCuOOCueOCv+ODg+OCr+OCkuODquOCu+ODg+ODiOOBl+OAgeaMh+WumuOBl+OBn+ODmuODvOOCuOOCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICByZXNldFRvUGFnZShwYWdlLCBvcHRpb25zID0ge30pIHtcbiAgICAoe3BhZ2UsIG9wdGlvbnN9ID0gdGhpcy5fcHJlcGFyZVBhZ2VBbmRPcHRpb25zKHBhZ2UsIG9wdGlvbnMpKTtcblxuICAgIGlmICghb3B0aW9ucy5hbmltYXRvciAmJiAhb3B0aW9ucy5hbmltYXRpb24gJiYgIW9wdGlvbnMucG9wKSB7XG4gICAgICBvcHRpb25zLmFuaW1hdGlvbiA9ICdub25lJztcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMucGFnZSAmJiAhb3B0aW9ucy5wYWdlSFRNTCAmJiB0aGlzLl9nZXRQYWdlVGFyZ2V0KCkpIHtcbiAgICAgIHBhZ2UgPSBvcHRpb25zLnBhZ2UgPSB0aGlzLl9nZXRQYWdlVGFyZ2V0KCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMucG9wKSB7XG4gICAgICB0aGlzLl9yZW1vdmVQYWdlcygpO1xuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0UGFnZSgwLCBwYWdlLCB7IGRhdGE6IG9wdGlvbnMuZGF0YSB9KVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnBvcFBhZ2Uob3B0aW9ucykpO1xuICAgIH1cblxuICAgIC8vIFRpcDogY2FsbGJhY2sgcnVucyBiZWZvcmUgcmVzb2x2ZWQgcHJvbWlzZVxuICAgIGNvbnN0IGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjaztcbiAgICBvcHRpb25zLmNhbGxiYWNrID0gbmV3UGFnZSA9PiB7XG4gICAgICB0aGlzLl9yZW1vdmVQYWdlcygpO1xuICAgICAgbmV3UGFnZS51cGRhdGVCYWNrQnV0dG9uKGZhbHNlKTtcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKG5ld1BhZ2UpO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wdXNoUGFnZShwYWdlLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJyaW5nUGFnZVRvcFxuICAgKiBAc2lnbmF0dXJlIGJyaW5nUGFnZVRvcChpdGVtLCBbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7U3RyaW5nfE51bWJlcn0gaXRlbVxuICAgKiAgIFtlbl1QYWdlIFVSTCBvciBpbmRleCBvZiBhbiBleGlzdGluZyBwYWdlIGluIG5hdmlnYXRvcidzIHN0YWNrLlsvZW5dXG4gICAqICAgW2phXeODmuODvOOCuOOBrlVSTOOBi+OCguOBl+OBj+OBr29ucy1uYXZpZ2F0b3Ljga7jg5rjg7zjgrjjgrnjgr/jg4Pjgq/jga7jgqTjg7Pjg4fjg4Pjgq/jgrnlgKTjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1Qcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIHRoZSBuZXcgdG9wIHBhZ2UuWy9lbl1cbiAgICogICBbamFd5paw44GX44GE44OI44OD44OX44Oa44O844K444KS6Kej5rG644GZ44KLUHJvbWlzZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1CcmluZ3MgdGhlIGdpdmVuIHBhZ2UgdG8gdGhlIHRvcCBvZiB0aGUgcGFnZSBzdGFjayBpZiBpdCBhbHJlYWR5IGV4aXN0cyBvciBwdXNoZXMgaXQgaW50byB0aGUgc3RhY2sgaWYgZG9lc24ndC4gRXh0ZW5kcyBgcHVzaFBhZ2UoKWAgcGFyYW1ldGVycy5bL2VuXVxuICAgKiAgIFtqYV3mjIflrprjgZfjgZ/jg5rjg7zjgrjjgpLjg5rjg7zjgrjjgrnjgr/jg4Pjgq/jga7kuIDnlarkuIrjgavnp7vli5XjgZfjgb7jgZnjgILjgoLjgZfmjIflrprjgZfjgZ/jg5rjg7zjgrjjgYznhKHjgYvjgaPjgZ/loLTlkIjmlrDjgZfjgY9wdXNo44GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGJyaW5nUGFnZVRvcChpdGVtLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoWydudW1iZXInLCAnc3RyaW5nJ10uaW5kZXhPZih0eXBlb2YgaXRlbSkgPT09IC0xKSB7XG4gICAgICB1dGlsLnRocm93KCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgcGFnZSBuYW1lIG9yIHRoZSBpbmRleCBvZiBhbiBleGlzdGluZyBwYWdlLiBZb3Ugc3VwcGxpZWQgJyArIGl0ZW0pO1xuICAgIH1cbiAgICBjb25zdCBpbmRleCA9IHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJyA/IHRoaXMuX25vcm1hbGl6ZUluZGV4KGl0ZW0pIDogdGhpcy5fbGFzdEluZGV4T2ZQYWdlKGl0ZW0pO1xuICAgIGNvbnN0IHBhZ2UgPSB0aGlzLnBhZ2VzW2luZGV4XTtcblxuICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnB1c2hQYWdlKGl0ZW0sIG9wdGlvbnMpO1xuICAgIH1cbiAgICAoe29wdGlvbnN9ID0gdGhpcy5fcHJlcGFyZVBhZ2VBbmRPcHRpb25zKHBhZ2UsIG9wdGlvbnMpKTtcblxuICAgIGlmIChpbmRleCA9PT0gdGhpcy5wYWdlcy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBhZ2UpO1xuICAgIH1cbiAgICBpZiAoIXBhZ2UpIHtcbiAgICAgIHV0aWwudGhyb3coJ0ZhaWxlZCB0byBmaW5kIGl0ZW0gJyArIGl0ZW0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5faXNSdW5uaW5nKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ3B1c2hQYWdlIGlzIGFscmVhZHkgcnVubmluZy4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2VtaXRQcmVQdXNoRXZlbnQoKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdDYW5jZWxlZCBpbiBwcmVwdXNoIGV2ZW50LicpO1xuICAgIH1cblxuICAgIHBhZ2Uuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIHBhZ2Uuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgIHBhZ2UucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChwYWdlKTtcbiAgICByZXR1cm4gdGhpcy5fcHVzaFBhZ2Uob3B0aW9ucyk7XG4gIH1cblxuICBfcHJlcGFyZVBhZ2VBbmRPcHRpb25zKHBhZ2UsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPSAnb2JqZWN0Jykge1xuICAgICAgdXRpbC50aHJvdygnb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdC4gWW91IHN1cHBsaWVkICcgKyBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoKHBhZ2UgPT09IG51bGwgfHwgcGFnZSA9PT0gdW5kZWZpbmVkKSAmJiBvcHRpb25zLnBhZ2UpIHtcbiAgICAgIHBhZ2UgPSBvcHRpb25zLnBhZ2U7XG4gICAgfVxuXG4gICAgb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMgfHwge30sIG9wdGlvbnMsIHtwYWdlfSk7XG5cbiAgICByZXR1cm4ge3BhZ2UsIG9wdGlvbnN9O1xuICB9XG5cbiAgX3JlbW92ZVBhZ2VzKHRpbWVzKSB7XG4gICAgY29uc3QgcGFnZXMgPSB0aGlzLnBhZ2VzO1xuICAgIGxldCB1bnRpbCA9IHRpbWVzID09PSB1bmRlZmluZWQgPyAwIDogcGFnZXMubGVuZ3RoIC0gdGltZXM7XG4gICAgdW50aWwgPSB1bnRpbCA8IDAgPyAxIDogdW50aWw7XG5cbiAgICBmb3IgKGxldCBpID0gcGFnZXMubGVuZ3RoIC0gMjsgaSA+PSB1bnRpbDsgaS0tKSB7XG4gICAgICB0aGlzLl9wYWdlTWFwLmRlbGV0ZShwYWdlc1tpXSk7XG4gICAgICB0aGlzLl9wYWdlTG9hZGVyLnVubG9hZChwYWdlc1tpXSk7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZUxhc3RQYWdlQmFja0J1dHRvbigpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMucGFnZXMubGVuZ3RoIC0gMTtcbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5wYWdlc1tpbmRleF0udXBkYXRlQmFja0J1dHRvbihpbmRleCA+IDApO1xuICAgIH1cbiAgfVxuXG4gIF9ub3JtYWxpemVJbmRleChpbmRleCkge1xuICAgIHJldHVybiBpbmRleCA+PSAwID8gaW5kZXggOiBNYXRoLmFicyh0aGlzLnBhZ2VzLmxlbmd0aCArIGluZGV4KSAlIHRoaXMucGFnZXMubGVuZ3RoO1xuICB9XG5cbiAgX29uRGV2aWNlQmFja0J1dHRvbihldmVudCkge1xuICAgIGlmICh0aGlzLnBhZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMucG9wUGFnZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBldmVudC5jYWxsUGFyZW50SGFuZGxlcigpO1xuICAgIH1cbiAgfVxuXG4gIF9sYXN0SW5kZXhPZlBhZ2UocGFnZU5hbWUpIHtcbiAgICBsZXQgaW5kZXg7XG4gICAgZm9yIChpbmRleCA9IHRoaXMucGFnZXMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgICAgaWYgKHBhZ2VOYW1lID09PSB0aGlzLl9wYWdlTWFwLmdldCh0aGlzLnBhZ2VzW2luZGV4XSkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIF9lbWl0UHJlRXZlbnQobmFtZSwgZGF0YSA9IHt9KSB7XG4gICAgbGV0IGlzQ2FuY2VsZWQgPSBmYWxzZTtcblxuICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAncHJlJyArIG5hbWUsIHV0aWwuZXh0ZW5kKHtcbiAgICAgIG5hdmlnYXRvcjogdGhpcyxcbiAgICAgIGN1cnJlbnRQYWdlOiB0aGlzLnBhZ2VzW3RoaXMucGFnZXMubGVuZ3RoIC0gMV0sXG4gICAgICBjYW5jZWw6ICgpID0+IGlzQ2FuY2VsZWQgPSB0cnVlXG4gICAgfSwgZGF0YSkpO1xuXG4gICAgcmV0dXJuIGlzQ2FuY2VsZWQ7XG4gIH1cblxuICBfZW1pdFByZVB1c2hFdmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW1pdFByZUV2ZW50KCdwdXNoJyk7XG4gIH1cblxuICBfZW1pdFByZVBvcEV2ZW50KCkge1xuICAgIGNvbnN0IGwgPSB0aGlzLnBhZ2VzLmxlbmd0aDtcbiAgICByZXR1cm4gdGhpcy5fZW1pdFByZUV2ZW50KCdwb3AnLCB7XG4gICAgICBsZWF2ZVBhZ2U6IHRoaXMucGFnZXNbbCAtIDFdLFxuICAgICAgZW50ZXJQYWdlOiB0aGlzLnBhZ2VzW2wgLSAyXVxuICAgIH0pO1xuICB9XG5cbiAgLy8gVE9ETzog5pu444GN55u044GZXG4gIF9jcmVhdGVQYWdlRWxlbWVudCh0ZW1wbGF0ZUhUTUwpIHtcbiAgICBjb25zdCBwYWdlRWxlbWVudCA9IHV0aWwuY3JlYXRlRWxlbWVudChpbnRlcm5hbC5ub3JtYWxpemVQYWdlSFRNTCh0ZW1wbGF0ZUhUTUwpKTtcbiAgICB2ZXJpZnlQYWdlRWxlbWVudChwYWdlRWxlbWVudCk7XG4gICAgcmV0dXJuIHBhZ2VFbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvbkRldmljZUJhY2tCdXR0b25cbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUJhY2stYnV0dG9uIGhhbmRsZXIuWy9lbl1cbiAgICogICBbamFd44OQ44OD44Kv44Oc44K/44Oz44OP44Oz44OJ44Op44CCWy9qYV1cbiAgICovXG4gIGdldCBvbkRldmljZUJhY2tCdXR0b24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyO1xuICB9XG5cbiAgc2V0IG9uRGV2aWNlQmFja0J1dHRvbihjYWxsYmFjaykge1xuICAgIGlmICh0aGlzLl9iYWNrQnV0dG9uSGFuZGxlcikge1xuICAgICAgdGhpcy5fYmFja0J1dHRvbkhhbmRsZXIuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyID0gZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIuY3JlYXRlSGFuZGxlcih0aGlzLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHRvcFBhZ2VcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUN1cnJlbnQgdG9wIHBhZ2UgZWxlbWVudC4gVXNlIHRoaXMgbWV0aG9kIHRvIGFjY2VzcyBvcHRpb25zIHBhc3NlZCBieSBgcHVzaFBhZ2UoKWAtbGlrZSBtZXRob2RzLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBruODmuODvOOCuOOCkuWPluW+l+OBl+OBvuOBmeOAgnB1c2hQYWdlKCnjgoRyZXNldFRvUGFnZSgp44Oh44K944OD44OJ44Gu5byV5pWw44KS5Y+W5b6X44Gn44GN44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGdldCB0b3BQYWdlKCkge1xuICAgIGxldCBsYXN0ID0gdGhpcy5sYXN0RWxlbWVudENoaWxkO1xuICAgIHdoaWxlIChsYXN0ICYmIGxhc3QudGFnTmFtZSAhPT0gJ09OUy1QQUdFJykgeyBsYXN0ID0gbGFzdC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOyB9XG4gICAgcmV0dXJuIGxhc3Q7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHBhZ2VzXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7QXJyYXl9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Db3B5IG9mIHRoZSBuYXZpZ2F0b3IncyBwYWdlIHN0YWNrLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgcGFnZXMoKSB7XG4gICAgcmV0dXJuIHV0aWwuYXJyYXlGcm9tKHRoaXMuY2hpbGRyZW4pXG4gICAgICAuZmlsdGVyKGVsZW1lbnQgPT4gZWxlbWVudC50YWdOYW1lID09PSAnT05TLVBBR0UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25Td2lwZVxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Ib29rIGNhbGxlZCB3aGVuZXZlciB0aGUgdXNlciBzbGlkZXMgdGhlIG5hdmlnYXRvciAoc3dpcGUtdG8tcG9wKS4gSXQgZ2V0cyBhIGRlY2ltYWwgcmF0aW8gKDAtMSkgYW5kIGFuIGFuaW1hdGlvbk9wdGlvbnMgb2JqZWN0IGFzIGFyZ3VtZW50cy5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgZ2V0IG9uU3dpcGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29uU3dpcGU7XG4gIH1cblxuICBzZXQgb25Td2lwZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24pKSB7XG4gICAgICB1dGlsLnRocm93KCdcIm9uU3dpcGVcIiBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgdGhpcy5fb25Td2lwZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvcHRpb25zXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1EZWZhdWx0IG9wdGlvbnMgb2JqZWN0LiBBdHRyaWJ1dGVzIGhhdmUgcHJpb3JpdHkgb3ZlciB0aGlzIHByb3BlcnR5LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb3B0aW9ucy5hbmltYXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJzbGlkZVwiYCwgYFwibGlmdFwiYCwgYFwiZmFkZVwiYCBhbmQgYFwibm9uZVwiYC5cbiAgICogICAgIFRoZXNlIGFyZSBwbGF0Zm9ybSBiYXNlZCBhbmltYXRpb25zLiBGb3IgZml4ZWQgYW5pbWF0aW9ucywgYWRkIGBcIi1pb3NcImAgb3IgYFwiLW1kXCJgIHN1ZmZpeCB0byB0aGUgYW5pbWF0aW9uIG5hbWUuIEUuZy4gYFwibGlmdC1pb3NcImAsIGBcImxpZnQtbWRcImAuIERlZmF1bHRzIHZhbHVlcyBhcmUgYFwic2xpZGUtaW9zXCJgIGFuZCBgXCJmYWRlLW1kXCJgLlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIGRlbGF5LCB0aW1pbmfjgpLmjIflrprjgZfjgb7jgZnjgIJlLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YCBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IG9wdGlvbnMuY2FsbGJhY2tcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIHRyYW5zaXRpb24gaGFzIGVuZGVkLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruODoeOCveODg+ODieOBq+OCiOOCi+eUu+mdoumBt+enu+OBjOe1guS6huOBl+OBn+mam+OBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGdldCBvcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zO1xuICB9XG4gIHNldCBvcHRpb25zKG9iamVjdCkge1xuICAgIHRoaXMuX29wdGlvbnMgPSBvYmplY3Q7XG4gIH1cblxuICBnZXQgYW5pbWF0aW9uT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2FuaW1hdGlvbi1vcHRpb25zJykgP1xuICAgICAgQW5pbWF0b3JGYWN0b3J5LnBhcnNlQW5pbWF0aW9uT3B0aW9uc1N0cmluZyh0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKSkgOiB7fTtcbiAgfVxuXG4gIHNldCBhbmltYXRpb25PcHRpb25zKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHNldCBfaXNSdW5uaW5nKHZhbHVlKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ19pcy1ydW5uaW5nJywgdmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgfVxuICBnZXQgX2lzUnVubmluZygpIHtcbiAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMuZ2V0QXR0cmlidXRlKCdfaXMtcnVubmluZycpKTtcbiAgfVxuXG4gIF9zaG93KCkge1xuICAgIHRoaXMubG9hZGVkLnRoZW4oKCkgPT4gdGhpcy50b3BQYWdlICYmIHRoaXMudG9wUGFnZS5fc2hvdygpKTtcbiAgfVxuXG4gIF9oaWRlKCkge1xuICAgIHRoaXMudG9wUGFnZSAmJiB0aGlzLnRvcFBhZ2UuX2hpZGUoKTtcbiAgfVxuXG4gIF9kZXN0cm95KCkge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLnBhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0aGlzLl9wYWdlTG9hZGVyLnVubG9hZCh0aGlzLnBhZ2VzW2ldKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IEFuaW1hdG9yXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJBbmltYXRvcihuYW1lLCBBbmltYXRvcikge1xuICAgIGlmICghKEFuaW1hdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIE5hdmlnYXRvckFuaW1hdG9yKSkge1xuICAgICAgdXRpbC50aHJvd0FuaW1hdG9yKCdOYXZpZ2F0b3InKTtcbiAgICB9XG5cbiAgICBfYW5pbWF0b3JEaWN0W25hbWVdID0gQW5pbWF0b3I7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGFuaW1hdG9ycygpIHtcbiAgICByZXR1cm4gX2FuaW1hdG9yRGljdDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTmF2aWdhdG9yQW5pbWF0b3IoKSB7XG4gICAgcmV0dXJuIE5hdmlnYXRvckFuaW1hdG9yO1xuICB9XG5cbiAgc3RhdGljIGdldCBldmVudHMoKSB7XG4gICAgcmV0dXJuIFsncHJlcHVzaCcsICdwb3N0cHVzaCcsICdwcmVwb3AnLCAncG9zdHBvcCcsICdzd2lwZSddO1xuICB9XG5cbiAgc3RhdGljIGdldCByZXdyaXRhYmxlcygpIHtcbiAgICByZXR1cm4gcmV3cml0YWJsZXM7XG4gIH1cbn1cblxub25zRWxlbWVudHMuTmF2aWdhdG9yID0gTmF2aWdhdG9yRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLW5hdmlnYXRvcicsIE5hdmlnYXRvckVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgaW50ZXJuYWwgZnJvbSAnLi4vb25zL2ludGVybmFsL2luZGV4LmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ3Rvb2xiYXInO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcnOiAndG9vbGJhci0tKicsXG4gICcudG9vbGJhcl9fbGVmdCc6ICd0b29sYmFyLS0qX19sZWZ0JyxcbiAgJy50b29sYmFyX19jZW50ZXInOiAndG9vbGJhci0tKl9fY2VudGVyJyxcbiAgJy50b29sYmFyX19yaWdodCc6ICd0b29sYmFyLS0qX19yaWdodCdcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXRvb2xiYXJcbiAqIEBjYXRlZ29yeSBwYWdlXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICAgW2VuXU1hdGVyaWFsIERlc2lnbiB0b29sYmFyLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQG1vZGlmaWVyIHRyYW5zcGFyZW50XG4gKiAgIFtlbl1UcmFuc3BhcmVudCB0b29sYmFyLlsvZW5dXG4gKiAgIFtqYV3pgI/mmI7jgarog4zmma/jgpLmjIHjgaTjg4Tjg7zjg6vjg5Djg7zjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICogQG1vZGlmaWVyIGNvdmVyLWNvbnRlbnRcbiAqICAgW2VuXURpc3BsYXlzIHRoZSB0b29sYmFyIG9uIHRvcCBvZiB0aGUgcGFnZSdzIGNvbnRlbnQuIFNob3VsZCBiZSBjb21iaW5lZCB3aXRoIGB0cmFuc3BhcmVudGAgbW9kaWZpZXIuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAbW9kaWZpZXIgbm9zaGFkb3dcbiAqICAgW2VuXVRvb2xiYXIgd2l0aG91dCBzaGFkb3cuWy9lbl1cbiAqICAgW2phXeODhOODvOODq+ODkOODvOOBq+W9seOCkuS7mOOBkeOBmuOBq+ihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIFRvb2xiYXIgY29tcG9uZW50IHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBuYXZpZ2F0aW9uLlxuICpcbiAqICAgICBMZWZ0LCBjZW50ZXIgYW5kIHJpZ2h0IGNvbnRhaW5lcnMgY2FuIGJlIHNwZWNpZmllZCBieSBjbGFzcyBuYW1lcy5cbiAqXG4gKiAgICAgVGhpcyBjb21wb25lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGRpc3BsYXkgYXMgYSBNYXRlcmlhbCBEZXNpZ24gdG9vbGJhciB3aGVuIHJ1bm5pbmcgb24gQW5kcm9pZCBkZXZpY2VzLlxuICogICBbL2VuXVxuICogICBbamFd44OK44OT44Ky44O844K344On44Oz44Gn5L2/55So44GZ44KL44OE44O844Or44OQ44O855So44Kz44Oz44Od44O844ON44Oz44OI44Gn44GZ44CC44Kv44Op44K55ZCN44Gr44KI44KK44CB5bem44CB5Lit5aSu44CB5Y+z44Gu44Kz44Oz44OG44OK44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqIEBjb2RlcGVuIGFIbUdMXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvdG9vbGJhclxuICogQGd1aWRlIGNvbXBpbGF0aW9uLmh0bWwjdG9vbGJhci1jb21waWxhdGlvbiBbZW5dQWRkaW5nIGEgdG9vbGJhclsvZW5dW2phXeODhOODvOODq+ODkOODvOOBrui/veWKoFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtYm90dG9tLXRvb2xiYXJcbiAqICAgW2VuXVRoZSBgPG9ucy1ib3R0b20tdG9vbGJhcj5gIGRpc3BsYXlzIGEgdG9vbGJhciBvbiB0aGUgYm90dG9tIG9mIHRoZSBwYWdlLlsvZW5dXG4gKiAgIFtqYV1vbnMtYm90dG9tLXRvb2xiYXLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWJhY2stYnV0dG9uXG4gKiAgIFtlbl1UaGUgYDxvbnMtYmFjay1idXR0b24+YCBjb21wb25lbnQgZGlzcGxheXMgYSBiYWNrIGJ1dHRvbiBpbnNpZGUgdGhlIHRvb2xiYXIuWy9lbl1cbiAqICAgW2phXW9ucy1iYWNrLWJ1dHRvbuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtdG9vbGJhci1idXR0b25cbiAqICAgW2VuXVRoZSBgPG9ucy10b29sYmFyLWJ1dHRvbj5gIGNvbXBvbmVudCBkaXNwbGF5cyBhIHRvb2xiYXIgYnV0dG9uIGluc2lkZSB0aGUgdG9vbGJhci5bL2VuXVxuICogICBbamFdb25zLXRvb2xiYXItYnV0dG9u44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXBhZ2U+XG4gKiAgIDxvbnMtdG9vbGJhcj5cbiAqICAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxuICogICAgICAgPG9ucy1iYWNrLWJ1dHRvbj5cbiAqICAgICAgICAgQmFja1xuICogICAgICAgPC9vbnMtYmFjay1idXR0b24+XG4gKiAgICAgPC9kaXY+XG4gKiAgICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICogICAgICAgVGl0bGVcbiAqICAgICA8L2Rpdj5cbiAqICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAqICAgICAgIDxvbnMtdG9vbGJhci1idXR0b24+XG4gKiAgICAgICAgIDxvbnMtaWNvbiBpY29uPVwibWQtbWVudVwiPjwvb25zLWljb24+XG4gKiAgICAgICA8L29ucy10b29sYmFyLWJ1dHRvbj5cbiAqICAgICA8L2Rpdj5cbiAqICAgPC9vbnMtdG9vbGJhcj5cbiAqIDwvb25zLXBhZ2U+XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9vbGJhckVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgaW5saW5lXG4gICAqIEBpbml0b25seVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRGlzcGxheSB0aGUgdG9vbGJhciBhcyBhbiBpbmxpbmUgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV3jg4Tjg7zjg6vjg5Djg7zjgpLjgqTjg7Pjg6njgqTjg7Pjgavnva7jgY3jgb7jgZnjgILjgrnjgq/jg63jg7zjg6vpoJjln5/lhoXjgavjgZ3jga7jgb7jgb7ooajnpLrjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzdGF0aWNcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVN0YXRpYyB0b29sYmFycyBhcmUgbm90IGFuaW1hdGVkIGJ5IGBvbnMtbmF2aWdhdG9yYCB3aGVuIHB1c2hpbmcgb3IgcG9wcGluZyBwYWdlcy4gVGhpcyBjYW4gYmUgdXNlZnVsIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgaW4gc29tZSBzaXR1YXRpb25zLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgc3RhdGljXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3RhdGljIHRvb2xiYXJzIGFyZSBub3QgYW5pbWF0ZWQgYnkgYG9ucy1uYXZpZ2F0b3JgIHdoZW4gcHVzaGluZyBvciBwb3BwaW5nIHBhZ2VzLiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBpbiBzb21lIHNpdHVhdGlvbnMuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSB0b29sYmFyLlsvZW5dXG4gICAqICAgW2phXeODhOODvOODq+ODkOODvOOBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmlzaWJsZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgdG9vbGJhciBpcyBzaG93biBvciBub3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX3Zpc2libGUgPSB0cnVlO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ2NsYXNzJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCBkZWZhdWx0Q2xhc3NOYW1lLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNldFZpc2liaWxpdHlcbiAgICogQHNpZ25hdHVyZSBzZXRWaXNpYmlsaXR5KHZpc2libGUpXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gdmlzaWJsZVxuICAgKiAgIFtlbl1TZXQgdG8gdHJ1ZSB0byBzaG93IHRoZSB0b29sYmFyLCBmYWxzZSB0byBoaWRlIGl0Wy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNob3dzIHRoZSB0b29sYmFyIGlmIHZpc2libGUgaXMgdHJ1ZSwgb3RoZXJ3aXNlIGhpZGVzIGl0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBzZXRWaXNpYmlsaXR5KHZpc2libGUpIHtcbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fdmlzaWJsZSA9IHZpc2libGU7XG5cbiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyAnJyA6ICdub25lJztcblxuICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkge1xuICAgICAgICBjb25zdCBzaWJsaW5nQmFja2dyb3VuZCA9IHV0aWwuZmluZENoaWxkKHRoaXMucGFyZW50Tm9kZSwgJy5wYWdlX19iYWNrZ3JvdW5kJyk7XG4gICAgICAgIGlmIChzaWJsaW5nQmFja2dyb3VuZCkge1xuICAgICAgICAgIHNpYmxpbmdCYWNrZ3JvdW5kLnN0eWxlLnRvcCA9IHZpc2libGUgPyBudWxsIDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNpYmxpbmdDb250ZW50ID0gdXRpbC5maW5kQ2hpbGQodGhpcy5wYXJlbnROb2RlLCAnLnBhZ2VfX2NvbnRlbnQnKTtcbiAgICAgICAgaWYgKHNpYmxpbmdDb250ZW50KSB7XG4gICAgICAgICAgc2libGluZ0NvbnRlbnQuc3R5bGUudG9wID0gdmlzaWJsZSA/IG51bGwgOiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzaG93XG4gICAqIEBzaWduYXR1cmUgc2hvdygpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHRoZSB0b29sYmFyLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBzaG93KCkge1xuICAgIHRoaXMuc2V0VmlzaWJpbGl0eSh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGhpZGVcbiAgICogQHNpZ25hdHVyZSBoaWRlKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUhpZGUgdGhlIHRvb2xiYXIuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGhpZGUoKSB7XG4gICAgdGhpcy5zZXRWaXNpYmlsaXR5KGZhbHNlKTtcbiAgfVxuXG4gIGdldCB2aXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLl92aXNpYmxlO1xuICB9XG5cbiAgc2V0IHZpc2libGUodmFsdWUpIHtcbiAgICB0aGlzLnNldFZpc2liaWxpdHkodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICAgKi9cbiAgX2dldFRvb2xiYXJMZWZ0SXRlbXNFbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJy5sZWZ0JykgfHwgaW50ZXJuYWwubnVsbEVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAqL1xuICBfZ2V0VG9vbGJhckNlbnRlckl0ZW1zRWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCcuY2VudGVyJykgfHwgaW50ZXJuYWwubnVsbEVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAqL1xuICBfZ2V0VG9vbGJhclJpZ2h0SXRlbXNFbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJy5yaWdodCcpIHx8IGludGVybmFsLm51bGxFbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fVxuICAgKi9cbiAgX2dldFRvb2xiYXJCYWNrQnV0dG9uTGFiZWxFbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ29ucy1iYWNrLWJ1dHRvbiAuYmFjay1idXR0b25fX2xhYmVsJykgfHwgaW50ZXJuYWwubnVsbEVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9XG4gICAqL1xuICBfZ2V0VG9vbGJhckJhY2tCdXR0b25JY29uRWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdvbnMtYmFjay1idXR0b24gLmJhY2stYnV0dG9uX19pY29uJykgfHwgaW50ZXJuYWwubnVsbEVsZW1lbnQ7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcbiAgICB0aGlzLmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG4gICAgdGhpcy5fZW5zdXJlVG9vbGJhckl0ZW1FbGVtZW50cygpO1xuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIF9lbnN1cmVUb29sYmFySXRlbUVsZW1lbnRzKCkge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwIDsgaS0tKSB7XG4gICAgICAvLyBjYXNlIG9mIG5vdCBlbGVtZW50XG4gICAgICBpZiAodGhpcy5jaGlsZE5vZGVzW2ldLm5vZGVUeXBlICE9IDEpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmNoaWxkTm9kZXNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNlbnRlciA9IHRoaXMuX2Vuc3VyZVRvb2xiYXJFbGVtZW50KCdjZW50ZXInKTtcbiAgICBjZW50ZXIuY2xhc3NMaXN0LmFkZCgndG9vbGJhcl9fdGl0bGUnKTtcblxuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCAhPT0gMSB8fCAhdGhpcy5jaGlsZHJlblswXS5jbGFzc0xpc3QuY29udGFpbnMoJ2NlbnRlcicpKSB7XG4gICAgICBjb25zdCBsZWZ0ID0gdGhpcy5fZW5zdXJlVG9vbGJhckVsZW1lbnQoJ2xlZnQnKTtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5fZW5zdXJlVG9vbGJhckVsZW1lbnQoJ3JpZ2h0Jyk7XG5cbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuWzBdICE9PSBsZWZ0IHx8IHRoaXMuY2hpbGRyZW5bMV0gIT09IGNlbnRlciB8fCB0aGlzLmNoaWxkcmVuWzJdICE9PSByaWdodCkge1xuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGxlZnQpO1xuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNlbnRlcik7XG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQocmlnaHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9lbnN1cmVUb29sYmFyRWxlbWVudChuYW1lKSB7XG4gICAgaWYgKHV0aWwuZmluZENoaWxkKHRoaXMsICcudG9vbGJhcl9fJyArIG5hbWUpKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy50b29sYmFyX18nICsgbmFtZSk7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQobmFtZSk7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy4nICsgbmFtZSkgfHwgdXRpbC5jcmVhdGUoJy4nICsgbmFtZSk7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0b29sYmFyX18nICsgbmFtZSk7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuXG51dGlsLmRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzKFRvb2xiYXJFbGVtZW50LCBbJ3N0YXRpYyddKTtcblxub25zRWxlbWVudHMuVG9vbGJhciA9IFRvb2xiYXJFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtdG9vbGJhcicsIFRvb2xiYXJFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGludGVybmFsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9pbmRleC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgZGV2aWNlQmFja0J1dHRvbkRpc3BhdGNoZXIgZnJvbSAnLi4vb25zL2ludGVybmFsL2RldmljZS1iYWNrLWJ1dHRvbi1kaXNwYXRjaGVyLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5pbXBvcnQgJy4vb25zLXRvb2xiYXIuanMnOyAvLyBlbnN1cmVzIHRoYXQgJ29ucy10b29sYmFyJyBlbGVtZW50IGlzIHJlZ2lzdGVyZWRcblxuY29uc3QgZGVmYXVsdENsYXNzTmFtZSA9ICdwYWdlJztcbmNvbnN0IHNjaGVtZSA9IHtcbiAgJyc6ICdwYWdlLS0qJyxcbiAgJy5wYWdlX19jb250ZW50JzogJ3BhZ2UtLSpfX2NvbnRlbnQnLFxuICAnLnBhZ2VfX2JhY2tncm91bmQnOiAncGFnZS0tKl9fYmFja2dyb3VuZCdcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXBhZ2VcbiAqIEBjYXRlZ29yeSBwYWdlXG4gKiBAbW9kaWZpZXIgbWF0ZXJpYWxcbiAqICAgW2VuXU1hdGVyaWFsIERlc2lnbiBzdHlsZVsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBUaGlzIGNvbXBvbmVudCBkZWZpbmVzIHRoZSByb290IG9mIGVhY2ggcGFnZS4gSWYgdGhlIGNvbnRlbnQgaXMgbGFyZ2UgaXQgd2lsbCBiZWNvbWUgc2Nyb2xsYWJsZS5cbiAqXG4gKiAgICAgQSBuYXZpZ2F0aW9uIGJhciBjYW4gYmUgYWRkZWQgdG8gdGhlIHRvcCBvZiB0aGUgcGFnZSB1c2luZyB0aGUgYDxvbnMtdG9vbGJhcj5gIGVsZW1lbnQuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV3jg5rjg7zjgrjlrprnvqnjga7jgZ/jgoHjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjgafjgZnjgILjgZPjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7lhoXlrrnjga/jgrnjgq/jg63jg7zjg6vjgYzoqLHlj6/jgZXjgozjgb7jgZnjgIJbL2phXVxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3BhZ2VcbiAqIEBndWlkZSBsaWZlY3ljbGUuaHRtbCNldmVudHNcbiAqICAgW2VuXU92ZXJ2aWV3IG9mIHBhZ2UgZXZlbnRzWy9lbl1cbiAqICAgW2phXU92ZXJ2aWV3IG9mIHBhZ2UgZXZlbnRzWy9qYV1cbiAqIEBndWlkZSBmdW5kYW1lbnRhbHMuaHRtbCNtYW5hZ2luZy1wYWdlc1xuICogICBbZW5dTWFuYWdpbmcgbXVsdGlwbGUgcGFnZXNbL2VuXVxuICogICBbamFd6KSH5pWw44Gu44Oa44O844K444KS566h55CG44GZ44KLWy9qYV1cbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjbW9kaWZpZXJzIFtlbl1Nb3JlIGRldGFpbHMgYWJvdXQgdGhlIGBtb2RpZmllcmAgYXR0cmlidXRlWy9lbl1bamFdbW9kaWZpZXLlsZ7mgKfjga7kvb/jgYTmlrlbL2phXVxuICogQHNlZWFsc28gb25zLXRvb2xiYXJcbiAqICAgW2VuXVVzZSB0aGUgYDxvbnMtdG9vbGJhcj5gIGVsZW1lbnQgdG8gYWRkIGEgbmF2aWdhdGlvbiBiYXIgdG8gdGhlIHRvcCBvZiB0aGUgcGFnZS5bL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXBhZ2U+XG4gKiAgIDxvbnMtdG9vbGJhcj5cbiAqICAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxuICogICAgICAgPG9ucy1iYWNrLWJ1dHRvbj5CYWNrPC9vbnMtYmFjay1idXR0b24+XG4gKiAgICAgPC9kaXY+XG4gKiAgICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlRpdGxlPC9kaXY+XG4gKiAgICAgPGRpdiBjbGFzcz1cInJpZ2h0XCI+XG4gKiAgICAgICA8b25zLXRvb2xiYXItYnV0dG9uPlxuICogICAgICAgICA8b25zLWljb24gaWNvbj1cIm1kLW1lbnVcIj48L29ucy1pY29uPlxuICogICAgICAgPC9vbnMtdG9vbGJhci1idXR0b24+XG4gKiAgICAgPC9kaXY+XG4gKiAgIDwvb25zLXRvb2xiYXI+XG4gKlxuICogICA8cD5QYWdlIGNvbnRlbnQ8L3A+XG4gKiA8L29ucy1wYWdlPlxuICpcbiAqIEBleGFtcGxlXG4gKiA8c2NyaXB0PlxuICogICBteUFwcC5oYW5kbGVyID0gZnVuY3Rpb24oZG9uZSkge1xuICogICAgIGxvYWRNb3JlKCkudGhlbihkb25lKTtcbiAqICAgfVxuICogPC9zY3JpcHQ+XG4gKlxuICogPG9ucy1wYWdlIG9uLWluZmluaXRlLXNjcm9sbD1cIm15QXBwLmhhbmRsZXJcIj5cbiAqICAgPG9ucy10b29sYmFyPlxuICogICAgIDxkaXYgY2xhc3M9XCJjZW50ZXJcIj5MaXN0PC9kaXY+XG4gKiAgIDwvb25zLXRvb2xiYXI+XG4gKlxuICogICA8b25zLWxpc3Q+XG4gKiAgICAgPG9ucy1saXN0LWl0ZW0+IzE8L29ucy1saXN0LWl0ZW0+XG4gKiAgICAgPG9ucy1saXN0LWl0ZW0+IzI8L29ucy1saXN0LWl0ZW0+XG4gKiAgICAgPG9ucy1saXN0LWl0ZW0+IzM8L29ucy1saXN0LWl0ZW0+XG4gKiAgICAgLi4uXG4gKiAgIDwvb25zLWxpc3Q+XG4gKiA8L29ucy1wYWdlPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdlRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IGluaXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHJpZ2h0IGFmdGVyIHRoZSBwYWdlIGlzIGF0dGFjaGVkLlsvZW5dXG4gICAqICAgW2phXeODmuODvOOCuOOBjOOCouOCv+ODg+ODgeOBleOCjOOBn+W+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgc2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQgcmlnaHQgYWZ0ZXIgdGhlIHBhZ2UgaXMgc2hvd24uWy9lbl1cbiAgICogICBbamFd44Oa44O844K444GM6KGo56S644GV44KM44Gf5b6M44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBoaWRlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCByaWdodCBhZnRlciB0aGUgcGFnZSBpcyBoaWRkZW4uWy9lbl1cbiAgICogICBbamFd44Oa44O844K444GM6Zqg44KM44Gf5b6M44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBkZXN0cm95XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCByaWdodCBiZWZvcmUgdGhlIHBhZ2UgaXMgZGVzdHJveWVkLlsvZW5dXG4gICAqICAgW2phXeODmuODvOOCuOOBjOegtOajhOOBleOCjOOCi+WJjeOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IG1vZGlmaWVyIG5hbWUgdG8gc3BlY2lmeSBjdXN0b20gc3R5bGVzLlsvZW5dXG4gICAqICAgW2phXeOCueOCv+OCpOODq+Wumue+qeOCkuOCq+OCueOCv+ODnuOCpOOCuuOBmeOCi+OBn+OCgeOBruWQjeWJjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG9uLWluZmluaXRlLXNjcm9sbFxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUGF0aCBvZiB0aGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgb24gaW5maW5pdGUgc2Nyb2xsaW5nLiBFeGFtcGxlOiBgYXBwLmxvYWREYXRhYC4gVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIGEgZG9uZSBjYWxsYmFjayB0aGF0IG11c3QgYmUgY2FsbGVkIHdoZW4gaXQncyBmaW5pc2hlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fZGVyaXZlSG9va3MoKTtcblxuICAgIHRoaXMuX2RlZmF1bHRDbGFzc05hbWUgPSBkZWZhdWx0Q2xhc3NOYW1lO1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChkZWZhdWx0Q2xhc3NOYW1lKTtcblxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fY29tcGlsZSgpO1xuXG4gICAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgICB0aGlzLl9jb250ZW50RWxlbWVudCA9IHRoaXMuX2dldENvbnRlbnRFbGVtZW50KCk7XG4gICAgICB0aGlzLl9iYWNrZ3JvdW5kRWxlbWVudCA9IHRoaXMuX2dldEJhY2tncm91bmRFbGVtZW50KCk7XG4gICAgfSk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcblxuICAgIGNvbnN0IHRvb2xiYXIgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnb25zLXRvb2xiYXInKTtcblxuICAgIGNvbnN0IGJhY2tncm91bmQgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnBhZ2VfX2JhY2tncm91bmQnKSB8fCB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLmJhY2tncm91bmQnKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBiYWNrZ3JvdW5kLmNsYXNzTGlzdC5hZGQoJ3BhZ2VfX2JhY2tncm91bmQnKTtcbiAgICB0aGlzLmluc2VydEJlZm9yZShiYWNrZ3JvdW5kLCAhdG9vbGJhciAmJiB0aGlzLmZpcnN0Q2hpbGQgfHwgdG9vbGJhciAmJiB0b29sYmFyLm5leHRTaWJsaW5nKTtcblxuICAgIGNvbnN0IGNvbnRlbnQgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnBhZ2VfX2NvbnRlbnQnKSB8fCB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLmNvbnRlbnQnKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ3BhZ2VfX2NvbnRlbnQnKTtcbiAgICBpZiAoIWNvbnRlbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgdXRpbC5hcnJheUZyb20odGhpcy5jaGlsZE5vZGVzKS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSB8fCB0aGlzLl9lbGVtZW50U2hvdWxkQmVNb3ZlZChub2RlKSkge1xuICAgICAgICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQobm9kZSk7IC8vIENhbiB0cmlnZ2VyIGRldGFjaGVkIGNvbm5lY3RlZENhbGxiYWNrc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl90cnlUb0ZpbGxTdGF0dXNCYXIoY29udGVudCk7IC8vIE11c3QgcnVuIGJlZm9yZSBjaGlsZCBwYWdlcyB0cnkgdG8gZmlsbCBzdGF0dXMgYmFyLlxuICAgIHRoaXMuaW5zZXJ0QmVmb3JlKGNvbnRlbnQsIGJhY2tncm91bmQubmV4dFNpYmxpbmcpOyAvLyBDYW4gdHJpZ2dlciBhdHRhY2hlZCBjb25uZWN0ZWRDYWxsYmFja3NcblxuICAgIGlmICgoIXRvb2xiYXIgfHwgIXV0aWwuaGFzTW9kaWZpZXIodG9vbGJhciwgJ3RyYW5zcGFyZW50JykpXG4gICAgICAmJiBjb250ZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMVxuICAgICAgJiYgdXRpbC5pc1BhZ2VDb250cm9sKGNvbnRlbnQuY2hpbGRyZW5bMF0pXG4gICAgKSB7XG4gICAgICB0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lICs9ICcgcGFnZS0td3JhcHBlcic7XG4gICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaygnY2xhc3MnKTtcbiAgICB9XG5cbiAgICBjb25zdCBib3R0b21Ub29sYmFyID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJ29ucy1ib3R0b20tdG9vbGJhcicpO1xuICAgIGlmIChib3R0b21Ub29sYmFyKSB7XG4gICAgICB0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lICs9ICcgcGFnZS13aXRoLWJvdHRvbS10b29sYmFyJztcbiAgICAgIHRoaXMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCdjbGFzcycpO1xuICAgIH1cblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIF9lbGVtZW50U2hvdWxkQmVNb3ZlZChlbCkge1xuICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ3BhZ2VfX2JhY2tncm91bmQnKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0YWdOYW1lID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICh0YWdOYW1lID09PSAnb25zLWZhYicpIHtcbiAgICAgIHJldHVybiAhZWwuaGFzQXR0cmlidXRlKCdwb3NpdGlvbicpO1xuICAgIH1cbiAgICBjb25zdCBmaXhlZEVsZW1lbnRzID0gWydzY3JpcHQnLCAnb25zLXRvb2xiYXInLCAnb25zLWJvdHRvbS10b29sYmFyJywgJ29ucy1tb2RhbCcsICdvbnMtc3BlZWQtZGlhbCcsICdvbnMtZGlhbG9nJywgJ29ucy1hbGVydC1kaWFsb2cnLCAnb25zLXBvcG92ZXInLCAnb25zLWFjdGlvbi1zaGVldCddO1xuICAgIHJldHVybiBlbC5oYXNBdHRyaWJ1dGUoJ2lubGluZScpIHx8IGZpeGVkRWxlbWVudHMuaW5kZXhPZih0YWdOYW1lKSA9PT0gLTE7XG4gIH1cblxuICBfdHJ5VG9GaWxsU3RhdHVzQmFyKGNvbnRlbnQgPSB0aGlzLl9jb250ZW50RWxlbWVudCkge1xuICAgIGludGVybmFsLmF1dG9TdGF0dXNCYXJGaWxsKCgpID0+IHtcbiAgICAgIHV0aWwudG9nZ2xlQXR0cmlidXRlKHRoaXMsICdzdGF0dXMtYmFyLWZpbGwnLFxuICAgICAgICAhdXRpbC5maW5kUGFyZW50KHRoaXMsIGUgPT4gZS5oYXNBdHRyaWJ1dGUoJ3N0YXR1cy1iYXItZmlsbCcpKSAvLyBOb3QgYWxyZWFkeSBmaWxsZWRcbiAgICAgICAgJiYgKHRoaXMuX2NhbkFuaW1hdGVUb29sYmFyKGNvbnRlbnQpIHx8ICF1dGlsLmZpbmRDaGlsZChjb250ZW50LCB1dGlsLmlzUGFnZUNvbnRyb2wpKSAvLyBIYXMgdG9vbGJhciBvciBjYW5ub3QgZGVsZWdhdGVcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBfY2FuQW5pbWF0ZVRvb2xiYXIoY29udGVudCA9IHRoaXMuX2NvbnRlbnRFbGVtZW50KSB7XG4gICAgaWYgKHV0aWwuZmluZENoaWxkKHRoaXMsICdvbnMtdG9vbGJhcicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gISF1dGlsLmZpbmRDaGlsZChjb250ZW50LCBlbCA9PiB7XG4gICAgICByZXR1cm4gdXRpbC5tYXRjaChlbCwgJ29ucy10b29sYmFyJykgJiYgIWVsLmhhc0F0dHJpYnV0ZSgnaW5saW5lJyk7XG4gICAgfSk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAoIXV0aWwuaXNBdHRhY2hlZCh0aGlzKSkgeyAvLyBBdm9pZCBkZXRhY2hlZCBjYWxsc1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl90cnlUb0ZpbGxTdGF0dXNCYXIoKTsgLy8gRW5zdXJlIHN0YXR1cyBiYXIgd2hlbiB0aGUgZWxlbWVudCB3YXMgY29tcGlsZWQgYmVmb3JlIGNvbm5lY3RlZFxuXG4gICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ29uLWluZmluaXRlLXNjcm9sbCcpKSB7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKCdvbi1pbmZpbml0ZS1zY3JvbGwnLCBudWxsLCB0aGlzLmdldEF0dHJpYnV0ZSgnb24taW5maW5pdGUtc2Nyb2xsJykpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMub25Jbml0ICYmIHRoaXMub25Jbml0KCk7XG4gICAgICAgICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdpbml0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdXRpbC5oYXNBbnlDb21wb25lbnRBc1BhcmVudCh0aGlzKSkge1xuICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLl9zaG93KCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVCYWNrQnV0dG9uKHNob3cpIHtcbiAgICBpZiAodGhpcy5iYWNrQnV0dG9uKSB7XG4gICAgICBzaG93ID8gdGhpcy5iYWNrQnV0dG9uLnNob3coKSA6IHRoaXMuYmFja0J1dHRvbi5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0IG5hbWUoc3RyKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBzdHIpO1xuICB9XG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG4gIH1cblxuICBnZXQgYmFja0J1dHRvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKCdvbnMtYmFjay1idXR0b24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25JbmZpbml0ZVNjcm9sbFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1GdW5jdGlvbiB0byBiZSBleGVjdXRlZCB3aGVuIHNjcm9sbGluZyB0byB0aGUgYm90dG9tIG9mIHRoZSBwYWdlLiBUaGUgZnVuY3Rpb24gcmVjZWl2ZXMgYSBkb25lIGNhbGxiYWNrIGFzIGFuIGFyZ3VtZW50IHRoYXQgbXVzdCBiZSBjYWxsZWQgd2hlbiBpdCdzIGZpbmlzaGVkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG4gIHNldCBvbkluZmluaXRlU2Nyb2xsKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlICYmICEodmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcbiAgICAgIHV0aWwudGhyb3coJ1wib25JbmZpbml0ZVNjcm9sbFwiIG11c3QgYmUgZnVuY3Rpb24gb3IgbnVsbCcpO1xuICAgIH1cblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2NvbnRlbnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX2JvdW5kT25TY3JvbGwpO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5fb25JbmZpbml0ZVNjcm9sbCkge1xuICAgICAgICB0aGlzLl9pbmZpbml0ZVNjcm9sbExpbWl0ID0gMC45O1xuICAgICAgICB0aGlzLl9ib3VuZE9uU2Nyb2xsID0gdGhpcy5fb25TY3JvbGwuYmluZCh0aGlzKTtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuX2NvbnRlbnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX2JvdW5kT25TY3JvbGwpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX29uSW5maW5pdGVTY3JvbGwgPSB2YWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBvbkluZmluaXRlU2Nyb2xsKCkge1xuICAgIHJldHVybiB0aGlzLl9vbkluZmluaXRlU2Nyb2xsO1xuICB9XG5cbiAgX29uU2Nyb2xsKCkge1xuICAgIGNvbnN0IGMgPSB0aGlzLl9jb250ZW50RWxlbWVudCxcbiAgICAgIG92ZXJMaW1pdCA9IChjLnNjcm9sbFRvcCArIGMuY2xpZW50SGVpZ2h0KSAvIGMuc2Nyb2xsSGVpZ2h0ID49IHRoaXMuX2luZmluaXRlU2Nyb2xsTGltaXQ7XG5cbiAgICBpZiAodGhpcy5fb25JbmZpbml0ZVNjcm9sbCAmJiAhdGhpcy5fbG9hZGluZ0NvbnRlbnQgJiYgb3ZlckxpbWl0KSB7XG4gICAgICB0aGlzLl9sb2FkaW5nQ29udGVudCA9IHRydWU7XG4gICAgICB0aGlzLl9vbkluZmluaXRlU2Nyb2xsKCgpID0+IHRoaXMuX2xvYWRpbmdDb250ZW50ID0gZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1CYWNrLWJ1dHRvbiBoYW5kbGVyLlsvZW5dXG4gICAqICAgW2phXeODkOODg+OCr+ODnOOCv+ODs+ODj+ODs+ODieODqeOAglsvamFdXG4gICAqL1xuICBnZXQgb25EZXZpY2VCYWNrQnV0dG9uKCkge1xuICAgIHJldHVybiB0aGlzLl9iYWNrQnV0dG9uSGFuZGxlcjtcbiAgfVxuXG4gIHNldCBvbkRldmljZUJhY2tCdXR0b24oY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5fYmFja0J1dHRvbkhhbmRsZXIpIHtcbiAgICAgIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICB0aGlzLl9iYWNrQnV0dG9uSGFuZGxlciA9IGRldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyLmNyZWF0ZUhhbmRsZXIodGhpcywgY2FsbGJhY2spO1xuICB9XG5cbiAgZ2V0IHNjcm9sbFRvcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICB9XG5cbiAgc2V0IHNjcm9sbFRvcChuZXdWYWx1ZSkge1xuICAgIHRoaXMuX2NvbnRlbnRFbGVtZW50LnNjcm9sbFRvcCA9IG5ld1ZhbHVlO1xuICB9XG5cbiAgX2dldENvbnRlbnRFbGVtZW50KCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHV0aWwuZmluZENoaWxkKHRoaXMsICcucGFnZV9fY29udGVudCcpO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHV0aWwudGhyb3coJ0ZhaWwgdG8gZ2V0IFwiLnBhZ2VfX2NvbnRlbnRcIiBlbGVtZW50Jyk7XG4gIH1cblxuICBfZ2V0QmFja2dyb3VuZEVsZW1lbnQoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wYWdlX19iYWNrZ3JvdW5kJyk7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdXRpbC50aHJvdygnRmFpbCB0byBnZXQgXCIucGFnZV9fYmFja2dyb3VuZFwiIGVsZW1lbnQnKTtcbiAgfVxuXG4gIF9nZXRCb3R0b21Ub29sYmFyRWxlbWVudCgpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJ29ucy1ib3R0b20tdG9vbGJhcicpIHx8IGludGVybmFsLm51bGxFbGVtZW50O1xuICB9XG5cbiAgX2dldFRvb2xiYXJFbGVtZW50KCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnb25zLXRvb2xiYXInKSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvbnMtdG9vbGJhcicpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsnbW9kaWZpZXInLCAnb24taW5maW5pdGUtc2Nyb2xsJywgJ2NsYXNzJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnY2xhc3MnOlxuICAgICAgICB1dGlsLnJlc3RvcmVDbGFzcyh0aGlzLCB0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vZGlmaWVyJzpcbiAgICAgICAgTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnb24taW5maW5pdGUtc2Nyb2xsJzpcbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLm9uSW5maW5pdGVTY3JvbGwgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub25JbmZpbml0ZVNjcm9sbCA9IChkb25lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmID0gdXRpbC5maW5kRnJvbVBhdGgoY3VycmVudCk7XG4gICAgICAgICAgICB0aGlzLm9uSW5maW5pdGVTY3JvbGwgPSBmO1xuICAgICAgICAgICAgZihkb25lKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIF9zaG93KCkge1xuICAgIGlmICghdGhpcy5faXNTaG93biAmJiB1dGlsLmlzQXR0YWNoZWQodGhpcykpIHtcbiAgICAgIHRoaXMuX2lzU2hvd24gPSB0cnVlO1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nob3duJywgJycpO1xuICAgICAgdGhpcy5vblNob3cgJiYgdGhpcy5vblNob3coKTtcbiAgICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAnc2hvdycpO1xuICAgICAgdXRpbC5wcm9wYWdhdGVBY3Rpb24odGhpcywgJ19zaG93Jyk7XG4gICAgfVxuICB9XG5cbiAgX2hpZGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24pIHtcbiAgICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdzaG93bicpO1xuICAgICAgdGhpcy5vbkhpZGUgJiYgdGhpcy5vbkhpZGUoKTtcbiAgICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAnaGlkZScpO1xuICAgICAgdXRpbC5wcm9wYWdhdGVBY3Rpb24odGhpcywgJ19oaWRlJyk7XG4gICAgfVxuICB9XG5cbiAgX2Rlc3Ryb3koKSB7XG4gICAgdGhpcy5faGlkZSgpO1xuXG4gICAgdGhpcy5vbkRlc3Ryb3kgJiYgdGhpcy5vbkRlc3Ryb3koKTtcbiAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ2Rlc3Ryb3knKTtcblxuICAgIGlmICh0aGlzLm9uRGV2aWNlQmFja0J1dHRvbikge1xuICAgICAgdGhpcy5vbkRldmljZUJhY2tCdXR0b24uZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHV0aWwucHJvcGFnYXRlQWN0aW9uKHRoaXMsICdfZGVzdHJveScpO1xuXG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgfVxuXG4gIF9kZXJpdmVIb29rcygpIHtcbiAgICB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50cy5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGtleSA9ICdvbicgKyBldmVudC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGV2ZW50LnNsaWNlKDEpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGtleSwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gdGhpc1tgXyR7a2V5fWBdLFxuICAgICAgICBzZXQ6IHZhbHVlID0+IHtcbiAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSkge1xuICAgICAgICAgICAgdXRpbC50aHJvdyhgXCIke2tleX1cIiBob29rIG11c3QgYmUgYSBmdW5jdGlvbmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzW2BfJHtrZXl9YF0gPSB2YWx1ZS5iaW5kKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZXZlbnRzKCkge1xuICAgIHJldHVybiBbJ2luaXQnLCAnc2hvdycsICdoaWRlJywgJ2Rlc3Ryb3knXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGF0YVxuICAgKiBAdHlwZSB7Kn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVVzZXIncyBjdXN0b20gZGF0YSBwYXNzZWQgdG8gYHB1c2hQYWdlKClgLWxpa2UgbWV0aG9kcy5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbn1cblxub25zRWxlbWVudHMuUGFnZSA9IFBhZ2VFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtcGFnZScsIFBhZ2VFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5pbXBvcnQgdXRpbCBmcm9tICcuLi8uLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IEJhc2VBbmltYXRvciBmcm9tICcuLi8uLi9vbnMvYmFzZS1hbmltYXRvci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBQb3BvdmVyQW5pbWF0b3IgZXh0ZW5kcyBCYXNlQW5pbWF0b3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy50aW1pbmdcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZHVyYXRpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZGVsYXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnY3ViaWMtYmV6aWVyKC4xLCAuNywgLjQsIDEpJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMn0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG4gIH1cblxuICBzaG93KHBvcG92ZXIsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIGhpZGUocG9wb3ZlciwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgX2FuaW1hdGUoZWxlbWVudCwge2Zyb20sIHRvLCBvcHRpb25zLCBjYWxsYmFjaywgcmVzdG9yZSA9IGZhbHNlLCBhbmltYXRpb259KSB7XG4gICAgb3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKGFuaW1hdGlvbikge1xuICAgICAgZnJvbSA9IGFuaW1hdGlvbi5mcm9tO1xuICAgICAgdG8gPSBhbmltYXRpb24udG87XG4gICAgfVxuXG4gICAgYW5pbWF0aW9uID0gYW5pbWl0KGVsZW1lbnQpO1xuICAgIGlmIChyZXN0b3JlKSB7XG4gICAgICBhbmltYXRpb24gPSBhbmltYXRpb24uc2F2ZVN0eWxlKCk7XG4gICAgfVxuICAgIGFuaW1hdGlvbiA9IGFuaW1hdGlvbi5xdWV1ZShmcm9tKS53YWl0KHRoaXMuZGVsYXkpLnF1ZXVlKHtcbiAgICAgIGNzczogdG8sXG4gICAgICBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbixcbiAgICAgIHRpbWluZzogdGhpcy50aW1pbmdcbiAgICB9KTtcbiAgICBpZiAocmVzdG9yZSkge1xuICAgICAgYW5pbWF0aW9uID0gYW5pbWF0aW9uLnJlc3RvcmVTdHlsZSgpO1xuICAgIH1cbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgIGFuaW1hdGlvbiA9IGFuaW1hdGlvbi5xdWV1ZSgoZG9uZSkgPT4ge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGFuaW1hdGlvbjtcbiAgfVxuXG4gIF9hbmltYXRlQWxsKGVsZW1lbnQsIGFuaW1hdGlvbnMpIHtcbiAgICBPYmplY3Qua2V5cyhhbmltYXRpb25zKS5mb3JFYWNoKGtleSA9PiB0aGlzLl9hbmltYXRlKGVsZW1lbnRba2V5XSwgYW5pbWF0aW9uc1trZXldKS5wbGF5KCkpO1xuICB9XG5cbn1cblxuY29uc3QgZmFkZSA9IHtcbiAgb3V0OiB7XG4gICAgZnJvbToge29wYWNpdHk6IDEuMH0sXG4gICAgdG86IHtvcGFjaXR5OiAwfVxuICB9LFxuICBpbjoge1xuICAgIGZyb206IHtvcGFjaXR5OiAwfSxcbiAgICB0bzoge29wYWNpdHk6IDEuMH1cbiAgfVxufTtcblxuZXhwb3J0IGNsYXNzIE1ERmFkZVBvcG92ZXJBbmltYXRvciBleHRlbmRzIFBvcG92ZXJBbmltYXRvciB7XG4gIHNob3cocG9wb3ZlciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLl9hbmltYXRlQWxsKHBvcG92ZXIsIHtcbiAgICAgIF9tYXNrOiBmYWRlLmluLFxuICAgICAgX3BvcG92ZXI6IHthbmltYXRpb246IGZhZGUuaW4sIHJlc3RvcmU6IHRydWUsIGNhbGxiYWNrfVxuICAgIH0pO1xuICB9XG5cbiAgaGlkZShwb3BvdmVyLCBjYWxsYmFjaykge1xuICAgIHRoaXMuX2FuaW1hdGVBbGwocG9wb3Zlciwge1xuICAgICAgX21hc2s6IGZhZGUub3V0LFxuICAgICAgX3BvcG92ZXI6IHthbmltYXRpb246IGZhZGUub3V0LCByZXN0b3JlOiB0cnVlLCBjYWxsYmFja31cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSU9TRmFkZVBvcG92ZXJBbmltYXRvciBleHRlbmRzIE1ERmFkZVBvcG92ZXJBbmltYXRvciB7XG4gIHNob3cocG9wb3ZlciwgY2FsbGJhY2spIHtcbiAgICB0aGlzLl9hbmltYXRlQWxsKHBvcG92ZXIsIHtcbiAgICAgIF9tYXNrOiBmYWRlLmluLFxuICAgICAgX3BvcG92ZXI6IHtcbiAgICAgICAgZnJvbToge1xuICAgICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlM2QoMS4zLCAxLjMsIDEuMCknLFxuICAgICAgICAgIG9wYWNpdHk6IDBcbiAgICAgICAgfSxcbiAgICAgICAgdG86IHtcbiAgICAgICAgICB0cmFuc2Zvcm06ICdzY2FsZTNkKDEuMCwgMS4wLCAgMS4wKScsXG4gICAgICAgICAgb3BhY2l0eTogMS4wXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3RvcmU6IHRydWUsXG4gICAgICAgIGNhbGxiYWNrXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEFuaW1hdG9yRmFjdG9yeSBmcm9tICcuLi9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyc7XG5pbXBvcnQgeyBQb3BvdmVyQW5pbWF0b3IsIElPU0ZhZGVQb3BvdmVyQW5pbWF0b3IsIE1ERmFkZVBvcG92ZXJBbmltYXRvciB9IGZyb20gJy4vb25zLXBvcG92ZXIvYW5pbWF0b3IuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL29ucy9wbGF0Zm9ybS5qcyc7XG5pbXBvcnQgaVBob25lWFBhdGNoIGZyb20gJy4uL29ucy9pcGhvbmV4LXBhdGNoLmpzJztcbmltcG9ydCBCYXNlRGlhbG9nRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1kaWFsb2cuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJy5wb3BvdmVyJzogJ3BvcG92ZXItLSonLFxuICAnLnBvcG92ZXItbWFzayc6ICdwb3BvdmVyLW1hc2stLSonLFxuICAnLnBvcG92ZXJfX2NvbnRlbnQnOiAncG9wb3Zlci0tKl9fY29udGVudCcsXG4gICcucG9wb3Zlcl9fYXJyb3cnOiAncG9wb3Zlci0tKl9fYXJyb3cnXG59O1xuXG5jb25zdCBfYW5pbWF0b3JEaWN0ID0ge1xuICAnZGVmYXVsdCc6IGZ1bmN0aW9uKCkgeyByZXR1cm4gcGxhdGZvcm0uaXNBbmRyb2lkKCkgPyBNREZhZGVQb3BvdmVyQW5pbWF0b3IgOiBJT1NGYWRlUG9wb3ZlckFuaW1hdG9yOyB9LFxuICAnbm9uZSc6IFBvcG92ZXJBbmltYXRvcixcbiAgJ2ZhZGUtaW9zJzogSU9TRmFkZVBvcG92ZXJBbmltYXRvcixcbiAgJ2ZhZGUtbWQnOiBNREZhZGVQb3BvdmVyQW5pbWF0b3Jcbn07XG5cbmNvbnN0IHBvc2l0aW9ucyA9IHtcbiAgdXA6ICdib3R0b20nLFxuICBsZWZ0OiAncmlnaHQnLFxuICBkb3duOiAndG9wJyxcbiAgcmlnaHQ6ICdsZWZ0J1xufTtcblxuY29uc3QgZGlyZWN0aW9ucyA9IE9iamVjdC5rZXlzKHBvc2l0aW9ucyk7XG4vKipcbiAqIEBlbGVtZW50IG9ucy1wb3BvdmVyXG4gKiBAY2F0ZWdvcnkgZGlhbG9nXG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dXG4gKiAgICBBIGNvbXBvbmVudCB0aGF0IGRpc3BsYXlzIGEgcG9wb3ZlciBuZXh0IHRvIGFuIGVsZW1lbnQuIFRoZSBwb3BvdmVyIGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgZXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgYSBjb21wb25lbnQgb3IgYSB0b29sdGlwLlxuICpcbiAqICAgIFRvIHVzZSB0aGUgZWxlbWVudCBpdCBjYW4gZWl0aGVyIGJlIGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBgPGJvZHk+YCBlbGVtZW50IG9yIGR5bmFtaWNhbGx5IGNyZWF0ZWQgZnJvbSBhIHRlbXBsYXRlIHVzaW5nIHRoZSBgb25zLmNyZWF0ZVBvcG92ZXIodGVtcGxhdGUpYCB1dGlsaXR5IGZ1bmN0aW9uIGFuZCB0aGUgYDx0ZW1wbGF0ZT5gIHRhZy5cbiAqXG4gKiAgICBBbm90aGVyIGNvbW1vbiB3YXkgdG8gdXNlIHRoZSBwb3BvdmVyIGlzIHRvIGRpc3BsYXkgYSBtZW51IHdoZW4gYSBidXR0b24gb24gdGhlIHNjcmVlbiBpcyB0YXBwZWQuIEZvciBNYXRlcmlhbCBEZXNpZ24sIHBvcG92ZXIgbG9va3MgZXhhY3RseSBhcyBhIGRyb3Bkb3duIG1lbnUuXG4gKiAgWy9lbl1cbiAqICBbamFd44GC44KL6KaB57Sg44KS5a++6LGh44Go44GZ44KL44Od44OD44OX44Kq44O844OQ44O844KS6KGo56S644GZ44KL44Kz44Oz44Od44O844ON44Oz44OI44Gn44GZ44CCWy9qYV1cbiAqIEBjb2RlcGVuIFpZWVJLb1xuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3BvcG92ZXJcbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjbW9kaWZpZXJzIFtlbl1Nb3JlIGRldGFpbHMgYWJvdXQgdGhlIGBtb2RpZmllcmAgYXR0cmlidXRlWy9lbl1bamFdbW9kaWZpZXLlsZ7mgKfjga7kvb/jgYTmlrlbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtYnV0dG9uIG9uY2xpY2s9XCJzaG93UG9wb3Zlcih0aGlzKVwiPlxuICogICBDbGljayBtZSFcbiAqIDwvb25zLWJ1dHRvbj5cbiAqXG4gKiA8b25zLXBvcG92ZXIgZGlyZWN0aW9uPVwiZG93blwiIGlkPVwicG9wb3ZlclwiPlxuICogICA8cD5UaGlzIGlzIGEgcG9wb3ZlciE8L3A+XG4gKiA8L29ucy1wb3BvdmVyPlxuICpcbiAqIDxzY3JpcHQ+XG4gKiAgIHZhciBzaG93UG9wb3ZlciA9IGZ1bmN0aW9uKGVsZW1lbnQpIHtcbiAqICAgICB2YXIgcG9wb3ZlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwb3BvdmVyJyk7XG4gKiAgICAgcG9wb3Zlci5zaG93KGVsZW1lbnQpO1xuICogICB9O1xuICogPC9zY3JpcHQ+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvcG92ZXJFbGVtZW50IGV4dGVuZHMgQmFzZURpYWxvZ0VsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHJlc2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBiZWZvcmUgdGhlIHBvcG92ZXIgaXMgZGlzcGxheWVkLlsvZW5dXG4gICAqICAgW2phXeODneODg+ODl+OCquODvOODkOODvOOBjOihqOekuuOBleOCjOOCi+ebtOWJjeOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5wb3BvdmVyXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUNhbGwgdGhpcyBmdW5jdGlvbiB0byBzdG9wIHRoZSBwb3BvdmVyIGZyb20gYmVpbmcgc2hvd24uWy9lbl1cbiAgICogICBbamFd44GT44Gu6Zai5pWw44KS5ZG844Gz5Ye644GZ44Go44CB44Od44OD44OX44Kq44O844OQ44O844Gu6KGo56S644GM44Kt44Oj44Oz44K744Or44GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBwb3N0c2hvd1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBhZnRlciB0aGUgcG9wb3ZlciBpcyBkaXNwbGF5ZWQuWy9lbl1cbiAgICogICBbamFd44Od44OD44OX44Kq44O844OQ44O844GM6KGo56S644GV44KM44Gf55u05b6M44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnBvcG92ZXJcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHByZWhpZGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYmVmb3JlIHRoZSBwb3BvdmVyIGlzIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jg53jg4Pjg5fjgqrjg7zjg5Djg7zjgYzpmqDjgozjgovnm7TliY3jgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQucG9wb3ZlclxuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNhbmNlbFxuICAgKiAgIFtlbl1DYWxsIHRoaXMgZnVuY3Rpb24gdG8gc3RvcCB0aGUgcG9wb3ZlciBmcm9tIGJlaW5nIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7plqLmlbDjgpLlkbzjgbPlh7rjgZnjgajjgIHjg53jg4Pjg5fjgqrjg7zjg5Djg7zjgYzpmqDjgozjgovlh6bnkIbjgpLjgq3jg6Pjg7Pjgrvjg6vjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3RoaWRlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGFmdGVyIHRoZSBwb3BvdmVyIGlzIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jg53jg4Pjg5fjgqrjg7zjg5Djg7zjgYzpmqDjgozjgZ/lvozjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQucG9wb3ZlclxuICAgKiAgIFtlbl1Db21wb25lbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgZGlhbG9nY2FuY2VsXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBbZW5dRmlyZWQgd2hlbiB0aGUgcG9wb3ZlciBpcyBjYW5jZWxlZC5bL2VuXVxuICAgKiBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbW9kaWZpZXJcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHBvcG92ZXIuWy9lbl1cbiAgICogIFtqYV3jg53jg4Pjg5fjgqrjg7zjg5Djg7zjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXJlY3Rpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dXG4gICAqICAgIEEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgZGlyZWN0aW9ucy4gSWYgbW9yZSB0aGFuIG9uZSBkaXJlY3Rpb24gaXMgc3BlY2lmaWVkLFxuICAgKiAgICBpdCB3aWxsIGJlIGNob3NlbiBhdXRvbWF0aWNhbGx5LiBWYWxpZCBkaXJlY3Rpb25zIGFyZSBgXCJ1cFwiYCwgYFwiZG93blwiYCwgYFwibGVmdFwiYCBhbmQgYFwicmlnaHRcImAuXG4gICAqICBbL2VuXVxuICAgKiAgW2phXVxuICAgKiAgICDjg53jg4Pjg5fjgqrjg7zjg5Djg7zjgpLooajnpLrjgZnjgovmlrnlkJHjgpLnqbrnmb3ljLrliIfjgorjgafopIfmlbDmjIflrprjgafjgY3jgb7jgZnjgIJcbiAgICogICAg5oyH5a6a44Gn44GN44KL5pa55ZCR44Gv44CBXCJ1cFwiLCBcImRvd25cIiwgXCJsZWZ0XCIsIFwicmlnaHRcIuOBrjTjgaTjgafjgZnjgILnqbrnmb3ljLrliIfjgorjgafopIfmlbDmjIflrprjgZnjgovjgZPjgajjgoLjgafjgY3jgb7jgZnjgIJcbiAgICogICAg6KSH5pWw5oyH5a6a44GV44KM44Gf5aC05ZCI44CB5a++6LGh44Go44GZ44KL6KaB57Sg44Gr5ZCI44KP44Gb44Gm5oyH5a6a44GX44Gf5YCk44GL44KJ6Ieq5YuV55qE44Gr6YG45oqe44GV44KM44G+44GZ44CCXG4gICAqICBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBjYW5jZWxhYmxlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIHBvcG92ZXIgY2FuIGJlIGNsb3NlZCBieSB0YXBwaW5nIHRoZSBiYWNrZ3JvdW5kIG9yIGJ5IHByZXNzaW5nIHRoZSBiYWNrIGJ1dHRvbi5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovjgajjgIHjg53jg4Pjg5fjgqrjg7zjg5Djg7zjgYzooajnpLrjgZXjgozjgZ/mmYLjgavjgIHog4zmma/jgoTjg5Djg4Pjgq/jg5zjgr/jg7PjgpLjgr/jg4Pjg5fjgZfjgZ/mmYLjgavjgpLjg53jg4Pjg5fjgqrjg7zjg5Djg7zplonjgZjjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBjb3Zlci10YXJnZXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHNldCB0aGUgcG9wb3ZlciB3aWxsIGNvdmVyIHRoZSB0YXJnZXQgb24gdGhlIHNjcmVlbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGNvdmVyVGFyZ2V0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiBzZXQgdGhlIHBvcG92ZXIgd2lsbCBjb3ZlciB0aGUgdGFyZ2V0IG9uIHRoZSBzY3JlZW4uWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgYW5pbWF0aW9uIHVzZWQgd2hlbiBzaG93aW5nIGFuIGhpZGluZyB0aGUgcG9wb3Zlci4gQ2FuIGJlIGVpdGhlciBgXCJub25lXCJgLCBgXCJkZWZhdWx0XCJgLCBgXCJmYWRlLWlvc1wiYCBvciBgXCJmYWRlLW1kXCJgLlsvZW5dXG4gICAqICAgW2phXeODneODg+ODl+OCquODvOODkOODvOOCkuihqOekuuOBmeOCi+mam+OBruOCouODi+ODoeODvOOCt+ODp+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvbi1vcHRpb25zXG4gICAqIEB0eXBlIHtFeHByZXNzaW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgdGltaW5nIGFuZCBkZWxheSB3aXRoIGFuIG9iamVjdCBsaXRlcmFsLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFuaW1hdGlvbk9wdGlvbnNcbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAguS+i++8mntkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgbWFzay1jb2xvclxuICAgKiBAdHlwZSB7Q29sb3J9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Db2xvciBvZiB0aGUgYmFja2dyb3VuZCBtYXNrLiBEZWZhdWx0IGlzIGBcInJnYmEoMCwgMCwgMCwgMC4yKVwiYC5bL2VuXVxuICAgKiAgIFtqYV3og4zmma/jga7jg57jgrnjgq/jga7oibLjgpLmjIflrprjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjga9cInJnYmEoMCwgMCwgMCwgMC4yKVwi44Gn44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdmlzaWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIHBvcG92ZXIgaXMgdmlzaWJsZSBvciBub3QuWy9lbl1cbiAgICogICBbamFd6KaB57Sg44GM6KaL44GI44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2JvdW5kT25DaGFuZ2UgPSB0aGlzLl9vbkNoYW5nZS5iaW5kKHRoaXMpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBfc2NoZW1lKCkge1xuICAgIHJldHVybiBzY2hlbWU7XG4gIH1cblxuICBnZXQgX21hc2soKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICcucG9wb3Zlci1tYXNrJyk7XG4gIH1cblxuICBnZXQgX3BvcG92ZXIoKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICcucG9wb3ZlcicpO1xuICB9XG5cbiAgZ2V0IF9jb250ZW50KCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLl9wb3BvdmVyLCAnLnBvcG92ZXJfX2NvbnRlbnQnKTtcbiAgfVxuXG4gIGdldCBfYXJyb3coKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMuX3BvcG92ZXIsICcucG9wb3Zlcl9fYXJyb3cnKTtcbiAgfVxuXG4gIF91cGRhdGVBbmltYXRvckZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIG5ldyBBbmltYXRvckZhY3Rvcnkoe1xuICAgICAgYW5pbWF0b3JzOiBfYW5pbWF0b3JEaWN0LFxuICAgICAgYmFzZUNsYXNzOiBQb3BvdmVyQW5pbWF0b3IsXG4gICAgICBiYXNlQ2xhc3NOYW1lOiAnUG9wb3ZlckFuaW1hdG9yJyxcbiAgICAgIGRlZmF1bHRBbmltYXRpb246IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKSB8fCAnZGVmYXVsdCdcbiAgICB9KTtcbiAgfVxuXG4gIF90b2dnbGVTdHlsZShzaG91bGRTaG93LCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoc2hvdWxkU2hvdykge1xuICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHRoaXMuX2N1cnJlbnRUYXJnZXQgPSBvcHRpb25zLnRhcmdldDtcbiAgICAgIHRoaXMuX3Bvc2l0aW9uUG9wb3ZlcihvcHRpb25zLnRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHRoaXMuX2NsZWFyU3R5bGVzKCk7XG4gICAgfVxuICB9XG5cbiAgX3Bvc2l0aW9uUG9wb3Zlcih0YXJnZXQpIHtcbiAgICBjb25zdCB7X3JhZGl1czogcmFkaXVzLCBfY29udGVudDogY29udGVudEVsZW1lbnQsIF9tYXJnaW46IG1hcmdpbn0gPSB0aGlzO1xuICAgIGNvbnN0IHNhZmVBcmVhTGVuZ3RocyA9IGlQaG9uZVhQYXRjaC5nZXRTYWZlQXJlYUxlbmd0aHMoKTtcbiAgICBjb25zdCBzYWZlQXJlYVJlY3QgPSBpUGhvbmVYUGF0Y2guZ2V0U2FmZUFyZWFET01SZWN0KCk7XG4gICAgY29uc3QgdGFyZ2V0UmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBpc01EID0gdXRpbC5oYXNNb2RpZmllcih0aGlzLCAnbWF0ZXJpYWwnKTtcbiAgICBjb25zdCBjb3ZlciA9IGlzTUQgJiYgdGhpcy5oYXNBdHRyaWJ1dGUoJ2NvdmVyLXRhcmdldCcpO1xuICAgIGNvbnN0IHBhcmVudCA9IHV0aWwuZmluZFBhcmVudCh0aGlzLCAnb25zLXBhZ2UnKSB8fCBkb2N1bWVudC5ib2R5O1xuICAgIGNvbnN0IHBhcmVudERpbWVuc2lvbnMgPSBwYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbWF4UG9zaXRpb25zID0ge1xuICAgICAgdG9wOiBNYXRoLm1heChwYXJlbnREaW1lbnNpb25zLnRvcCwgc2FmZUFyZWFSZWN0LnRvcCksXG4gICAgICBsZWZ0OiBNYXRoLm1heChwYXJlbnREaW1lbnNpb25zLmxlZnQsIHNhZmVBcmVhUmVjdC5sZWZ0KSxcbiAgICAgIGJvdHRvbTogTWF0aC5taW4ocGFyZW50RGltZW5zaW9ucy5ib3R0b20sIHNhZmVBcmVhUmVjdC5ib3R0b20pLFxuICAgICAgcmlnaHQ6IE1hdGgubWluKHBhcmVudERpbWVuc2lvbnMucmlnaHQsIHNhZmVBcmVhUmVjdC5yaWdodCksXG4gICAgfTtcblxuICAgIC8vIERpc3RhbmNlIGZyb20gZWFjaCBzaWRlIG9mIHRoZSBzYWZlIGFyZWEgKHdpdGggbWFyZ2luKSB0byB0aGUgdGFyZ2V0IGVsZW1lbnRcbiAgICBjb25zdCB0YXJnZXREaXN0YW5jZSA9IHtcbiAgICAgIHRvcDogdGFyZ2V0UmVjdC50b3AgLSAobWF4UG9zaXRpb25zLnRvcCArIG1hcmdpbiksXG4gICAgICBsZWZ0OiB0YXJnZXRSZWN0LmxlZnQgLSAobWF4UG9zaXRpb25zLmxlZnQgKyBtYXJnaW4pLFxuICAgICAgYm90dG9tOiAobWF4UG9zaXRpb25zLmJvdHRvbSAtIG1hcmdpbikgLSB0YXJnZXRSZWN0LmJvdHRvbSxcbiAgICAgIHJpZ2h0OiAobWF4UG9zaXRpb25zLnJpZ2h0IC0gbWFyZ2luKSAtIHRhcmdldFJlY3QucmlnaHRcbiAgICB9O1xuXG4gICAgLy8gRGlzdGFuY2UgZnJvbSBlYWNoIHNpZGUgb2YgdGhlIHNhZmUgYXJlYSAod2l0aCBtYXJnaW4pIHRvIHRoZSBnZW9tZXRyaWMgY2VudGVyIG9mIHRoZSB0YXJnZXQgZWxlbWVudFxuICAgIGNvbnN0IHRhcmdldENlbnRlckRpc3RhbmNlRnJvbSA9IHtcbiAgICAgIHRvcDogdGFyZ2V0UmVjdC50b3AgKyBNYXRoLnJvdW5kKHRhcmdldFJlY3QuaGVpZ2h0IC8gMikgLSAobWF4UG9zaXRpb25zLnRvcCArIG1hcmdpbiksXG4gICAgICBsZWZ0OiB0YXJnZXRSZWN0LmxlZnQgKyBNYXRoLnJvdW5kKHRhcmdldFJlY3Qud2lkdGggLyAyKSAtIChtYXhQb3NpdGlvbnMubGVmdCArIG1hcmdpbiksXG4gICAgICBib3R0b206IChtYXhQb3NpdGlvbnMuYm90dG9tIC0gbWFyZ2luKSAtIHRhcmdldFJlY3QuYm90dG9tICsgTWF0aC5yb3VuZCh0YXJnZXRSZWN0LmhlaWdodCAvIDIpLFxuICAgICAgcmlnaHQ6IChtYXhQb3NpdGlvbnMucmlnaHQgLSBtYXJnaW4pIC0gdGFyZ2V0UmVjdC5yaWdodCArIE1hdGgucm91bmQodGFyZ2V0UmVjdC53aWR0aCAvIDIpXG4gICAgfTtcblxuICAgIGNvbnN0IHt2ZXJ0aWNhbCwgcHJpbWFyeTogcHJpbWFyeURpcmVjdGlvbiwgc2Vjb25kYXJ5OiBzZWNvbmRhcnlEaXJlY3Rpb259ID0gdGhpcy5fY2FsY3VsYXRlRGlyZWN0aW9ucyh0YXJnZXREaXN0YW5jZSk7XG4gICAgdGhpcy5fY3VycmVudERpcmVjdGlvbiA9IHByaW1hcnlEaXJlY3Rpb247XG4gICAgdXRpbC5hZGRNb2RpZmllcih0aGlzLCBwcmltYXJ5RGlyZWN0aW9uKTtcblxuICAgIGNvbnN0IHNpemVOYW1lID0gdmVydGljYWwgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG4gICAgLy8gR2V0IC5wb3BvdmVyX19jb250ZW50IHNpemVcbiAgICBjb25zdCBjb250ZW50U2l6ZSA9IChzdHlsZSA9PiAoe1xuICAgICAgd2lkdGg6IHBhcnNlSW50KHN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3dpZHRoJyksIDEwKSxcbiAgICAgIGhlaWdodDogcGFyc2VJbnQoc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0JyksIDEwKVxuICAgIH0pKSh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjb250ZW50RWxlbWVudCkpO1xuXG4gICAgLy8gU2V0dGluZyAucG9wb3ZlciBwb3NpdGlvbi5cbiAgICBjb25zdCB0YXJnZXRBbmRBcnJvd0xlbmd0aCA9IGNvdmVyID8gMCA6ICh2ZXJ0aWNhbCA/IHRhcmdldFJlY3QuaGVpZ2h0IDogdGFyZ2V0UmVjdC53aWR0aCkgKyAoaXNNRCA/IDAgOiAxNCk7XG4gICAgY29uc3QgcHJpbWFyeU9mZnNldCA9IE1hdGgubWF4KFxuICAgICAgc2FmZUFyZWFMZW5ndGhzW3ByaW1hcnlEaXJlY3Rpb25dICsgbWFyZ2luLFxuICAgICAgc2FmZUFyZWFMZW5ndGhzW3ByaW1hcnlEaXJlY3Rpb25dICsgbWFyZ2luICsgdGFyZ2V0RGlzdGFuY2VbcHJpbWFyeURpcmVjdGlvbl0gKyB0YXJnZXRBbmRBcnJvd0xlbmd0aFxuICAgICk7XG4gICAgY29uc3Qgc2Vjb25kYXJ5T2Zmc2V0ID0gTWF0aC5tYXgoXG4gICAgICBzYWZlQXJlYUxlbmd0aHNbc2Vjb25kYXJ5RGlyZWN0aW9uXSArIG1hcmdpbixcbiAgICAgIHNhZmVBcmVhTGVuZ3Roc1tzZWNvbmRhcnlEaXJlY3Rpb25dICsgbWFyZ2luICsgdGFyZ2V0Q2VudGVyRGlzdGFuY2VGcm9tW3NlY29uZGFyeURpcmVjdGlvbl0gLSAoY29udGVudFNpemVbc2l6ZU5hbWVdIC8gMilcbiAgICApO1xuICAgIHRoaXMuX3BvcG92ZXIuc3R5bGVbcHJpbWFyeURpcmVjdGlvbl0gPSBwcmltYXJ5T2Zmc2V0ICsgJ3B4JztcbiAgICB0aGlzLl9wb3BvdmVyLnN0eWxlW3NlY29uZGFyeURpcmVjdGlvbl0gPSBzZWNvbmRhcnlPZmZzZXQgKyAncHgnO1xuXG4gICAgLy8gU2V0dGluZyAucG9wb3Zlcl9fYXJyb3cgcG9zaXRpb24uXG4gICAgdGhpcy5fYXJyb3cuc3R5bGVbc2Vjb25kYXJ5RGlyZWN0aW9uXSA9IE1hdGgubWF4KFxuICAgICAgcmFkaXVzLFxuICAgICAgKHNhZmVBcmVhTGVuZ3Roc1tzZWNvbmRhcnlEaXJlY3Rpb25dICsgbWFyZ2luKSArIHRhcmdldENlbnRlckRpc3RhbmNlRnJvbVtzZWNvbmRhcnlEaXJlY3Rpb25dIC0gc2Vjb25kYXJ5T2Zmc2V0XG4gICAgKSArICdweCc7XG4gIH1cblxuICBfY2FsY3VsYXRlRGlyZWN0aW9ucyhkaXN0YW5jZSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSAodGhpcy5nZXRBdHRyaWJ1dGUoJ2RpcmVjdGlvbicpIHx8ICd1cCBkb3duIGxlZnQgcmlnaHQnKS5zcGxpdCgvXFxzKy8pLm1hcChlID0+IHBvc2l0aW9uc1tlXSk7XG4gICAgY29uc3QgcHJpbWFyeSA9IG9wdGlvbnMuc29ydCgoYSwgYikgPT4gZGlzdGFuY2VbYV0gLSBkaXN0YW5jZVtiXSlbMF07XG4gICAgY29uc3QgdmVydGljYWwgPSAndG9wJyA9PSBwcmltYXJ5IHx8ICdib3R0b20nID09IHByaW1hcnk7XG4gICAgbGV0IHNlY29uZGFyeTtcblxuICAgIGlmICh2ZXJ0aWNhbCkge1xuICAgICAgc2Vjb25kYXJ5ID0gZGlzdGFuY2UubGVmdCA8IGRpc3RhbmNlLnJpZ2h0ID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICB9IGVsc2Uge1xuICAgICAgc2Vjb25kYXJ5ID0gZGlzdGFuY2UudG9wIDwgZGlzdGFuY2UuYm90dG9tID8gJ3RvcCcgOiAnYm90dG9tJztcbiAgICB9XG5cbiAgICByZXR1cm4ge3ZlcnRpY2FsLCBwcmltYXJ5LCBzZWNvbmRhcnl9O1xuICB9XG5cbiAgX2NsZWFyU3R5bGVzKCkge1xuICAgIHRoaXMuX2N1cnJlbnREaXJlY3Rpb24gPSBudWxsO1xuICAgIFsndG9wJywgJ2JvdHRvbScsICdsZWZ0JywgJ3JpZ2h0J10uZm9yRWFjaChlID0+IHtcbiAgICAgIHRoaXMuX2Fycm93LnN0eWxlW2VdID0gdGhpcy5fY29udGVudC5zdHlsZVtlXSA9IHRoaXMuX3BvcG92ZXIuc3R5bGVbZV0gPSAnJztcbiAgICAgIHV0aWwucmVtb3ZlTW9kaWZpZXIodGhpcywgZSk7XG4gICAgfSk7XG4gIH1cblxuICBfb25DaGFuZ2UoKSB7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uUG9wb3Zlcih0aGlzLl9jdXJyZW50VGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuXG4gICAgaWYgKHRoaXMuX3BvcG92ZXIgJiYgdGhpcy5fbWFzaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0RlZmF1bHRDb250YWluZXIgPSB0aGlzLl9wb3BvdmVyICYmIHRoaXMuX2NvbnRlbnQ7XG5cbiAgICBpZiAoaGFzRGVmYXVsdENvbnRhaW5lcikge1xuXG4gICAgICBpZiAoIXRoaXMuX21hc2spIHtcbiAgICAgICAgY29uc3QgbWFzayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBtYXNrLmNsYXNzTGlzdC5hZGQoJ3BvcG92ZXItbWFzaycpO1xuICAgICAgICB0aGlzLmluc2VydEJlZm9yZShtYXNrLCB0aGlzLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuX2Fycm93KSB7XG4gICAgICAgIGNvbnN0IGFycm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGFycm93LmNsYXNzTGlzdC5hZGQoJ3BvcG92ZXJfX2Fycm93Jyk7XG4gICAgICAgIHRoaXMuX3BvcG92ZXIuYXBwZW5kQ2hpbGQoYXJyb3cpO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcblxuICAgICAgY29uc3QgdGVtcGxhdGUgPSB1dGlsLmNyZWF0ZUZyYWdtZW50KGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInBvcG92ZXItbWFza1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9wb3ZlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3BvdmVyX19jb250ZW50XCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBvcG92ZXJfX2Fycm93XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYCk7XG4gICAgICBjb25zdCBjb250ZW50ID0gdGVtcGxhdGUucXVlcnlTZWxlY3RvcignLnBvcG92ZXJfX2NvbnRlbnQnKTtcblxuICAgICAgd2hpbGUgKHRoaXMuY2hpbGROb2Rlc1swXSkge1xuICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKHRoaXMuY2hpbGROb2Rlc1swXSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGVtcGxhdGUpO1xuICAgIH1cblxuICAgIC8vIEZJWE1FIVxuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnc3R5bGUnKSkge1xuICAgICAgdGhpcy5fcG9wb3Zlci5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgdGhpcy5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykpO1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgfVxuXG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCB0aGlzLl9zY2hlbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2hvd1xuICAgKiBAc2lnbmF0dXJlIHNob3codGFyZ2V0LCBbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7U3RyaW5nfEV2ZW50fEhUTUxFbGVtZW50fSB0YXJnZXRcbiAgICogICBbZW5dVGFyZ2V0IGVsZW1lbnQuIENhbiBiZSBlaXRoZXIgYSBDU1Mgc2VsZWN0b3IsIGFuIGV2ZW50IG9iamVjdCBvciBhIERPTSBlbGVtZW50LiBJdCBjYW4gYmUgYWxzbyBwcm92aWRlZCBhcyAnb3B0aW9ucy50YXJnZXQnIGluc3RlYWQuIFsvZW5dXG4gICAqICAgW2phXeODneODg+ODl+OCquODvOODkOODvOOBruOCv+ODvOOCsuODg+ODiOOBqOOBquOCi+imgee0oOOCkuaMh+WumuOBl+OBvuOBmeOAgkNTU+OCu+ODrOOCr+OCv+OBi2V2ZW5044Kq44OW44K444Kn44Kv44OI44GLRE9N6KaB57Sg44Gu44GE44Ga44KM44GL44KS5rih44Gb44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiAgVXNlIG9uZSBvZiBgXCJmYWRlLWlvc1wiYCwgYFwiZmFkZS1tZFwiYCwgYFwibm9uZVwiYCBhbmQgYFwiZGVmYXVsdFwiYC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJcImZhZGUtaW9zXCIsIFwiZmFkZS1tZFwiLCBcIm5vbmVcIiwgXCJkZWZhdWx0XCLjga7jgYTjgZrjgozjgYvjgpLmjIflrprjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCBkZWxheSwgdGltaW5n44KS5oyH5a6a44GX44G+44GZ44CCZS5nLiB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqICAgW2VuXVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBwb3BvdmVyIGhhcyBiZWVuIHJldmVhbGVkLlsvZW5dXG4gICAqICAgW2phXeODneODg+ODl+OCquODvOODkOODvOOBjOihqOekuuOBleOCjOe1guOCj+OBo+OBn+W+jOOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1PcGVuIHRoZSBwb3BvdmVyIGFuZCBwb2ludCBpdCBhdCBhIHRhcmdldC4gVGhlIHRhcmdldCBjYW4gYmUgZWl0aGVyIGFuIGV2ZW50LCBhIENTUyBzZWxlY3RvciBvciBhIERPTSBlbGVtZW50Li5bL2VuXVxuICAgKiAgIFtqYV3lr77osaHjgajjgZnjgovopoHntKDjgavjg53jg4Pjg5fjgqrjg7zjg5Djg7zjgpLooajnpLrjgZfjgb7jgZnjgIJ0YXJnZXTlvJXmlbDjgavjga/jgIEkZXZlbnTjgqrjg5bjgrjjgqfjgq/jg4jjgoRET03jgqjjg6zjg6Hjg7Pjg4jjgoRDU1Pjgrvjg6zjgq/jgr/jgpLmuKHjgZnjgZPjgajjgYzlh7rmnaXjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgZGlzcGxheWVkIGVsZW1lbnRbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgc2hvdyh0YXJnZXQsIG9wdGlvbnMgPSB7fSkge1xuICAgIC8vIENvcHkgb3B0aW9ucyBhbmQgaW5jbHVkZSBvcHRpb25zLnRhcmdldFxuICAgIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcgJiYgISh0YXJnZXQgaW5zdGFuY2VvZiBFdmVudCkgJiYgISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgIG9wdGlvbnMgPSB7IC4uLnRhcmdldCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0geyAuLi5vcHRpb25zLCB0YXJnZXQgfTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudGFyZ2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgb3B0aW9ucy50YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG9wdGlvbnMudGFyZ2V0KTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMudGFyZ2V0IGluc3RhbmNlb2YgRXZlbnQpIHtcbiAgICAgIG9wdGlvbnMudGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQudGFyZ2V0O1xuICAgIH1cblxuICAgIGlmICghKG9wdGlvbnMudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgIHV0aWwudGhyb3coJ0ludmFsaWQgdGFyZ2V0IHR5cGUgb3IgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLnNob3cob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBoaWRlXG4gICAqIEBzaWduYXR1cmUgaGlkZShbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1BbmltYXRpb24gbmFtZS4gIFVzZSBvbmUgb2YgYFwiZmFkZS1pb3NcImAsIGBcImZhZGUtbWRcImAsIGBcIm5vbmVcImAgYW5kIGBcImRlZmF1bHRcImAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5ZCN44KS5oyH5a6a44GX44G+44GZ44CCXCJmYWRlLWlvc1wiLCBcImZhZGUtbWRcIiwgXCJub25lXCIsIFwiZGVmYXVsdFwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1UaGlzIGZ1bmN0aW9ucyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHBvcG92ZXIgaGFzIGJlZW4gaGlkZGVuLlsvZW5dXG4gICAqICAgW2phXeODneODg+ODl+OCquODvOODkOODvOOBjOmaoOOCjOOBn+W+jOOBq+WRvOOBs+WHuuOBleOCjOOCi+mWouaVsOOCquODluOCuOOCp+OCr+ODiOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DbG9zZSB0aGUgcG9wb3Zlci5bL2VuXVxuICAgKiAgIFtqYV3jg53jg4Pjg5fjgqrjg7zjg5Djg7zjgpLplonjgZjjgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgaGlkZGVuIGVsZW1lbnRbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHZpc2libGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBlbGVtZW50IGlzIHZpc2libGUgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeimgee0oOOBjOimi+OBiOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgY2FuY2VsYWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgQSBib29sZWFuIHZhbHVlIHRoYXQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIHBvcG92ZXIgaXMgY2FuY2VsYWJsZSBvciBub3QuXG4gICAqXG4gICAqICAgICBXaGVuIHRoZSBwb3BvdmVyIGlzIGNhbmNlbGFibGUgaXQgY2FuIGJlIGNsb3NlZCBieSB0YXBwaW5nIHRoZSBiYWNrZ3JvdW5kIG9yIGJ5IHByZXNzaW5nIHRoZSBiYWNrIGJ1dHRvbiBvbiBBbmRyb2lkIGRldmljZXMuXG4gICAqICAgWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvbkRldmljZUJhY2tCdXR0b25cbiAgICogQHR5cGUge09iamVjdH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUJhY2stYnV0dG9uIGhhbmRsZXIuWy9lbl1cbiAgICogICBbamFd44OQ44OD44Kv44Oc44K/44Oz44OP44Oz44OJ44Op44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBtYXNrQ29sb3JcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlZmF1bHQgcmdiYSgwLCAwLCAwLCAwLjIpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kIG1hc2suIERlZmF1bHQgaXMgXCJyZ2JhKDAsIDAsIDAsIDAuMilcIi5bL2VuXVxuICAgKiAgW2phXeiDjOaZr+OBruODnuOCueOCr+OBruiJsuOCkuaMh+WumuOBl+OBvuOBmeOAglwicmdiYSgwLCAwLCAwLCAwLjIpXCLjgYzjg4fjg5Xjgqnjg6vjg4jlgKTjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX2JvdW5kT25DaGFuZ2UsIGZhbHNlKTtcbiAgICB0aGlzLl9tYXJnaW4gPSB0aGlzLl9tYXJnaW4gfHwgcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZ2V0UHJvcGVydHlWYWx1ZSgndG9wJykpO1xuICAgIHRoaXMuX21hcmdpbiA9IHRoaXMuX21hcmdpbiB8fCA2OyAvLyBGaXggZm9yIGlmcmFtZXNcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl9yYWRpdXMgPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9jb250ZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdib3JkZXItdG9wLWxlZnQtcmFkaXVzJykpO1xuICAgIH0pO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fYm91bmRPbkNoYW5nZSwgZmFsc2UpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsuLi5zdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXMsICdkaXJlY3Rpb24nXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgaWYgKG5hbWUgPT09ICdkaXJlY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYm91bmRPbkNoYW5nZSgpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgdGhpcy5fY3VycmVudERpcmVjdGlvbiAmJiB1dGlsLmFkZE1vZGlmaWVyKHRoaXMsIHRoaXMuX2N1cnJlbnREaXJlY3Rpb24pO1xuICAgIH1cbiAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtQb3BvdmVyQW5pbWF0b3J9IEFuaW1hdG9yXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJBbmltYXRvcihuYW1lLCBBbmltYXRvcikge1xuICAgIGlmICghKEFuaW1hdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIFBvcG92ZXJBbmltYXRvcikpIHtcbiAgICAgIHV0aWwudGhyb3dBbmltYXRvcignUG9wb3ZlcicpO1xuICAgIH1cbiAgICBfYW5pbWF0b3JEaWN0W25hbWVdID0gQW5pbWF0b3I7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGFuaW1hdG9ycygpIHtcbiAgICByZXR1cm4gX2FuaW1hdG9yRGljdDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgUG9wb3ZlckFuaW1hdG9yKCkge1xuICAgIHJldHVybiBQb3BvdmVyQW5pbWF0b3I7XG4gIH1cbn1cblxudXRpbC5kZWZpbmVCb29sZWFuUHJvcGVydGllcyhQb3BvdmVyRWxlbWVudCwgWydjb3Zlci10YXJnZXQnXSk7XG5cbm9uc0VsZW1lbnRzLlBvcG92ZXIgPSBQb3BvdmVyRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXBvcG92ZXInLCBQb3BvdmVyRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcucHJvZ3Jlc3MtYmFyJzogJ3Byb2dyZXNzLWJhci0tKicsXG4gICcucHJvZ3Jlc3MtYmFyX19wcmltYXJ5JzogJ3Byb2dyZXNzLWJhci0tKl9fcHJpbWFyeScsXG4gICcucHJvZ3Jlc3MtYmFyX19zZWNvbmRhcnknOiAncHJvZ3Jlc3MtYmFyLS0qX19zZWNvbmRhcnknXG59O1xuXG5jb25zdCB0ZW1wbGF0ZSA9IHV0aWwuY3JlYXRlRWxlbWVudChgXG4gIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyX19zZWNvbmRhcnlcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyX19wcmltYXJ5XCI+PC9kaXY+XG4gIDwvZGl2PlxuYCk7XG5cbmNvbnN0IElOREVUID0gJ2luZGV0ZXJtaW5hdGUnO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1wcm9ncmVzcy1iYXJcbiAqIEBjYXRlZ29yeSB2aXN1YWxcbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogICBbZW5dRGlzcGxheSBhIE1hdGVyaWFsIERlc2lnbiBwcm9ncmVzcyBiYXIuWy9lbl1cbiAqICAgW2phXeODnuODhuODquOCouODq+ODh+OCtuOCpOODs+OBruOCueOCv+OCpOODq+OBp+ODl+ODreOCsOODrOOCueODkOODvOOCkuihqOekuuOBl+OBvuOBmeOAglsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIFRoZSBjb21wb25lbnQgaXMgdXNlZCB0byBkaXNwbGF5IGEgbGluZWFyIHByb2dyZXNzIGJhci4gSXQgY2FuIGVpdGhlciBkaXNwbGF5IGEgcHJvZ3Jlc3MgYmFyIHRoYXQgc2hvd3MgdGhlIHVzZXIgaG93IG11Y2ggb2YgYSB0YXNrIGhhcyBiZWVuIGNvbXBsZXRlZC4gSW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHBlcmNlbnRhZ2UgaXMgbm90IGtub3duIGl0IGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgYW4gYW5pbWF0ZWQgcHJvZ3Jlc3MgYmFyIHNvIHRoZSB1c2VyIGNhbiBzZWUgdGhhdCBhbiBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGNvZGVwZW4genZRYkdqXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvcHJvZ3Jlc3NcbiAqIEBzZWVhbHNvIG9ucy1wcm9ncmVzcy1jaXJjdWxhclxuICogICBbZW5dVGhlIGA8b25zLXByb2dyZXNzLWNpcmN1bGFyPmAgY29tcG9uZW50IGRpc3BsYXlzIGEgY2lyY3VsYXIgcHJvZ3Jlc3MgaW5kaWNhdG9yLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtcHJvZ3Jlc3MtYmFyXG4gKiAgdmFsdWU9XCI1NVwiXG4gKiAgc2Vjb25kYXJ5LXZhbHVlPVwiODdcIj5cbiAqIDwvb25zLXByb2dyZXNzLWJhcj5cbiAqXG4gKiA8b25zLXByb2dyZXNzLWJhclxuICogIGluZGV0ZXJtaW5hdGU+XG4gKiA8L29ucy1wcm9ncmVzcy1iYXI+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2dyZXNzQmFyRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ2hhbmdlIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBwcm9ncmVzcyBpbmRpY2F0b3IuWy9lbl1cbiAgICogICBbamFd44OX44Ot44Kw44Os44K544Kk44Oz44K444Kx44O844K/44Gu6KaL44Gf55uu44KS5aSJ5pu044GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdmFsdWVcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUN1cnJlbnQgcHJvZ3Jlc3MuIFNob3VsZCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMTAwLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBrumAsuihjOeKtuazgeOBruWApOOCkuaMh+WumuOBl+OBvuOBmeOAgjDjgYvjgokxMDDjga7plpPjga7lgKTjgpLmjIflrprjgZfjgabkuIvjgZXjgYTjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzZWNvbmRhcnktdmFsdWVcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUN1cnJlbnQgc2Vjb25kYXJ5IHByb2dyZXNzLiBTaG91bGQgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEwMC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjga7vvJLnlarnm67jga7pgLLooYznirbms4Hjga7lgKTjgpLmjIflrprjgZfjgb7jgZnjgIIw44GL44KJMTAw44Gu6ZaT44Gu5YCk44KS5oyH5a6a44GX44Gm5LiL44GV44GE44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgaW5kZXRlcm1pbmF0ZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0LCBhbiBpbmZpbml0ZSBsb29waW5nIGFuaW1hdGlvbiB3aWxsIGJlIHNob3duLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOioreWumuOBleOCjOOBn+WgtOWQiOOAgeODq+ODvOODl+OBmeOCi+OCouODi+ODoeODvOOCt+ODp+ODs+OBjOihqOekuuOBleOCjOOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fY29tcGlsZSgpKTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGlmICghdGhpcy5faXNDb21waWxlZCgpKSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZSA9IHRlbXBsYXRlLmNsb25lTm9kZSh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdGVtcGxhdGUgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnByb2dyZXNzLWJhcicpO1xuICAgIH1cblxuICAgIHRoaXMuX3ByaW1hcnkgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLl90ZW1wbGF0ZSwgJy5wcm9ncmVzcy1iYXJfX3ByaW1hcnknKTtcbiAgICB0aGlzLl9zZWNvbmRhcnkgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLl90ZW1wbGF0ZSwgJy5wcm9ncmVzcy1iYXJfX3NlY29uZGFyeScpO1xuXG4gICAgdGhpcy5fdXBkYXRlRGV0ZXJtaW5hdGUoKTtcbiAgICB0aGlzLl91cGRhdGVWYWx1ZSgpO1xuXG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLl90ZW1wbGF0ZSk7XG5cbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gIH1cblxuICBfaXNDb21waWxlZCgpIHtcbiAgICBpZiAoIXV0aWwuZmluZENoaWxkKHRoaXMsICcucHJvZ3Jlc3MtYmFyJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXJFbGVtZW50ID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wcm9ncmVzcy1iYXInKTtcblxuICAgIGlmICghdXRpbC5maW5kQ2hpbGQoYmFyRWxlbWVudCwgJy5wcm9ncmVzcy1iYXJfX3NlY29uZGFyeScpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF1dGlsLmZpbmRDaGlsZChiYXJFbGVtZW50LCAnLnByb2dyZXNzLWJhcl9fcHJpbWFyeScpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydtb2RpZmllcicsICd2YWx1ZScsICdzZWNvbmRhcnktdmFsdWUnLCBJTkRFVF07XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIGlmIChuYW1lID09PSAnbW9kaWZpZXInKSB7XG4gICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgIHRoaXMuaGFzQXR0cmlidXRlKElOREVUKSAmJiB0aGlzLl91cGRhdGVEZXRlcm1pbmF0ZSgpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3ZhbHVlJyB8fCBuYW1lID09PSAnc2Vjb25kYXJ5LXZhbHVlJykge1xuICAgICAgdGhpcy5fdXBkYXRlVmFsdWUoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09IElOREVUKSB7XG4gICAgICB0aGlzLl91cGRhdGVEZXRlcm1pbmF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVEZXRlcm1pbmF0ZSgpIHtcbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdXRpbC50b2dnbGVNb2RpZmllcih0aGlzLCBJTkRFVCwgeyBmb3JjZTogdGhpcy5oYXNBdHRyaWJ1dGUoSU5ERVQpIH0pKTtcbiAgfVxuXG4gIF91cGRhdGVWYWx1ZSgpIHtcbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgdGhpcy5fcHJpbWFyeS5zdHlsZS53aWR0aCA9ICh0aGlzLmhhc0F0dHJpYnV0ZSgndmFsdWUnKSkgPyB0aGlzLmdldEF0dHJpYnV0ZSgndmFsdWUnKSArICclJyA6ICcwJSc7XG4gICAgICB0aGlzLl9zZWNvbmRhcnkuc3R5bGUud2lkdGggPSB0aGlzLmhhc0F0dHJpYnV0ZSgnc2Vjb25kYXJ5LXZhbHVlJykgPyB0aGlzLmdldEF0dHJpYnV0ZSgnc2Vjb25kYXJ5LXZhbHVlJykgKyAnJScgOiAnMCUnO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2YWx1ZVxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ3VycmVudCBwcm9ncmVzcy4gU2hvdWxkIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxMDAuWy9lbl1cbiAgICogICBbamFd54++5Zyo44Gu6YCy6KGM54q25rOB44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCMOOBi+OCiTEwMOOBrumWk+OBruWApOOCkuaMh+WumuOBl+OBpuS4i+OBleOBhOOAglsvamFdXG4gICAqL1xuICBzZXQgdmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCB2YWx1ZSA8IDAgfHwgdmFsdWUgPiAxMDApIHtcbiAgICAgIHV0aWwudGhyb3coJ0ludmFsaWQgdmFsdWUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBNYXRoLmZsb29yKHZhbHVlKSk7XG4gIH1cblxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCd2YWx1ZScpIHx8ICcwJyk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHNlY29uZGFyeVZhbHVlXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DdXJyZW50IHNlY29uZGFyeSBwcm9ncmVzcy4gU2hvdWxkIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxMDAuWy9lbl1cbiAgICogICBbamFd54++5Zyo44Gu77yS55Wq55uu44Gu6YCy6KGM54q25rOB44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCMOOBi+OCiTEwMOOBrumWk+OBruWApOOCkuaMh+WumuOBl+OBpuS4i+OBleOBhOOAglsvamFdXG4gICAqL1xuICBzZXQgc2Vjb25kYXJ5VmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCB2YWx1ZSA8IDAgfHwgdmFsdWUgPiAxMDApIHtcbiAgICAgIHV0aWwudGhyb3coJ0ludmFsaWQgdmFsdWUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2Vjb25kYXJ5LXZhbHVlJywgTWF0aC5mbG9vcih2YWx1ZSkpO1xuICB9XG5cbiAgZ2V0IHNlY29uZGFyeVZhbHVlKCkge1xuICAgIHJldHVybiBwYXJzZUludCh0aGlzLmdldEF0dHJpYnV0ZSgnc2Vjb25kYXJ5LXZhbHVlJykgfHwgJzAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgaW5kZXRlcm1pbmF0ZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgcHJvcGVydHkgaXMgYHRydWVgLCBhbiBpbmZpbml0ZSBsb29waW5nIGFuaW1hdGlvbiB3aWxsIGJlIHNob3duLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOioreWumuOBleOCjOOBn+WgtOWQiOOAgeODq+ODvOODl+OBmeOCi+OCouODi+ODoeODvOOCt+ODp+ODs+OBjOihqOekuuOBleOCjOOBvuOBmeOAglsvamFdXG4gICAqL1xuICBzZXQgaW5kZXRlcm1pbmF0ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoSU5ERVQsICcnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShJTkRFVCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGluZGV0ZXJtaW5hdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKElOREVUKTtcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5Qcm9ncmVzc0JhciA9IFByb2dyZXNzQmFyRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXByb2dyZXNzLWJhcicsIFByb2dyZXNzQmFyRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcucHJvZ3Jlc3MtY2lyY3VsYXInOiAncHJvZ3Jlc3MtY2lyY3VsYXItLSonLFxuICAnLnByb2dyZXNzLWNpcmN1bGFyX19iYWNrZ3JvdW5kJzogJ3Byb2dyZXNzLWNpcmN1bGFyLS0qX19iYWNrZ3JvdW5kJyxcbiAgJy5wcm9ncmVzcy1jaXJjdWxhcl9fcHJpbWFyeSc6ICdwcm9ncmVzcy1jaXJjdWxhci0tKl9fcHJpbWFyeScsXG4gICcucHJvZ3Jlc3MtY2lyY3VsYXJfX3NlY29uZGFyeSc6ICdwcm9ncmVzcy1jaXJjdWxhci0tKl9fc2Vjb25kYXJ5J1xufTtcblxuY29uc3QgdGVtcGxhdGUgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoYFxuICA8c3ZnIGNsYXNzPVwicHJvZ3Jlc3MtY2lyY3VsYXJcIj5cbiAgICA8Y2lyY2xlIGNsYXNzPVwicHJvZ3Jlc3MtY2lyY3VsYXJfX2JhY2tncm91bmRcIiAvPlxuICAgIDxjaXJjbGUgY2xhc3M9XCJwcm9ncmVzcy1jaXJjdWxhcl9fc2Vjb25kYXJ5XCIgY3g9XCI1MCVcIiBjeT1cIjUwJVwiIHI9XCI0MCVcIiAvPlxuICAgIDxjaXJjbGUgY2xhc3M9XCJwcm9ncmVzcy1jaXJjdWxhcl9fcHJpbWFyeVwiIGN4PVwiNTAlXCIgY3k9XCI1MCVcIiByPVwiNDAlXCIgLz5cbiAgPC9zdmc+XG5gKTtcblxuY29uc3QgSU5ERVQgPSAnaW5kZXRlcm1pbmF0ZSc7XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXByb2dyZXNzLWNpcmN1bGFyXG4gKiBAY2F0ZWdvcnkgdmlzdWFsXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIFRoaXMgY29tcG9uZW50IGRpc3BsYXlzIGEgY2lyY3VsYXIgcHJvZ3Jlc3MgaW5kaWNhdG9yLiBJdCBjYW4gZWl0aGVyIGJlIHVzZWQgdG8gc2hvdyBob3cgbXVjaCBvZiBhIHRhc2sgaGFzIGJlZW4gY29tcGxldGVkIG9yIHRvIHNob3cgYSBsb29waW5nIGFuaW1hdGlvbiB0byBpbmRpY2F0ZSB0aGF0IGFuIG9wZXJhdGlvbiBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAY29kZXBlbiBFVnpNalJcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9wcm9ncmVzcy1jaXJjdWxhclxuICogQHNlZWFsc28gb25zLXByb2dyZXNzLWJhclxuICogICBbZW5dVGhlIGA8b25zLXByb2dyZXNzLWJhcj5gIGNvbXBvbmVudCBkaXNwbGF5cyBhIGJhciBwcm9ncmVzcyBpbmRpY2F0b3IuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1wcm9ncmVzcy1jaXJjdWxhclxuICogIHZhbHVlPVwiNTVcIlxuICogIHNlY29uZGFyeS12YWx1ZT1cIjg3XCI+XG4gKiA8L29ucy1wcm9ncmVzcy1jaXJjdWxhcj5cbiAqXG4gKiA8b25zLXByb2dyZXNzLWNpcmN1bGFyXG4gKiAgaW5kZXRlcm1pbmF0ZT5cbiAqIDwvb25zLXByb2dyZXNzLWNpcmN1bGFyPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm9ncmVzc0NpcmN1bGFyRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ2hhbmdlIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBwcm9ncmVzcyBpbmRpY2F0b3IuWy9lbl1cbiAgICogICBbamFd44OX44Ot44Kw44Os44K544Kk44Oz44K444Kx44O844K/44Gu6KaL44Gf55uu44KS5aSJ5pu044GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdmFsdWVcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUN1cnJlbnQgcHJvZ3Jlc3MuIFNob3VsZCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMTAwLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBrumAsuihjOeKtuazgeOBruWApOOCkuaMh+WumuOBl+OBvuOBmeOAgjDjgYvjgokxMDDjga7plpPjga7lgKTjgpLmjIflrprjgZfjgabkuIvjgZXjgYTjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzZWNvbmRhcnktdmFsdWVcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUN1cnJlbnQgc2Vjb25kYXJ5IHByb2dyZXNzLiBTaG91bGQgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEwMC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjga7vvJLnlarnm67jga7pgLLooYznirbms4Hjga7lgKTjgpLmjIflrprjgZfjgb7jgZnjgIIw44GL44KJMTAw44Gu6ZaT44Gu5YCk44KS5oyH5a6a44GX44Gm5LiL44GV44GE44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgaW5kZXRlcm1pbmF0ZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0LCBhbiBpbmZpbml0ZSBsb29waW5nIGFuaW1hdGlvbiB3aWxsIGJlIHNob3duLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOioreWumuOBleOCjOOBn+WgtOWQiOOAgeODq+ODvOODl+OBmeOCi+OCouODi+ODoeODvOOCt+ODp+ODs+OBjOihqOekuuOBleOCjOOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fY29tcGlsZSgpKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ3ZhbHVlJywgJ3NlY29uZGFyeS12YWx1ZScsIElOREVUXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgaWYgKG5hbWUgPT09ICdtb2RpZmllcicpIHtcbiAgICAgIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgdGhpcy5oYXNBdHRyaWJ1dGUoSU5ERVQpICYmIHRoaXMuX3VwZGF0ZURldGVybWluYXRlKCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAndmFsdWUnIHx8IG5hbWUgPT09ICdzZWNvbmRhcnktdmFsdWUnKSB7XG4gICAgICB0aGlzLl91cGRhdGVWYWx1ZSgpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gSU5ERVQpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZURldGVybWluYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZURldGVybWluYXRlKCkge1xuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB1dGlsLnRvZ2dsZU1vZGlmaWVyKHRoaXMsIElOREVULCB7IGZvcmNlOiB0aGlzLmhhc0F0dHJpYnV0ZShJTkRFVCkgfSkpO1xuICB9XG5cbiAgX3VwZGF0ZVZhbHVlKCkge1xuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgndmFsdWUnKSkge1xuICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgICAgY29uc3QgcGVyID0gTWF0aC5jZWlsKHRoaXMuZ2V0QXR0cmlidXRlKCd2YWx1ZScpICogMjUxLjMyICogMC4wMSk7XG4gICAgICAgIHRoaXMuX3ByaW1hcnkuc3R5bGVbJ3N0cm9rZS1kYXNoYXJyYXknXSA9IHBlciArICclLCAyNTEuMzIlJztcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ3NlY29uZGFyeS12YWx1ZScpKSB7XG4gICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwZXIgPSAgTWF0aC5jZWlsKHRoaXMuZ2V0QXR0cmlidXRlKCdzZWNvbmRhcnktdmFsdWUnKSAqIDI1MS4zMiAqIDAuMDEpO1xuICAgICAgICB0aGlzLl9zZWNvbmRhcnkuc3R5bGUuZGlzcGxheSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3NlY29uZGFyeS5zdHlsZVsnc3Ryb2tlLWRhc2hhcnJheSddID0gcGVyICsgJyUsIDI1MS4zMiUnO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX3NlY29uZGFyeS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2YWx1ZVxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ3VycmVudCBwcm9ncmVzcy4gU2hvdWxkIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxMDAuWy9lbl1cbiAgICogICBbamFd54++5Zyo44Gu6YCy6KGM54q25rOB44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCMOOBi+OCiTEwMOOBrumWk+OBruWApOOCkuaMh+WumuOBl+OBpuS4i+OBleOBhOOAglsvamFdXG4gICAqL1xuICBzZXQgdmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCB2YWx1ZSA8IDAgfHwgdmFsdWUgPiAxMDApIHtcbiAgICAgIHV0aWwudGhyb3coJ0ludmFsaWQgdmFsdWUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBNYXRoLmZsb29yKHZhbHVlKSk7XG4gIH1cblxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCd2YWx1ZScpIHx8ICcwJyk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHNlY29uZGFyeVZhbHVlXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DdXJyZW50IHNlY29uZGFyeSBwcm9ncmVzcy4gU2hvdWxkIGJlIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxMDAuWy9lbl1cbiAgICogICBbamFd54++5Zyo44Gu77yS55Wq55uu44Gu6YCy6KGM54q25rOB44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCMOOBi+OCiTEwMOOBrumWk+OBruWApOOCkuaMh+WumuOBl+OBpuS4i+OBleOBhOOAglsvamFdXG4gICAqL1xuICBzZXQgc2Vjb25kYXJ5VmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCB2YWx1ZSA8IDAgfHwgdmFsdWUgPiAxMDApIHtcbiAgICAgIHV0aWwudGhyb3coJ0ludmFsaWQgdmFsdWUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2Vjb25kYXJ5LXZhbHVlJywgTWF0aC5mbG9vcih2YWx1ZSkpO1xuICB9XG5cbiAgZ2V0IHNlY29uZGFyeVZhbHVlKCkge1xuICAgIHJldHVybiBwYXJzZUludCh0aGlzLmdldEF0dHJpYnV0ZSgnc2Vjb25kYXJ5LXZhbHVlJykgfHwgJzAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgaW5kZXRlcm1pbmF0ZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgcHJvcGVydHkgaXMgYHRydWVgLCBhbiBpbmZpbml0ZSBsb29waW5nIGFuaW1hdGlvbiB3aWxsIGJlIHNob3duLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOioreWumuOBleOCjOOBn+WgtOWQiOOAgeODq+ODvOODl+OBmeOCi+OCouODi+ODoeODvOOCt+ODp+ODs+OBjOihqOekuuOBleOCjOOBvuOBmeOAglsvamFdXG4gICAqL1xuICBzZXQgaW5kZXRlcm1pbmF0ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoSU5ERVQsICcnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShJTkRFVCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGluZGV0ZXJtaW5hdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKElOREVUKTtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGlmICh0aGlzLl9pc0NvbXBpbGVkKCkpIHtcbiAgICAgIHRoaXMuX3RlbXBsYXRlID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wcm9ncmVzcy1jaXJjdWxhcicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90ZW1wbGF0ZSA9IHRlbXBsYXRlLmNsb25lTm9kZSh0cnVlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9wcmltYXJ5ID0gdXRpbC5maW5kQ2hpbGQodGhpcy5fdGVtcGxhdGUsICcucHJvZ3Jlc3MtY2lyY3VsYXJfX3ByaW1hcnknKTtcbiAgICB0aGlzLl9zZWNvbmRhcnkgPSB1dGlsLmZpbmRDaGlsZCh0aGlzLl90ZW1wbGF0ZSwgJy5wcm9ncmVzcy1jaXJjdWxhcl9fc2Vjb25kYXJ5Jyk7XG5cbiAgICB0aGlzLl91cGRhdGVEZXRlcm1pbmF0ZSgpO1xuICAgIHRoaXMuX3VwZGF0ZVZhbHVlKCk7XG5cbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuX3RlbXBsYXRlKTtcblxuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIF9pc0NvbXBpbGVkKCkge1xuICAgIGlmICghdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wcm9ncmVzcy1jaXJjdWxhcicpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3Qgc3ZnID0gdXRpbC5maW5kQ2hpbGQodGhpcywgJy5wcm9ncmVzcy1jaXJjdWxhcicpO1xuXG4gICAgaWYgKCF1dGlsLmZpbmRDaGlsZChzdmcsICcucHJvZ3Jlc3MtY2lyY3VsYXJfX3NlY29uZGFyeScpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF1dGlsLmZpbmRDaGlsZChzdmcsICcucHJvZ3Jlc3MtY2lyY3VsYXJfX3ByaW1hcnknKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbm9uc0VsZW1lbnRzLlByb2dyZXNzQ2lyY3VsYXIgPSBQcm9ncmVzc0NpcmN1bGFyRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXByb2dyZXNzLWNpcmN1bGFyJywgUHJvZ3Jlc3NDaXJjdWxhckVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgc3R5bGVyIGZyb20gJy4uL29ucy9zdHlsZXIuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL29ucy9wbGF0Zm9ybS5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgR2VzdHVyZURldGVjdG9yIGZyb20gJy4uL29ucy9nZXN0dXJlLWRldGVjdG9yLmpzJztcbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vb25zL2FuaW1pdC5qcyc7XG5cbmNvbnN0IFNUQVRFX0lOSVRJQUwgPSAnaW5pdGlhbCc7XG5jb25zdCBTVEFURV9QUkVBQ1RJT04gPSAncHJlYWN0aW9uJztcbmNvbnN0IFNUQVRFX0FDVElPTiA9ICdhY3Rpb24nO1xuXG5jb25zdCB0aHJvd1R5cGUgPSAoZWwsIHR5cGUpID0+IHV0aWwudGhyb3coYFwiJHtlbH1cIiBtdXN0IGJlICR7dHlwZX1gKTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtcHVsbC1ob29rXG4gKiBAY2F0ZWdvcnkgY29udHJvbFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBDb21wb25lbnQgdGhhdCBhZGRzICoqUHVsbCB0byByZWZyZXNoKiogZnVuY3Rpb25hbGl0eSB0byBhbiBgPG9ucy1wYWdlPmAgZWxlbWVudC5cbiAqXG4gKiAgICAgSXQgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBhIHRhc2sgd2hlbiB0aGUgdXNlciBwdWxscyBkb3duIGF0IHRoZSB0b3Agb2YgdGhlIHBhZ2UuIEEgY29tbW9uIHVzYWdlIGlzIHRvIHJlZnJlc2ggdGhlIGRhdGEgZGlzcGxheWVkIGluIGEgcGFnZS5cbiAqICAgWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAY29kZXBlbiBXYkpvZ01cbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9wdWxsLWhvb2tcbiAqIEBleGFtcGxlXG4gKiA8b25zLXBhZ2U+XG4gKiAgIDxvbnMtcHVsbC1ob29rPlxuICogICAgIFJlbGVhc2UgdG8gcmVmcmVzaFxuICogICA8L29ucy1wdWxsLWhvb2s+XG4gKiA8L29ucy1wYWdlPlxuICpcbiAqIDxzY3JpcHQ+XG4gKiAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ29ucy1wdWxsLWhvb2snKS5vbkFjdGlvbiA9IGZ1bmN0aW9uKGRvbmUpIHtcbiAqICAgICBzZXRUaW1lb3V0KGRvbmUsIDEwMDApO1xuICogICB9O1xuICogPC9zY3JpcHQ+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFB1bGxIb29rRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IGNoYW5nZXN0YXRlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCB3aGVuIHRoZSBzdGF0ZSBpcyBjaGFuZ2VkLiBUaGUgc3RhdGUgY2FuIGJlIGVpdGhlciBcImluaXRpYWxcIiwgXCJwcmVhY3Rpb25cIiBvciBcImFjdGlvblwiLlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBrueKtuaFi+OBjOWkieOCj+OBo+OBn+WgtOWQiOOBq+eZuueBq+OBl+OBvuOBmeOAgueKtuaFi+OBr+OAgVwiaW5pdGlhbFwiLCBcInByZWFjdGlvblwiLCBcImFjdGlvblwi44Gu44GE44Ga44KM44GL44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQucHVsbEhvb2tcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQuc3RhdGVcbiAgICogICBbZW5dQ3VycmVudCBzdGF0ZS5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjga7nirbmhYvlkI3jgpLlj4LnhafjgafjgY3jgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHB1bGxcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHdoZW4gdGhlIHB1bGwgaG9vayBpcyBwdWxsZWQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQucmF0aW9cbiAgICogICBbZW5dVGhlIHB1bGxlZCBkaXN0YW5jZSByYXRpbyAoc2Nyb2xsIC8gaGVpZ2h0KS5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQuYW5pbWF0aW9uT3B0aW9uc1xuICAgKiAgIFtlbl1UaGUgYW5pbWF0aW9uIG9wdGlvbnMgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGRpc2FibGVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdGhlIFwicHVsbC10by1yZWZyZXNoXCIgZnVuY3Rpb25hbGl0eSBpcyBkaXNhYmxlZC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovmmYLjgIFkaXNhYmxlZOeKtuaFi+OBq+OBquOCiuOCouOCr+OCt+ODp+ODs+OBjOWun+ihjOOBleOCjOOBquOBj+OBquOCiuOBvuOBmVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGhlaWdodFxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgaGVpZ2h0IG9mIHRoZSBjb21wb25lbnQuIFdoZW4gcHVsbGVkIGRvd24gZnVydGhlciB0aGFuIHRoaXMgdmFsdWUgaXQgd2lsbCBzd2l0Y2ggdG8gdGhlIFwicHJlYWN0aW9uXCIgc3RhdGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFwiNjRweFwiLlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOOBrumrmOOBleOCkuaMh+WumuOBl+OBvuOBmeOAguOBk+OBrumrmOOBleS7peS4iuOBq3B1bGwgZG93buOBmeOCi+OBqFwicHJlYWN0aW9uXCLnirbmhYvjgavnp7vooYzjgZfjgb7jgZnjgILjg4fjg5Xjgqnjg6vjg4jjga7lgKTjga9cIjY0cHhcIuOBp+OBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHRocmVzaG9sZC1oZWlnaHRcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIHRocmVzaG9sZCBoZWlnaHQuIFRoZSBjb21wb25lbnQgYXV0b21hdGljYWxseSBzd2l0Y2hlcyB0byB0aGUgXCJhY3Rpb25cIiBzdGF0ZSB3aGVuIHB1bGxlZCBmdXJ0aGVyIHRoYW4gdGhpcyB2YWx1ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXCI5NnB4XCIuIEEgbmVnYXRpdmUgdmFsdWUgd2lsbCBkaXNhYmxlIHRoaXMgcHJvcGVydHkuIElmIHRoaXMgdmFsdWUgaXMgbG93ZXIgdGhhbiB0aGUgaGVpZ2h0LCBpdCB3aWxsIHNraXAgXCJwcmVhY3Rpb25cIiBzdGF0ZS5bL2VuXVxuICAgKiAgIFtqYV3plr7lgKTjgajjgarjgovpq5jjgZXjgpLmjIflrprjgZfjgb7jgZnjgILjgZPjga7lgKTjgafmjIflrprjgZfjgZ/pq5jjgZXjgojjgorjgoJwdWxsIGRvd27jgZnjgovjgajjgIHjgZPjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga/oh6rli5XnmoTjgatcImFjdGlvblwi54q25oWL44Gr56e76KGM44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZml4ZWQtY29udGVudFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSBjb250ZW50IG9mIHRoZSBwYWdlIHdpbGwgbm90IG1vdmUgd2hlbiBwdWxsaW5nLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruWxnuaAp+OBjOOBguOCi+aZguOAgeODl+ODq+ODleODg+OCr+OBjOW8leOBjeWHuuOBleOCjOOBpuOBhOOCi+aZguOBq+OCguOCs+ODs+ODhuODs+ODhOOBr+WLleOBjeOBvuOBm+OCk+OAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZml4ZWRDb250ZW50XG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdGhlIGNvbnRlbnQgb2YgdGhlIHBhZ2Ugd2lsbCBub3QgbW92ZSB3aGVuIHB1bGxpbmcuWy9lbl1cbiAgICogICBbamFd44GT44Gu5bGe5oCn44GM44GC44KL5pmC44CB44OX44Or44OV44OD44Kv44GM5byV44GN5Ye644GV44KM44Gm44GE44KL5pmC44Gr44KC44Kz44Oz44OG44Oz44OE44Gv5YuV44GN44G+44Gb44KT44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX29uRHJhZyA9IHRoaXMuX29uRHJhZy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uRHJhZ1N0YXJ0ID0gdGhpcy5fb25EcmFnU3RhcnQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbkRyYWdFbmQgPSB0aGlzLl9vbkRyYWdFbmQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vblNjcm9sbCA9IHRoaXMuX29uU2Nyb2xsLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLl9zZXRTdGF0ZShTVEFURV9JTklUSUFMLCB0cnVlKTtcbiAgICB0aGlzLl9oaWRlKCk7IC8vIEZpeCBmb3IgdHJhbnNwYXJlbnQgdG9vbGJhciB0cmFuc2l0aW9uc1xuXG4gICAgY29uc3Qge29uQ29ubmVjdGVkLCBvbkRpc2Nvbm5lY3RlZH0gPSB1dGlsLmRlZmluZUxpc3RlbmVyUHJvcGVydHkodGhpcywgJ3B1bGwnKTtcbiAgICB0aGlzLl9jb25uZWN0T25QdWxsID0gb25Db25uZWN0ZWQ7XG4gICAgdGhpcy5fZGlzY29ubmVjdE9uUHVsbCA9IG9uRGlzY29ubmVjdGVkO1xuICB9XG5cbiAgX3NldFN0eWxlKCkge1xuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgJ3B4JztcbiAgICBzdHlsZXIodGhpcywgeyBoZWlnaHQsIGxpbmVIZWlnaHQ6IGhlaWdodCB9KTtcbiAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPT09ICcnICYmIHRoaXMuX3Nob3coKTtcbiAgfVxuXG4gIF9vblNjcm9sbChldmVudCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9wYWdlRWxlbWVudDtcblxuICAgIGlmIChlbGVtZW50LnNjcm9sbFRvcCA8IDApIHtcbiAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICB9XG4gIH1cblxuICBfY2FuQ29uc3VtZUdlc3R1cmUoZ2VzdHVyZSkge1xuICAgIHJldHVybiBnZXN0dXJlLmRpcmVjdGlvbiA9PT0gJ3VwJyB8fCBnZXN0dXJlLmRpcmVjdGlvbiA9PT0gJ2Rvd24nO1xuICB9XG5cbiAgX29uRHJhZ1N0YXJ0KGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC5nZXN0dXJlIHx8IHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXBZID0gZXZlbnQuZ2VzdHVyZS5jZW50ZXIuY2xpZW50WSArIHRoaXMuX3BhZ2VFbGVtZW50LnNjcm9sbFRvcDtcbiAgICBjb25zdCBtYXhZID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgIC8vIE9ubHkgdXNlIGRyYWdzIHRoYXQgc3RhcnQgbmVhciB0aGUgcHVsbEhvb2sgdG8gcmVkdWNlIGZsaWNrZXJpbmdzXG4gICAgY29uc3QgZHJhZ2dhYmxlQXJlYVJhdGlvID0gMTtcblxuICAgIHRoaXMuX2lnbm9yZURyYWcgPSBldmVudC5jb25zdW1lZCB8fCAodGFwWSA+IG1heFkgKiBkcmFnZ2FibGVBcmVhUmF0aW8pO1xuXG4gICAgaWYgKCF0aGlzLl9pZ25vcmVEcmFnKSB7XG4gICAgICBjb25zdCBjb25zdW1lID0gZXZlbnQuY29uc3VtZTtcbiAgICAgIGV2ZW50LmNvbnN1bWUgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN1bWUgJiYgY29uc3VtZSgpO1xuICAgICAgICB0aGlzLl9pZ25vcmVEcmFnID0gdHJ1ZTtcbiAgICAgICAgLy8gVGhpcyBlbGVtZW50cyByZXNpemVzIC5wYWdlX19jb250ZW50IHNvIGl0IGlzIHNhZmVyXG4gICAgICAgIC8vIHRvIGhpZGUgaXQgd2hlbiBvdGhlciBjb21wb25lbnRzIGFyZSBkcmFnZ2VkLlxuICAgICAgICB0aGlzLl9oaWRlKCk7XG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5fY2FuQ29uc3VtZUdlc3R1cmUoZXZlbnQuZ2VzdHVyZSkpIHtcbiAgICAgICAgY29uc3VtZSAmJiBjb25zdW1lKCk7XG4gICAgICAgIGV2ZW50LmNvbnN1bWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fc2hvdygpOyAvLyBOb3QgZW5vdWdoIGR1ZSB0byAnZHJhZ0xvY2tBeGlzJ1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3N0YXJ0U2Nyb2xsID0gdGhpcy5fcGFnZUVsZW1lbnQuc2Nyb2xsVG9wO1xuICB9XG5cbiAgX29uRHJhZyhldmVudCkge1xuICAgIGlmICghZXZlbnQuZ2VzdHVyZSB8fCB0aGlzLmRpc2FibGVkIHx8IHRoaXMuX2lnbm9yZURyYWcgfHwgIXRoaXMuX2NhbkNvbnN1bWVHZXN0dXJlKGV2ZW50Lmdlc3R1cmUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTmVjZXNzYXJ5IGR1ZSB0byAnZHJhZ0xvY2tBeGlzJyAoMjVweClcbiAgICBpZiAodGhpcy5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgIHRoaXMuX3Nob3coKTtcbiAgICB9XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IHRhcFkgPSBldmVudC5nZXN0dXJlLmNlbnRlci5jbGllbnRZICsgdGhpcy5fcGFnZUVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IG1heFkgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICBjb25zdCBzY3JvbGwgPSBNYXRoLm1heChldmVudC5nZXN0dXJlLmRlbHRhWSAtIHRoaXMuX3N0YXJ0U2Nyb2xsLCAwKTtcbiAgICBpZiAoc2Nyb2xsICE9PSB0aGlzLl9jdXJyZW50VHJhbnNsYXRpb24pIHtcblxuICAgICAgY29uc3QgdGggPSB0aGlzLnRocmVzaG9sZEhlaWdodDtcbiAgICAgIGlmICh0aCA+IDAgJiYgc2Nyb2xsID49IHRoKSB7XG4gICAgICAgIGV2ZW50Lmdlc3R1cmUuc3RvcERldGVjdCgpO1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5fZmluaXNoKCkpO1xuXG4gICAgICB9IGVsc2UgaWYgKHNjcm9sbCA+PSB0aGlzLmhlaWdodCkge1xuICAgICAgICB0aGlzLl9zZXRTdGF0ZShTVEFURV9QUkVBQ1RJT04pO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zZXRTdGF0ZShTVEFURV9JTklUSUFMKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdHJhbnNsYXRlVG8oc2Nyb2xsKTtcbiAgICB9XG4gIH1cblxuICBfb25EcmFnRW5kKGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC5nZXN0dXJlIHx8IHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5faWdub3JlRHJhZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbiA+IDApIHtcbiAgICAgIGNvbnN0IHNjcm9sbCA9IHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbjtcblxuICAgICAgaWYgKHNjcm9sbCA+IHRoaXMuaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuX2ZpbmlzaCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRlVG8oMCwge2FuaW1hdGU6IHRydWV9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IG9uQWN0aW9uXG4gICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoaXMgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIGBhY3Rpb25gIHN0YXRlIGlmIGl0IGV4aXN0cy4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgZ2l2ZW4gYSBgZG9uZWAgY2FsbGJhY2sgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgb25BY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX29uQWN0aW9uO1xuICB9XG5cbiAgc2V0IG9uQWN0aW9uKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlICYmICEodmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcbiAgICAgIHRocm93VHlwZSgnb25BY3Rpb24nLCAnZnVuY3Rpb24gb3IgbnVsbCcpO1xuICAgIH1cbiAgICB0aGlzLl9vbkFjdGlvbiA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvblB1bGxcbiAgICogQHR5cGUge0Z1bmN0aW9ufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSG9vayBjYWxsZWQgd2hlbmV2ZXIgdGhlIHVzZXIgcHVsbHMgdGhlIGVsZW1lbnQuIEl0IGdldHMgdGhlIHB1bGxlZCBkaXN0YW5jZSByYXRpbyAoc2Nyb2xsIC8gaGVpZ2h0KSBhbmQgYW4gYW5pbWF0aW9uT3B0aW9ucyBvYmplY3QgYXMgYXJndW1lbnRzLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIF9maW5pc2goKSB7XG4gICAgdGhpcy5fc2V0U3RhdGUoU1RBVEVfQUNUSU9OKTtcbiAgICB0aGlzLl90cmFuc2xhdGVUbyh0aGlzLmhlaWdodCwge2FuaW1hdGU6IHRydWV9KTtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLm9uQWN0aW9uIHx8IChkb25lID0+IGRvbmUoKSk7XG4gICAgYWN0aW9uKCgpID0+IHtcbiAgICAgIHRoaXMuX3RyYW5zbGF0ZVRvKDAsIHthbmltYXRlOiB0cnVlfSk7XG4gICAgICB0aGlzLl9zZXRTdGF0ZShTVEFURV9JTklUSUFMKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgaGVpZ2h0XG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgaGVpZ2h0IG9mIHRoZSBwdWxsIGhvb2sgaW4gcGl4ZWxzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgNjRweGAuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHNldCBoZWlnaHQodmFsdWUpIHtcbiAgICBpZiAoIXV0aWwuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgdGhyb3dUeXBlKCdoZWlnaHQnLCAnaW50ZWdlcicpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBgJHt2YWx1ZX1weGApO1xuICB9XG5cbiAgZ2V0IGhlaWdodCgpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpIHx8ICc2NCcsIDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdGhyZXNob2xkSGVpZ2h0XG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgdGhyZXNob2xkSGVpZ2h0IG9mIHRoZSBwdWxsIGhvb2sgaW4gcGl4ZWxzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgOTZweGAuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHNldCB0aHJlc2hvbGRIZWlnaHQodmFsdWUpIHtcbiAgICBpZiAoIXV0aWwuaXNJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgdGhyb3dUeXBlKCd0aHJlc2hvbGRIZWlnaHQnLCAnaW50ZWdlcicpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCd0aHJlc2hvbGQtaGVpZ2h0JywgYCR7dmFsdWV9cHhgKTtcbiAgfVxuXG4gIGdldCB0aHJlc2hvbGRIZWlnaHQoKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCd0aHJlc2hvbGQtaGVpZ2h0JykgfHwgJzk2JywgMTApO1xuICB9XG5cbiAgX3NldFN0YXRlKHN0YXRlLCBub0V2ZW50KSB7XG4gICAgY29uc3QgbGFzdFN0YXRlID0gdGhpcy5zdGF0ZTtcblxuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzdGF0ZScsIHN0YXRlKTtcblxuICAgIGlmICghbm9FdmVudCAmJiBsYXN0U3RhdGUgIT09IHRoaXMuc3RhdGUpIHtcbiAgICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAnY2hhbmdlc3RhdGUnLCB7XG4gICAgICAgIHB1bGxIb29rOiB0aGlzLFxuICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgIGxhc3RTdGF0ZTogbGFzdFN0YXRlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHN0YXRlXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQ3VycmVudCBzdGF0ZSBvZiB0aGUgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgZ2V0IHN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnc3RhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgcHVsbERpc3RhbmNlXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGN1cnJlbnQgbnVtYmVyIG9mIHBpeGVscyB0aGUgcHVsbCBob29rIGhhcyBtb3ZlZC5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjga7jg5fjg6vjg5Xjg4Pjgq/jgYzlvJXjgY3lh7rjgZXjgozjgZ/ot53pm6LjgpLjg5Tjgq/jgrvjg6vmlbDjgIJbL2phXVxuICAgKi9cbiAgZ2V0IHB1bGxEaXN0YW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFRyYW5zbGF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIF9zaG93KCkge1xuICAgIC8vIFJ1biBhc3luY3Job25vdXNseSB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBBbmltaXQncyBzdHlsZSBjbGVhblxuICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGlmICh0aGlzLl9wYWdlRWxlbWVudCkge1xuICAgICAgICB0aGlzLl9wYWdlRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSBgLSR7dGhpcy5oZWlnaHR9cHhgO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX2hpZGUoKSB7XG4gICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmICh0aGlzLl9wYWdlRWxlbWVudCkge1xuICAgICAgdGhpcy5fcGFnZUVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gJyc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBzY3JvbGxcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqL1xuICBfdHJhbnNsYXRlVG8oc2Nyb2xsLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAodGhpcy5fY3VycmVudFRyYW5zbGF0aW9uID09IDAgJiYgc2Nyb2xsID09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jdXJyZW50VHJhbnNsYXRpb24gPSBzY3JvbGw7XG4gICAgY29uc3Qgb3B0ID0gb3B0aW9ucy5hbmltYXRlID8geyBkdXJhdGlvbjogLjMsIHRpbWluZzogJ2N1YmljLWJlemllciguMSwgLjcsIC4xLCAxKScgfSA6IHt9O1xuICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAncHVsbCcsIHsgcmF0aW86IChzY3JvbGwgLyB0aGlzLmhlaWdodCkudG9GaXhlZCgyKSwgYW5pbWF0aW9uT3B0aW9uczogb3B0IH0pO1xuICAgIGNvbnN0IHNjcm9sbEVsZW1lbnQgPSAgdGhpcy5oYXNBdHRyaWJ1dGUoJ2ZpeGVkLWNvbnRlbnQnKSA/IHRoaXMgOiB0aGlzLl9wYWdlRWxlbWVudDtcblxuICAgIGFuaW1pdChzY3JvbGxFbGVtZW50KVxuICAgICAgLnF1ZXVlKHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoMHB4LCAke3Njcm9sbH1weCwgMHB4KWAgfSwgb3B0KVxuICAgICAgLnBsYXkoKCkgPT4ge1xuICAgICAgICBzY3JvbGwgPT09IDAgJiYgc3R5bGVyLmNsZWFyKHNjcm9sbEVsZW1lbnQsICd0cmFuc2l0aW9uIHRyYW5zZm9ybScpO1xuICAgICAgICBvcHRpb25zLmNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb3B0aW9ucy5jYWxsYmFjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgX2Rpc2FibGVEcmFnTG9jaygpIHsgLy8gZTJlIHRlc3RzIG5lZWQgaXRcbiAgICB0aGlzLl9kcmFnTG9ja0Rpc2FibGVkID0gdHJ1ZTtcbiAgICB0aGlzLl9zZXR1cExpc3RlbmVycyh0cnVlKTtcbiAgfVxuXG4gIF9zZXR1cExpc3RlbmVycyhhZGQpIHtcbiAgICBjb25zdCBzY3JvbGxUb2dnbGUgPSBhY3Rpb24gPT4gdGhpcy5fcGFnZUVsZW1lbnRbYCR7YWN0aW9ufUV2ZW50TGlzdGVuZXJgXSgnc2Nyb2xsJywgdGhpcy5fb25TY3JvbGwsIGZhbHNlKTtcbiAgICBjb25zdCBnZFRvZ2dsZSA9IGFjdGlvbiA9PiB7XG4gICAgICBjb25zdCBwYXNzaXZlID0geyBwYXNzaXZlOiB0cnVlIH07XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3JbYWN0aW9uXSgnZHJhZycsIHRoaXMuX29uRHJhZywgcGFzc2l2ZSk7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3JbYWN0aW9uXSgnZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnU3RhcnQsIHBhc3NpdmUpO1xuICAgICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yW2FjdGlvbl0oJ2RyYWdlbmQnLCB0aGlzLl9vbkRyYWdFbmQsIHBhc3NpdmUpO1xuICAgIH07XG5cbiAgICBpZiAodGhpcy5fZ2VzdHVyZURldGVjdG9yKSB7XG4gICAgICBnZFRvZ2dsZSgnb2ZmJyk7XG4gICAgICB0aGlzLl9nZXN0dXJlRGV0ZWN0b3IuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yID0gbnVsbDtcbiAgICB9XG4gICAgc2Nyb2xsVG9nZ2xlKCdyZW1vdmUnKTtcblxuICAgIGlmIChhZGQpIHtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3RvciA9IG5ldyBHZXN0dXJlRGV0ZWN0b3IodGhpcy5fcGFnZUVsZW1lbnQsIHtcbiAgICAgICAgZHJhZ01pbkRpc3RhbmNlOiAxLFxuICAgICAgICBkcmFnRGlzdGFuY2VDb3JyZWN0aW9uOiBmYWxzZSxcbiAgICAgICAgZHJhZ0xvY2tUb0F4aXM6ICF0aGlzLl9kcmFnTG9ja0Rpc2FibGVkLFxuICAgICAgICBwYXNzaXZlOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgZ2RUb2dnbGUoJ29uJyk7XG4gICAgICBzY3JvbGxUb2dnbGUoJ2FkZCcpO1xuICAgIH1cbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbiA9IDA7XG4gICAgdGhpcy5fcGFnZUVsZW1lbnQgPSB0aGlzLnBhcmVudE5vZGU7XG5cbiAgICB0aGlzLl9zZXR1cExpc3RlbmVycyh0cnVlKTtcbiAgICB0aGlzLl9zZXRTdHlsZSgpO1xuXG4gICAgdGhpcy5fY29ubmVjdE9uUHVsbCgpO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5faGlkZSgpO1xuICAgIHRoaXMuX3NldHVwTGlzdGVuZXJzKGZhbHNlKTtcblxuICAgIHRoaXMuX2Rpc2Nvbm5lY3RPblB1bGwoKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ2hlaWdodCddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBpZiAobmFtZSA9PT0gJ2hlaWdodCcgJiYgdGhpcy5fcGFnZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX3NldFN0eWxlKCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBldmVudHMoKSB7XG4gICAgcmV0dXJuIFsnY2hhbmdlc3RhdGUnLCAncHVsbCddO1xuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoUHVsbEhvb2tFbGVtZW50LCBbJ2Rpc2FibGVkJywgJ2ZpeGVkLWNvbnRlbnQnXSk7XG5cbm9uc0VsZW1lbnRzLlB1bGxIb29rID0gUHVsbEhvb2tFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtcHVsbC1ob29rJywgUHVsbEhvb2tFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBCYXNlSW5wdXRFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWlucHV0LmpzJztcblxuY29uc3Qgc2NoZW1lID0ge1xuICAnJzogJ3JhbmdlLS0qJyxcbiAgJy5yYW5nZV9faW5wdXQnOiAncmFuZ2UtLSpfX2lucHV0JyxcbiAgJy5yYW5nZV9fZm9jdXMtcmluZyc6ICdyYW5nZS0tKl9fZm9jdXMtcmluZydcbn07XG5cbmNvbnN0IGFjdGl2ZUNsYXNzVG9rZW4gPSAncmFuZ2VfX2lucHV0LS1hY3RpdmUnO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1yYW5nZVxuICogQGNhdGVnb3J5IGZvcm1cbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogICBbZW5dTWF0ZXJpYWwgRGVzaWduIHNsaWRlclsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBSYW5nZSBpbnB1dCBjb21wb25lbnQuIFVzZWQgdG8gZGlzcGxheSBhIGRyYWdnYWJsZSBzbGlkZXIuXG4gKlxuICogICAgIFdvcmtzIHZlcnkgc2ltaWxhciB0byB0aGUgYDxpbnB1dCB0eXBlPVwicmFuZ2VcIj5gIGVsZW1lbnQuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGNvZGVwZW4geFpRb21NXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2UvcmFuZ2VcbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjbW9kaWZpZXJzIFtlbl1Nb3JlIGRldGFpbHMgYWJvdXQgdGhlIGBtb2RpZmllcmAgYXR0cmlidXRlWy9lbl1bamFdbW9kaWZpZXLlsZ7mgKfjga7kvb/jgYTmlrlbL2phXVxuICogQHNlZWFsc28gb25zLWlucHV0XG4gKiAgIFtlbl1UaGUgYDxvbnMtaW5wdXQ+YCBjb21wb25lbnQgaXMgdXNlZCB0byBkaXNwbGF5IHRleHQgaW5wdXRzLCByYWRpbyBidXR0b25zIGFuZCBjaGVja2JveGVzLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtcmFuZ2UgdmFsdWU9XCIyMFwiPjwvb25zLXJhbmdlPlxuICogPG9ucy1yYW5nZSBtb2RpZmllcj1cIm1hdGVyaWFsXCIgdmFsdWU9XCIxMFwiPjwvcmFuZ2U+XG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFuZ2VFbGVtZW50IGV4dGVuZHMgQmFzZUlucHV0RWxlbWVudCB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX29uTW91c2VEb3duID0gdGhpcy5fb25Nb3VzZURvd24uYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbk1vdXNlVXAgPSB0aGlzLl9vbk1vdXNlVXAuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vblRvdWNoU3RhcnQgPSB0aGlzLl9vblRvdWNoU3RhcnQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vblRvdWNoRW5kID0gdGhpcy5fb25Ub3VjaEVuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uSW5wdXQgPSB0aGlzLl91cGRhdGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbkRyYWdzdGFydCA9IHRoaXMuX29uRHJhZ3N0YXJ0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25EcmFnZW5kID0gdGhpcy5fb25EcmFnZW5kLmJpbmQodGhpcyk7XG4gIH1cblxuICBfY29tcGlsZSgpIHtcbiAgICBzdXBlci5fY29tcGlsZSgpO1xuICAgIHRoaXMuX3VwZGF0ZURpc2FibGVkKHRoaXMuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKTtcbiAgfVxuXG4gIC8qIEluaGVyaXRlZCBwcm9wcyAqL1xuXG4gIF91cGRhdGUoKSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLl9pbnB1dDtcbiAgICBjb25zdCBmb2N1c1JpbmcgPSB0aGlzLl9mb2N1c1Jpbmc7XG5cbiAgICBpbnB1dC5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9IGAkezEwMCAqIHRoaXMuX3JhdGlvfSUgMnB4YDtcbiAgICBmb2N1c1JpbmcudmFsdWUgPSB0aGlzLnZhbHVlO1xuXG4gICAgLy8gTk9URTogXCJfemVyb1wiIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBDU1Mgc3R5bGluZy5cbiAgICBpZiAoKGlucHV0Lm1pbiA9PT0gJycgJiYgaW5wdXQudmFsdWUgPT09ICcwJykgfHwgaW5wdXQubWluID09PSBpbnB1dC52YWx1ZSkge1xuICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCdfemVybycsICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXQucmVtb3ZlQXR0cmlidXRlKCdfemVybycpO1xuICAgIH1cblxuICAgIFsnbWluJywgJ21heCddLmZvckVhY2goYXR0ciA9PiBmb2N1c1JpbmdbYXR0cl0gPSBpbnB1dFthdHRyXSk7XG4gIH1cblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4gc2NoZW1lO1xuICB9XG5cbiAgZ2V0IF90ZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gYFxuICAgICAgPGlucHV0IHR5cGU9XCIke3RoaXMudHlwZX1cIiBjbGFzcz1cIiR7dGhpcy5fZGVmYXVsdENsYXNzTmFtZX1fX2lucHV0XCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInJhbmdlXCIgY2xhc3M9XCJyYW5nZV9fZm9jdXMtcmluZ1wiIHRhYkluZGV4PVwiLTFcIj5cbiAgICBgO1xuICB9XG5cbiAgZ2V0IF9kZWZhdWx0Q2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAncmFuZ2UnO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICdyYW5nZSc7XG4gIH1cblxuICAvKiBPd24gcHJvcHMgKi9cblxuICBfb25Nb3VzZURvd24oZSkge1xuICAgIHRoaXMuX2lucHV0LmNsYXNzTGlzdC5hZGQoYWN0aXZlQ2xhc3NUb2tlbik7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuX2lucHV0LmZvY3VzKCkpO1xuICB9XG5cbiAgX29uVG91Y2hTdGFydChlKSB7XG4gICAgdGhpcy5fb25Nb3VzZURvd24oKTtcbiAgfVxuXG4gIF9vbk1vdXNlVXAoZSkge1xuICAgIHRoaXMuX2lucHV0LmNsYXNzTGlzdC5yZW1vdmUoYWN0aXZlQ2xhc3NUb2tlbik7XG4gIH1cblxuICBfb25Ub3VjaEVuZChlKSB7XG4gICAgdGhpcy5fb25Nb3VzZVVwKGUpO1xuICB9XG5cbiAgX29uRHJhZ3N0YXJ0KGUpIHtcbiAgICBlLmNvbnN1bWVkID0gdHJ1ZTtcbiAgICBlLmdlc3R1cmUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5faW5wdXQuY2xhc3NMaXN0LmFkZChhY3RpdmVDbGFzc1Rva2VuKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWcnLCB0aGlzLl9vbkRyYWcpO1xuICB9XG5cbiAgX29uRHJhZyhlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIF9vbkRyYWdlbmQoZSkge1xuICAgIHRoaXMuX2lucHV0LmNsYXNzTGlzdC5yZW1vdmUoYWN0aXZlQ2xhc3NUb2tlbik7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnJywgdGhpcy5fb25EcmFnKTtcbiAgfVxuXG4gIGdldCBfZm9jdXNSaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmNoaWxkcmVuWzFdO1xuICB9XG5cbiAgZ2V0IF9yYXRpbygpIHtcbiAgICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHJhdGlvLlxuICAgIGNvbnN0IG1pbiA9IHRoaXMuX2lucHV0Lm1pbiA9PT0gJycgPyAwIDogcGFyc2VJbnQodGhpcy5faW5wdXQubWluKTtcbiAgICBjb25zdCBtYXggPSB0aGlzLl9pbnB1dC5tYXggPT09ICcnID8gMTAwIDogcGFyc2VJbnQodGhpcy5faW5wdXQubWF4KTtcblxuICAgIHJldHVybiAodGhpcy52YWx1ZSAtIG1pbikgLyAobWF4IC0gbWluKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ2Rpc2FibGVkJywgLi4uQmFzZUlucHV0RWxlbWVudC5vYnNlcnZlZEF0dHJpYnV0ZXNdO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBpZiAobmFtZSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgdGhpcy5fdXBkYXRlRGlzYWJsZWQoY3VycmVudCk7XG4gICAgfVxuICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRpc2FibGVkXG4gICAqL1xuICBfdXBkYXRlRGlzYWJsZWQoZGlzYWJsZWQpIHtcbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgncmFuZ2UtLWRpc2FibGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZSgncmFuZ2UtLWRpc2FibGVkJyk7XG4gICAgfVxuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fc2V0dXBMaXN0ZW5lcnModHJ1ZSk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9zZXR1cExpc3RlbmVycyhmYWxzZSk7XG4gIH1cblxuICBfc2V0dXBMaXN0ZW5lcnMoYWRkKSB7XG4gICAgY29uc3QgYWN0aW9uID0gKGFkZCA/ICdhZGQnIDogJ3JlbW92ZScpICsgJ0V2ZW50TGlzdGVuZXInO1xuICAgIHV0aWxbYWN0aW9uXSh0aGlzLCAndG91Y2hzdGFydCcsIHRoaXMuX29uVG91Y2hTdGFydCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgIHRoaXNbYWN0aW9uXSgnbW91c2Vkb3duJywgdGhpcy5fb25Nb3VzZURvd24pO1xuICAgIHRoaXNbYWN0aW9uXSgnbW91c2V1cCcsIHRoaXMuX29uTW91c2VVcCk7XG4gICAgdGhpc1thY3Rpb25dKCd0b3VjaGVuZCcsIHRoaXMuX29uVG91Y2hFbmQpO1xuICAgIHRoaXNbYWN0aW9uXSgnZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnc3RhcnQpO1xuICAgIHRoaXNbYWN0aW9uXSgnZHJhZ2VuZCcsIHRoaXMuX29uRHJhZ2VuZCk7XG4gICAgdGhpc1thY3Rpb25dKCdpbnB1dCcsIHRoaXMuX29uSW5wdXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHZhbHVlXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DdXJyZW50IHZhbHVlLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGZvY3VzXG4gICAqIEBzaWduYXR1cmUgZm9jdXMoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRm9jdXNlcyB0aGUgcmFuZ2UuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYmx1clxuICAgKiBAc2lnbmF0dXJlIGJsdXIoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmVtb3ZlcyBmb2N1cyBmcm9tIHRoZSByYW5nZS5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbn1cblxub25zRWxlbWVudHMuUmFuZ2UgPSBSYW5nZUVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1yYW5nZScsIFJhbmdlRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtcm93XG4gKiBAY2F0ZWdvcnkgZ3JpZFxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1SZXByZXNlbnRzIGEgcm93IGluIHRoZSBncmlkIHN5c3RlbS4gVXNlIHdpdGggYDxvbnMtY29sPmAgdG8gbGF5b3V0IGNvbXBvbmVudHMuWy9lbl1cbiAqICAgW2phXeOCsOODquODg+ODieOCt+OCueODhuODoOOBq+OBpuihjOOCkuWumue+qeOBl+OBvuOBmeOAgm9ucy1jb2zjgajjgajjgoLjgavkvb/nlKjjgZfjgIHjgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7phY3nva7jgavkvb/nlKjjgZfjgb7jgZnjgIJbL2phXVxuICogQGNvZGVwZW4gR2d1akMge3dpZGV9XG4gKiBAZ3VpZGUgZmVhdHVyZXMuaHRtbFxuICogICBbZW5dTGF5b3V0aW5nIGd1aWRlWy9lbl1cbiAqICAgW2phXeODrOOCpOOCouOCpuODiOiqv+aVtFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtY29sXG4gKiAgIFtlbl1UaGUgYDxvbnMtY29sPmAgY29tcG9uZW50IGlzIHVzZWQgYXMgY2hpbGRyZW4gb2YgYDxvbnMtcm93PmAuWy9lbl1cbiAqICAgW2phXW9ucy1jb2zjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQG5vdGVcbiAqICAgW2VuXUZvciBBbmRyb2lkIDQuMyBhbmQgZWFybGllciwgYW5kIGlPUzYgYW5kIGVhcmxpZXIsIHdoZW4gdXNpbmcgbWl4ZWQgYWxpZ25tZW50IHdpdGggb25zLXJvdyBhbmQgb25zLWNvbCwgdGhleSBtYXkgbm90IGJlIGRpc3BsYXllZCBjb3JyZWN0bHkuIFlvdSBjYW4gdXNlIG9ubHkgb25lIHZlcnRpY2FsLWFsaWduLlsvZW5dXG4gKiAgIFtqYV1BbmRyb2lkIDQuM+S7peWJjeOAgeOCguOBl+OBj+OBr2lPUyA25Lul5YmN44GuT1Pjga7loLTlkIjjgIFvbnMtcm9344Gob25zLWNvbOOCkue1hOOBv+WQiOOCj+OBm+OBpuOBneOCjOOBnuOCjOOBrm9ucy1jb2zopoHntKDjga52ZXJ0aWNhbC1hbGlnbuWxnuaAp+OBruWApOOBq+WIpeOAheOBruWApOOCkuaMh+WumuOBmeOCi+OBqOOAgeaPj+eUu+OBjOW0qeOCjOOCi+WgtOWQiOOBjOOBguOCiuOBvuOBmeOAgnZlcnRpY2FsLWFsaWdu5bGe5oCn44Gu5YCk44Gr44Gv5LiA44Gk44Gu5YCk44Gg44GR44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXJvdz5cbiAqICAgPG9ucy1jb2wgd2lkdGg9XCI1MHB4XCI+PG9ucy1pY29uIGljb249XCJmYS10d2l0dGVyXCI+PC9vbnMtaWNvbj48L29ucy1jb2w+XG4gKiAgIDxvbnMtY29sPlRleHQ8L29ucy1jb2w+XG4gKiA8L29ucy1yb3c+XG4gKi9cblxuLyoqXG4gKiBAYXR0cmlidXRlIHZlcnRpY2FsLWFsaWduXG4gKiBAdHlwZSB7U3RyaW5nfVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1TaG9ydCBoYW5kIGF0dHJpYnV0ZSBmb3IgYWxpZ25pbmcgdmVydGljYWxseS4gVmFsaWQgdmFsdWVzIGFyZSB0b3AsIGJvdHRvbSwgYW5kIGNlbnRlci5bL2VuXVxuICogICBbamFd57im44Gr5pW05YiX44GZ44KL44Gf44KB44Gr5oyH5a6a44GX44G+44GZ44CCdG9w44CBYm90dG9t44CBY2VudGVy44Gu44GE44Ga44KM44GL44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3dFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xufVxuXG5vbnNFbGVtZW50cy5Sb3cgPSBSb3dFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtcm93JywgUm93RWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ3NlZ21lbnQnO1xuY29uc3Qgc2NoZW1lID0ge1xuICAnJzogJ3NlZ21lbnQtLSonLFxuICAnLnNlZ21lbnRfX2l0ZW0nOiAnc2VnbWVudC0tKl9faXRlbScsXG4gICcuc2VnbWVudF9faW5wdXQnOiAnc2VnbWVudC0tKl9faW5wdXQnLFxuICAnLnNlZ21lbnRfX2J1dHRvbic6ICdzZWdtZW50LS0qX19idXR0b24nXG59O1xuXG5jb25zdCBnZW5lcmF0ZUlkID0gKCgpID0+IHtcbiAgbGV0IGkgPSAwO1xuICByZXR1cm4gKCkgPT4gJ29ucy1zZWdtZW50LWdlbi0nICsgKGkrKyk7XG59KSgpO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1zZWdtZW50XG4gKiBAY2F0ZWdvcnkgY29udHJvbFxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1NYXRlcmlhbCBEZXNpZ24gc2VnbWVudFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1cbiAqICAgICBTZWdtZW50IGNvbXBvbmVudC4gVXNlIHRoaXMgY29tcG9uZW50IHRvIGhhdmUgYSBidXR0b24gYmFyIHdpdGggYXV0b21hdGljIHN0eWxlcyB0aGF0IHN3aXRjaCBvbiBjbGljayBvZiBhbm90aGVyIGJ1dHRvbi5cbiAqXG4gKiAgICAgV2lsbCBhdXRvbWF0aWNhbGx5IGRpc3BsYXkgYXMgYSBNYXRlcmlhbCBEZXNpZ24gc2VnbWVudCBvbiBBbmRyb2lkLlxuICogICBbL2VuXVxuICogICBbamFdWy9qYV1cbiAqIEBjb2RlcGVuIGhMYXl4XG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2Uvc2VnbWVudFxuICogQGd1aWRlIHRoZW1pbmcuaHRtbCNtb2RpZmllcnMgW2VuXU1vcmUgZGV0YWlscyBhYm91dCB0aGUgYG1vZGlmaWVyYCBhdHRyaWJ1dGVbL2VuXVtqYV1tb2RpZmllcuWxnuaAp+OBruS9v+OBhOaWuVsvamFdXG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI2Nyb3NzLXBsYXRmb3JtLXN0eWxpbmctYXV0b3N0eWxpbmcgW2VuXUluZm9ybWF0aW9uIGFib3V0IGNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2VuXVtqYV1JbmZvcm1hdGlvbiBhYm91dCBjcm9zcyBwbGF0Zm9ybSBzdHlsaW5nWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXNlZ21lbnQ+XG4gKiAgIDxvbnMtYnV0dG9uPkxhYmVsIDE8L29ucy1idXR0b24+XG4gKiAgIDxvbnMtYnV0dG9uPkxhYmVsIDI8L29ucy1idXR0b24+XG4gKiAgIDxvbnMtYnV0dG9uPkxhYmVsIDM8L29ucy1idXR0b24+XG4gKiA8L29ucy1zZWdtZW50PlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlZ21lbnRFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdGNoYW5nZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZXMgYWZ0ZXIgdGhlIGFjdGl2ZSBidXR0b24gaXMgY2hhbmdlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5pbmRleFxuICAgKiAgIFtlbl1UYXBwZWQgYnV0dG9uIGluZGV4LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5zZWdtZW50SXRlbVxuICAgKiAgIFtlbl1TZWdtZW50IGl0ZW0gb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBzZWdtZW50LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdGFiYmFyLWlkXG4gICAqIEBpbml0b25seVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JRCBvZiB0aGUgdGFiYmFyIGVsZW1lbnQgdG8gXCJjb25uZWN0XCIgdG8gdGhlIHNlZ21lbnQuIE11c3QgYmUgaW5zaWRlIHRoZSBzYW1lIHBhZ2UuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhY3RpdmUtaW5kZXhcbiAgICogQGRlZmF1bHQgMFxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JbmRleCBvZiB0aGUgYWN0aXZlIGJ1dHRvbi4gSWYgYSB0YWJiYXIgaXMgY29ubmVjdGVkLCB0aGlzIHdpbGwgYmUgc2V0IHRvIHRoZSB0YWJiYXIncyBhY3RpdmUgaW5kZXguWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFjdGl2ZUluZGV4XG4gICAqIEBkZWZhdWx0IDBcbiAgICogQHR5cGUge051bWJlcn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSW5kZXggb2YgdGhlIGFjdGl2ZSBidXR0b24uIElmIGEgdGFiYmFyIGlzIGNvbm5lY3RlZCwgdGhpcyB3aWxsIGJlIHNldCB0byB0aGUgdGFiYmFyJ3MgYWN0aXZlIGluZGV4LlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgaWYgc2VnbWVudCBzaG91bGQgYmUgZGlzYWJsZWQuWy9lbl1cbiAgICogICBbamFd44Oc44K/44Oz44KS54Sh5Yq55YyW44GZ44KL5aC05ZCI44Gv5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fc2VnbWVudElkID0gZ2VuZXJhdGVJZCgpO1xuICAgIHRoaXMuX3RhYmJhciA9IG51bGw7XG4gICAgdGhpcy5fb25DaGFuZ2UgPSB0aGlzLl9vbkNoYW5nZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uVGFiYmFyUHJlQ2hhbmdlID0gdGhpcy5fb25UYWJiYXJQcmVDaGFuZ2UuYmluZCh0aGlzKTtcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5fbGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fdGFiYmFyID8gdGhpcy5fdGFiYmFyLmdldEFjdGl2ZVRhYkluZGV4KCkgOiB0aGlzLmdldEFjdGl2ZUJ1dHRvbkluZGV4KCkpO1xuICAgIH0pO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKGRlZmF1bHRDbGFzc05hbWUpO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmNoaWxkcmVuW2luZGV4XTtcbiAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnc2VnbWVudF9faXRlbScpO1xuXG4gICAgICBjb25zdCBpbnB1dCA9IHV0aWwuZmluZENoaWxkKGl0ZW0sICcuc2VnbWVudF9faW5wdXQnKSB8fCB1dGlsLmNyZWF0ZSgnaW5wdXQuc2VnbWVudF9faW5wdXQnKTtcbiAgICAgIGlucHV0LnR5cGUgPSAncmFkaW8nO1xuICAgICAgaW5wdXQudmFsdWUgPSBpbmRleDtcbiAgICAgIGlucHV0Lm5hbWUgPSBpbnB1dC5uYW1lIHx8IHRoaXMuX3NlZ21lbnRJZDtcbiAgICAgIGlucHV0LmNoZWNrZWQgPSAhdGhpcy5oYXNBdHRyaWJ1dGUoJ3RhYmJhci1pZCcpICYmIGluZGV4ID09PSAodGhpcy5hY3RpdmVJbmRleCB8fCAwKTtcblxuICAgICAgY29uc3QgYnV0dG9uID0gdXRpbC5maW5kQ2hpbGQoaXRlbSwgJy5zZWdtZW50X19idXR0b24nKSB8fCB1dGlsLmNyZWF0ZSgnLnNlZ21lbnRfX2J1dHRvbicpO1xuICAgICAgaWYgKGJ1dHRvbi5wYXJlbnRFbGVtZW50ICE9PSBpdGVtKSB7XG4gICAgICAgIHdoaWxlIChpdGVtLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICBidXR0b24uYXBwZW5kQ2hpbGQoaXRlbS5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpdGVtLmFwcGVuZENoaWxkKGlucHV0KTtcbiAgICAgIGl0ZW0uYXBwZW5kQ2hpbGQoYnV0dG9uKTtcbiAgICB9XG5cbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCd0YWJiYXItaWQnKSkge1xuICAgICAgICBjb25zdCBwYWdlID0gdXRpbC5maW5kUGFyZW50KHRoaXMsICdvbnMtcGFnZScpO1xuICAgICAgICB0aGlzLl90YWJiYXIgPSBwYWdlICYmIHBhZ2UucXVlcnlTZWxlY3RvcignIycgKyB0aGlzLmdldEF0dHJpYnV0ZSgndGFiYmFyLWlkJykpO1xuICAgICAgICBpZiAoIXRoaXMuX3RhYmJhciB8fCB0aGlzLl90YWJiYXIudGFnTmFtZSAhPT0gJ09OUy1UQUJCQVInKSB7XG4gICAgICAgICAgdXRpbC50aHJvdyhgTm8gdGFiYmFyIHdpdGggaWQgJHt0aGlzLmdldEF0dHJpYnV0ZSgndGFiYmFyLWlkJyl9IHdhcyBmb3VuZC5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3RhYmJhci5zZXRBdHRyaWJ1dGUoJ2hpZGUtdGFicycsICcnKTtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3RhYmJhci5nZXRBY3RpdmVUYWJJbmRleCgpO1xuICAgICAgICAgIHRoaXMuX3NldENoZWNrZWQoaW5kZXgpO1xuICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSBpbmRleDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fdGFiYmFyLmFkZEV2ZW50TGlzdGVuZXIoJ3ByZWNoYW5nZScsIHRoaXMuX29uVGFiYmFyUHJlQ2hhbmdlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5fb25DaGFuZ2UpO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl90YWJiYXIpIHtcbiAgICAgICAgdGhpcy5fdGFiYmFyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3ByZWNoYW5nZScsIHRoaXMuX29uVGFiYmFyUHJlQ2hhbmdlKTtcbiAgICAgICAgdGhpcy5fdGFiYmFyID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX29uQ2hhbmdlKTtcbiAgfVxuXG4gIF9zZXRDaGVja2VkKGluZGV4KSB7XG4gICAgdGhpcy5jaGlsZHJlbltpbmRleF0uZmlyc3RFbGVtZW50Q2hpbGQuY2hlY2tlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzZXRBY3RpdmVCdXR0b25cbiAgICogQHNpZ25hdHVyZSBzZXRBY3RpdmVCdXR0b24oaW5kZXgsIFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4XG4gICAqICAgW2VuXUJ1dHRvbiBpbmRleC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QsIHdvcmtzIG9ubHkgaWYgdGhlcmUgaXMgYSBjb25uZWN0ZWQgdGFiYmFyLiBTdXBwb3J0cyB0aGUgc2FtZSBvcHRpb25zIGFzIGBvbnMtdGFiYmFyYCdzIGBzZXRBY3RpdmVUYWJgIG1ldGhvZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dTWFrZSBidXR0b24gd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4IGFjdGl2ZS4gSWYgdGhlcmUgaXMgYSBjb25uZWN0ZWQgdGFiYmFyIGl0IHNob3dzIHRoZSBjb3JyZXNwb25kaW5nIHRhYiBwYWdlLiBJbiB0aGlzIGNhc2UgYW5pbWF0aW9ucyBhbmQgdGhlaXIgb3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSBzZWNvbmQgcGFyYW1ldGVyLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBzZWxlY3RlZCBpbmRleCBvciB0byB0aGUgbmV3IHBhZ2UgZWxlbWVudCBpZiB0aGVyZSBpcyBhIGNvbm5lY3RlZCB0YWJiYXIuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIHNldEFjdGl2ZUJ1dHRvbihpbmRleCwgb3B0aW9ucykge1xuICAgIGlmICh0aGlzLl90YWJiYXIpIHtcbiAgICAgIHJldHVybiB0aGlzLl90YWJiYXIuc2V0QWN0aXZlVGFiKGluZGV4LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zZXRDaGVja2VkKGluZGV4KTtcbiAgICB0aGlzLl9wb3N0Q2hhbmdlKGluZGV4KTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGdldEFjdGl2ZUJ1dHRvbkluZGV4XG4gICAqIEBzaWduYXR1cmUgZ2V0QWN0aXZlQnV0dG9uSW5kZXgoKVxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqICAgW2VuXVRoZSBpbmRleCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBidXR0b24uWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJldHVybnMgYnV0dG9uIGluZGV4IG9mIGN1cnJlbnQgYWN0aXZlIGJ1dHRvbi4gSWYgYWN0aXZlIGJ1dHRvbiBpcyBub3QgZm91bmQsIHJldHVybnMgLTEuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG4gIGdldEFjdGl2ZUJ1dHRvbkluZGV4KCkge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7IC8vIEFycmF5LmZpbmRJbmRleFxuICAgICAgaWYgKHRoaXMuY2hpbGRyZW5baV0uZmlyc3RFbGVtZW50Q2hpbGQuY2hlY2tlZCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgX29uQ2hhbmdlKGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5fdGFiYmFyXG4gICAgICA/IHRoaXMuX3RhYmJhci5zZXRBY3RpdmVUYWIodGhpcy5nZXRBY3RpdmVCdXR0b25JbmRleCgpLCB7IHJlamVjdDogZmFsc2UgfSlcbiAgICAgIDogdGhpcy5fcG9zdENoYW5nZSh0aGlzLmdldEFjdGl2ZUJ1dHRvbkluZGV4KCkpO1xuICB9XG5cbiAgX29uVGFiYmFyUHJlQ2hhbmdlKGV2ZW50KSB7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgIGlmICghZXZlbnQuZGV0YWlsLmNhbmNlbGVkKSB7XG4gICAgICAgIHRoaXMuX3NldENoZWNrZWQoZXZlbnQuaW5kZXgpO1xuICAgICAgICB0aGlzLl9wb3N0Q2hhbmdlKGV2ZW50LmluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9wb3N0Q2hhbmdlKGluZGV4KSB7XG4gICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdwb3N0Y2hhbmdlJywge1xuICAgICAgaW5kZXgsXG4gICAgICBhY3RpdmVJbmRleDogaW5kZXgsXG4gICAgICBsYXN0QWN0aXZlSW5kZXg6IHRoaXMuX2xhc3RBY3RpdmVJbmRleCxcbiAgICAgIHNlZ21lbnRJdGVtOiB0aGlzLmNoaWxkcmVuW2luZGV4XVxuICAgIH0pO1xuICAgIHRoaXMuX2xhc3RBY3RpdmVJbmRleCA9IGluZGV4O1xuICAgIHRoaXMuYWN0aXZlSW5kZXggPSBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBzZWdtZW50IGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICBnZXQgYWN0aXZlSW5kZXgoKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdhY3RpdmUtaW5kZXgnKSk7XG4gIH1cblxuICBzZXQgYWN0aXZlSW5kZXgodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FjdGl2ZS1pbmRleCcsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydjbGFzcycsICdtb2RpZmllcicsICdhY3RpdmUtaW5kZXgnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIGRlZmF1bHRDbGFzc05hbWUsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhY3RpdmUtaW5kZXgnOlxuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmdldEFjdGl2ZUJ1dHRvbkluZGV4KCkgIT09IHRoaXMuYWN0aXZlSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlQnV0dG9uKHRoaXMuYWN0aXZlSW5kZXgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXQgZXZlbnRzKCkge1xuICAgIHJldHVybiBbJ3Bvc3RjaGFuZ2UnXTtcbiAgfVxufVxuXG51dGlsLmRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzKFNlZ21lbnRFbGVtZW50LCBbJ2Rpc2FibGVkJ10pO1xuXG5vbnNFbGVtZW50cy5TZWdtZW50ID0gU2VnbWVudEVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1zZWdtZW50JywgU2VnbWVudEVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuY29uc3Qgc2NoZW1lID0ge1xuICAnJzogJ3NlbGVjdC0qIHNlbGVjdC0tKicsXG4gICcuc2VsZWN0LWlucHV0JzogJ3NlbGVjdC1pbnB1dC0tKidcbn07XG5cbmNvbnN0IGRlZmF1bHRDbGFzc05hbWUgPSAnc2VsZWN0JztcblxuY29uc3QgSU5QVVRfQVRUUklCVVRFUyA9IFtcbiAgJ2F1dG9mb2N1cycsXG4gICdkaXNhYmxlZCcsXG4gICdmb3JtJyxcbiAgJ211bHRpcGxlJyxcbiAgJ25hbWUnLFxuICAncmVxdWlyZWQnLFxuICAnc2l6ZSdcbl07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXNlbGVjdFxuICogQGNhdGVnb3J5IGZvcm1cbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogIFtlbl1EaXNwbGF5cyBhIE1hdGVyaWFsIERlc2lnbiBzZWxlY3QgaW5wdXQuWy9lbl1cbiAqICBbamFdWy9qYV1cbiAqIEBtb2RpZmllciB1bmRlcmJhclxuICogIFtlbl1EaXNwbGF5cyBhIGhvcml6b250YWwgbGluZSB1bmRlcm5lYXRoIGEgc2VsZWN0IGlucHV0LlsvZW5dXG4gKiAgW2phXVsvamFdXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIFNlbGVjdCBjb21wb25lbnQuIElmIHlvdSB3YW50IHRvIHBsYWNlIGEgc2VsZWN0IHdpdGggYW4gSUQgb2YgYG15LWlkYCBvbiBhIHBhZ2UsIHVzZSBgPG9ucy1zZWxlY3Qgc2VsZWN0LWlkPVwibXktaWRcIj5gLlxuICpcbiAqICAgICBUaGUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSBkaXNwbGF5IGFzIGEgTWF0ZXJpYWwgRGVzaWduIHNlbGVjdCBvbiBBbmRyb2lkLlxuICpcbiAqICAgICBNb3N0IGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYSBub3JtYWwgYDxzZWxlY3Q+YCBlbGVtZW50IGNhbiBhbHNvIGJlIHVzZWQgb24gdGhlIGA8b25zLXNlbGVjdD5gIGVsZW1lbnQuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV3jgrvjg6zjgq/jg4jjg5zjg4Pjgq/jgrnjgpLooajnpLrjgZnjgovjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgafjgZnjgIJgc2VsZWN0YCDopoHntKDjgavkvb/nlKjjgafjgY3jgovlsZ7mgKfjga7lpJrjgY/jgYwgYG9ucy1zZWxlY3RgIOimgee0oOOBp+OCguWIqeeUqOOBp+OBjeOBvuOBmeOAglsvamFdXG4gKiBAY29kZXBlbiBoTGF5eFxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3NlbGVjdFxuICogQGd1aWRlIHRoZW1pbmcuaHRtbCNtb2RpZmllcnMgW2VuXU1vcmUgZGV0YWlscyBhYm91dCB0aGUgYG1vZGlmaWVyYCBhdHRyaWJ1dGVbL2VuXVtqYV1tb2RpZmllcuWxnuaAp+OBruS9v+OBhOaWuVsvamFdXG4gKiBAZ3VpZGUgdGhlbWluZy5odG1sI2Nyb3NzLXBsYXRmb3JtLXN0eWxpbmctYXV0b3N0eWxpbmcgW2VuXUluZm9ybWF0aW9uIGFib3V0IGNyb3NzIHBsYXRmb3JtIHN0eWxpbmdbL2VuXVtqYV1JbmZvcm1hdGlvbiBhYm91dCBjcm9zcyBwbGF0Zm9ybSBzdHlsaW5nWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXNlbGVjdD5cbiAqICAgPG9wdGlvbiB2YWx1ZT1cIjFcIj4xPC9vcHRpb24+XG4gKiAgIDxvcHRpb24gdmFsdWU9XCIyXCI+Mm5kPC9vcHRpb24+XG4gKiAgIDxvcHRpb24gdmFsdWU9XCIzXCI+M3JkIG9wdGlvbjwvb3B0aW9uPlxuICogPC9vbnMtc2VsZWN0PlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVjdEVsZW1lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYXV0b2ZvY3VzXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1FbGVtZW50IGF1dG9tYXRpY2FsbHkgZ2FpbnMgZm9jdXMgb24gcGFnZSBsb2FkLlsvZW5dXG4gICAqICBbamFd44Oa44O844K444Ot44O844OJ5pmC44Gr44GT44Gu44K744Os44Kv44OI44Oc44OD44Kv44K544Gr44OV44Kp44O844Kr44K544GM56e744KL44KI44GG44Gr44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TcGVjaWZ5IGlmIHNlbGVjdCBpbnB1dCBzaG91bGQgYmUgZGlzYWJsZWQuWy9lbl1cbiAgICogICBbamFd44GT44Gu44K744Os44Kv44OI44Oc44OD44Kv44K544KS54Sh5Yq55YyW44GZ44KL5aC05ZCI44Gr5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZm9ybVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dQXNzb2NpYXRlIGEgc2VsZWN0IGVsZW1lbnQgdG8gYW4gZXhpc3RpbmcgZm9ybSBvbiB0aGUgcGFnZSwgZXZlbiBpZiBub3QgbmVzdGVkLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruOCu+ODrOOCr+ODiOODnOODg+OCr+OCueOCkuOAgeaMh+WumuOBl+OBnyBgZm9ybWAg6KaB57Sg44Gr57SQ5LuY44GR44G+44GZ44CC44K744Os44Kv44OI44Oc44OD44Kv44K544KSIGBmb3JtYCDopoHntKDjga7lpJblgbTjgavphY3nva7jgZnjgovpmpvjgavkvb/nlKjjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtdWx0aXBsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgbXVsdGlwbGUgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgYXQgb25jZS5bL2VuXVxuICAgKiAgW2phXemBuOaKnuiCouOBruikh+aVsOmBuOaKnuOCkuacieWKueOBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG5hbWVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXU5hbWUgdGhlIHNlbGVjdCBlbGVtZW50LCB1c2VmdWwgZm9yIGluc3RhbmNlIGlmIGl0IGlzIHBhcnQgb2YgYSBmb3JtLlsvZW5dXG4gICAqICAgW2phXeOBk+OBruOCu+ODrOOCr+ODiOODnOODg+OCr+OCueOBruWQjeWJjeOCkuaMh+WumuOBl+OBvuOBmeOAgumAmuW4uCBgZm9ybWAg6KaB57Sg44Go5YWx44Gr5L2/55So44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgcmVxdWlyZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1NYWtlIHRoZSBzZWxlY3QgaW5wdXQgcmVxdWlyZWQgZm9yIHN1Ym1pdHRpbmcgdGhlIGZvcm0gaXQgaXMgcGFydCBvZi5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7jgrvjg6zjgq/jg4jjg5zjg4Pjgq/jgrnjgpLlhaXlipvlv4XpoIjjgavjgZnjgovloLTlkIjjgavmjIflrprjgZfjgb7jgZnjgILpgJrluLggYGZvcm1gIOimgee0oOOBqOWFseOBq+S9v+eUqOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHNlbGVjdC1pZFxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSUQgZ2l2ZW4gdG8gdGhlIGlubmVyIHNlbGVjdCwgdXNlZnVsIGZvciBkeW5hbWljIG1hbmlwdWxhdGlvbi5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7jgrvjg6zjgq/jg4jjg5zjg4Pjgq/jgrnjgYzlhoXpg6jjgavmjIHjgaQgc2VsZWN0IOimgee0oOOBq+S4juOBiOOCiyBJRCDjgpLmjIflrprjgZfjgb7jgZnjgILjgrvjg6zjgq/jg4jjg5zjg4Pjgq/jgrnjga7lhoXlrrnjgpLli5XnmoTjgavlpInmm7TjgZnjgovlv4XopoHjgYzjgYLjgovloLTlkIjjgavkvb/nlKjjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzaXplXG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZWZhdWx0IDFcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUhvdyBtYW55IG9wdGlvbnMgYXJlIGRpc3BsYXllZDsgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiB0aGUgc2l6ZSB0aGVuIGEgc2Nyb2xsIGFwcGVhcnMgdG8gbmF2aWdhdGUgdGhlbS5bL2VuXVxuICAgKiAgIFtqYV3kuIDluqbjgavooajnpLrjgZnjgovpgbjmip7ogqLjga7lgIvmlbDjgpLmjIflrprjgZfjgb7jgZnjgILpgbjmip7ogqLjgYzjgZPjga7lsZ7mgKfjgafmjIflrprjgZfjgZ/lgIvmlbDjgojjgorjgoLlpJrjgYTloLTlkIjjgIHjgrnjgq/jg63jg7zjg6vjgYzmnInlirnjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX2NvbXBpbGUoKSk7XG5cbiAgICB0aGlzLl9kZXJpdmVHZXR0ZXJzKCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydtb2RpZmllcicsICdjbGFzcycsIC4uLklOUFVUX0FUVFJJQlVURVNdO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgdXRpbC5yZXN0b3JlQ2xhc3ModGhpcywgZGVmYXVsdENsYXNzTmFtZSwgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtb2RpZmllcic6XG4gICAgICAgIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoSU5QVVRfQVRUUklCVVRFUy5pbmRleE9mKG5hbWUpID49IDApIHtcbiAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl91cGRhdGVCb3VuZEF0dHJpYnV0ZXMoKSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IF9zZWxlY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3Rvcignc2VsZWN0Jyk7XG4gIH1cblxuICBfdXBkYXRlQm91bmRBdHRyaWJ1dGVzKCkge1xuICAgIElOUFVUX0FUVFJJQlVURVMuZm9yRWFjaCgoYXR0cikgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKGF0dHIpKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdC5zZXRBdHRyaWJ1dGUoYXR0ciwgdGhpcy5nZXRBdHRyaWJ1dGUoYXR0cikpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdC5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IGxlbmd0aFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dTnVtYmVyIG9mIG9wdGlvbnMgaW4gdGhlIHNlbGVjdCBib3guWy9lbl1cbiAgICogICBbamFd44GT44Gu44K744Os44Kv44OI44Oc44OD44Kv44K544Gr5ZCr44G+44KM44KL6YG45oqe6IKi44Gu5YCL5pWw44KS6L+U44GX44G+44GZ44CCIGBzZWxlY3RgIOimgee0oFsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb3B0aW9uc1xuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU2V2ZXJhbCBvcHRpb25zIGZvciBoYW5kbGluZyB0aGUgc2VsZWN0IERPTSBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44GT44Gu44K744Os44Kv44OI44Oc44OD44Kv44K544Gr5ZCr44G+44KM44KLIGBvcHRpb25gIOimgee0oOOBrumFjeWIl+OCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgc2VsZWN0ZWRJbmRleFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSW5kZXggb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24uWy9lbl1cbiAgICogICBbamFd54++5Zyo6YG45oqe44GV44KM44Gm44GE44KL6YG45oqe6IKi44Gu44Kk44Oz44OH44OD44Kv44K544KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2YWx1ZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVmFsdWUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24uWy9lbl1cbiAgICogICBbamFd54++5Zyo6YG45oqe44GV44KM44Gm44GE44KL6YG45oqe6IKi44Gu5YCk44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuXG4gICAgdGhpcy5jbGFzc0xpc3QuYWRkKGRlZmF1bHRDbGFzc05hbWUpO1xuICAgIGNvbnN0IHNlbCA9IHRoaXMuX3NlbGVjdCB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWxlY3QnKTtcbiAgICBpZiAoIXNlbC5pZCAmJiB0aGlzLmhhc0F0dHJpYnV0ZSgnc2VsZWN0LWlkJykpIHtcbiAgICAgIHNlbC5pZCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdzZWxlY3QtaWQnKTtcbiAgICB9XG4gICAgc2VsLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdC1pbnB1dCcpO1xuICAgIGlmICghdGhpcy5fc2VsZWN0KSB7XG4gICAgICB1dGlsLmFycmF5RnJvbSh0aGlzLmNoaWxkTm9kZXMpLmZvckVhY2goZWxlbWVudCA9PiBzZWwuYXBwZW5kQ2hpbGQoZWxlbWVudCkpO1xuICAgICAgdGhpcy5hcHBlbmRDaGlsZChzZWwpO1xuICAgIH1cblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxuXG4gIF9kZXJpdmVHZXR0ZXJzKCkge1xuICAgIFsnZGlzYWJsZWQnLCAnbGVuZ3RoJywgJ211bHRpcGxlJywgJ25hbWUnLCAnb3B0aW9ucycsICdzZWxlY3RlZEluZGV4JywgJ3NpemUnLCAndmFsdWUnLCAnZm9ybScsICd0eXBlJ11cbiAgICAgIC5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX3NlbGVjdFtrZXldLFxuICAgICAgICAgIHNldDogWydmb3JtJywgJ3R5cGUnXS5pbmRleE9mKGtleSkgPT09IC0xXG4gICAgICAgICAgICA/IHZhbHVlID0+IGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl9zZWxlY3Rba2V5XSA9IHZhbHVlKVxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGFkZChvcHRpb24sIGluZGV4ID0gbnVsbCkge1xuICAgIHRoaXMuX3NlbGVjdC5hZGQob3B0aW9uLCBpbmRleCk7XG4gIH1cblxuICAvLyBJZiBjYWxsZWQgd2l0aCBhbiBpbmRleCBhcmd1bWVudCwgcmVtb3ZlcyB0aGUgb3B0aW9uIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaW5kZXguXG4gIC8vIElmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cywgcmVtb3ZlcyB0aGlzLlxuICAvLyBUaGlzIGJlaGF2aW91ciBtaWdodCBzb3VuZCBjcmF6eSBidXQgaXQgaXMgdGhlIHNhbWUgYXMgPHNlbGVjdD4ncyBgcmVtb3ZlYCBtZXRob2QuXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IVE1MU2VsZWN0RWxlbWVudC9yZW1vdmVcbiAgcmVtb3ZlKGluZGV4KSB7XG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIEVsZW1lbnQucHJvdG90eXBlLnJlbW92ZS5jYWxsKHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3QucmVtb3ZlKGluZGV4KTtcbiAgICB9XG4gIH1cbn1cblxub25zRWxlbWVudHMuU2VsZWN0ID0gU2VsZWN0RWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXNlbGVjdCcsIFNlbGVjdEVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ2ZhYiBmYWItLW1pbmkgc3BlZWQtZGlhbF9faXRlbSc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJyc6ICdmYWItLSogc3BlZWQtZGlhbF9faXRlbS0tKidcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXNwZWVkLWRpYWwtaXRlbVxuICogQGNhdGVnb3J5IGNvbnRyb2xcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgVGhpcyBjb21wb25lbnQgZGlzcGxheXMgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBNYXRlcmlhbCBEZXNpZ24gU3BlZWQgZGlhbCBjb21wb25lbnQuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1cbiAqICAgICBNYXRlcmlhbCBEZXNpZ27jga5TcGVlZCBkaWFs44Gu5a2Q6KaB57Sg44KS6KGo54++44GZ44KL6KaB57Sg44Gn44GZ44CCXG4gKiAgIFsvamFdXG4gKiBAY29kZXBlbiBkWVFZTGdcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9zcGVlZC1kaWFsXG4gKiBAc2VlYWxzbyBvbnMtc3BlZWQtZGlhbFxuICogICBbZW5dVGhlIGA8b25zLXNwZWVkLWRpYWw+YCBjb21wb25lbnQuWy9lbl1cbiAqICAgW2phXW9ucy1zcGVlZC1kaWFs44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1mYWJcbiAqICAgW2VuXW9ucy1mYWIgY29tcG9uZW50Wy9lbl1cbiAqICAgW2phXW9ucy1mYWLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtc3BlZWQtZGlhbCBwb3NpdGlvbj1cImxlZnQgYm90dG9tXCI+XG4gKiAgIDxvbnMtZmFiPlxuICogICAgIDxvbnMtaWNvbiBpY29uPVwiZmEtdHdpdHRlclwiPjwvb25zLWljb24+XG4gKiAgIDwvb25zLWZhYj5cbiAqICAgPG9ucy1zcGVlZC1kaWFsLWl0ZW0+QTwvb25zLXNwZWVkLWRpYWwtaXRlbT5cbiAqICAgPG9ucy1zcGVlZC1kaWFsLWl0ZW0+Qjwvb25zLXNwZWVkLWRpYWwtaXRlbT5cbiAqICAgPG9ucy1zcGVlZC1kaWFsLWl0ZW0+Qzwvb25zLXNwZWVkLWRpYWwtaXRlbT5cbiAqIDwvb25zLXNwZWVkLWRpYWw+XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNwZWVkRGlhbEl0ZW1FbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgY29tcG9uZW50LlsvZW5dXG4gICAqICAgW2phXeOBk+OBruOCs+ODs+ODneODvOODjeODs+ODiOOBruihqOePvuOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHJpcHBsZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1JZiB0aGlzIGF0dHJpYnV0ZSBpcyBkZWZpbmVkLCB0aGUgYnV0dG9uIHdpbGwgaGF2ZSBhIHJpcHBsZSBlZmZlY3Qgd2hlbiB0YXBwZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHJpcHBsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBwcm9wZXJ0eSBpcyBkZWZpbmVkLCB0aGUgYnV0dG9uIHdpbGwgaGF2ZSBhIHJpcHBsZSBlZmZlY3Qgd2hlbiB0YXBwZWQuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fY29tcGlsZSgpO1xuICAgIHRoaXMuX2JvdW5kT25DbGljayA9IHRoaXMuX29uQ2xpY2suYmluZCh0aGlzKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ3JpcHBsZScsICdjbGFzcyddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ2NsYXNzJzpcbiAgICAgICAgdXRpbC5yZXN0b3JlQ2xhc3ModGhpcywgZGVmYXVsdENsYXNzTmFtZSwgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtb2RpZmllcic6XG4gICAgICAgIE1vZGlmaWVyVXRpbC5vbk1vZGlmaWVyQ2hhbmdlZChsYXN0LCBjdXJyZW50LCB0aGlzLCBzY2hlbWUpO1xuICAgICAgICB1dGlsLmFkZE1vZGlmaWVyKHRoaXMsICdtaW5pJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlwcGxlJzpcbiAgICAgICAgdGhpcy5fdXBkYXRlUmlwcGxlKCk7XG4gICAgfVxuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kT25DbGljaywgZmFsc2UpO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kT25DbGljaywgZmFsc2UpO1xuICB9XG5cbiAgX3VwZGF0ZVJpcHBsZSgpIHtcbiAgICB1dGlsLnVwZGF0ZVJpcHBsZSh0aGlzKTtcbiAgfVxuXG4gIF9vbkNsaWNrKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG5cbiAgICBkZWZhdWx0Q2xhc3NOYW1lLnNwbGl0KC9cXHMrLykuZm9yRWFjaCh0b2tlbiA9PiB0aGlzLmNsYXNzTGlzdC5hZGQodG9rZW4pKTtcblxuICAgIHV0aWwuYWRkTW9kaWZpZXIodGhpcywgJ21pbmknKTtcbiAgICB0aGlzLl91cGRhdGVSaXBwbGUoKTtcblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgc2NoZW1lKTtcbiAgfVxufVxuXG51dGlsLmRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzKFNwZWVkRGlhbEl0ZW1FbGVtZW50LCBbJ3JpcHBsZSddKTtcblxub25zRWxlbWVudHMuU3BlZWREaWFsSXRlbSA9IFNwZWVkRGlhbEl0ZW1FbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtc3BlZWQtZGlhbC1pdGVtJywgU3BlZWREaWFsSXRlbUVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5pbXBvcnQgc3R5bGVyIGZyb20gJy4uL29ucy9zdHlsZXIuanMnO1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ3NwZWVkLWRpYWwnO1xuY29uc3Qgc2NoZW1lID0ge1xuICAnJzogJ3NwZWVkLWRpYWwtLSonLFxufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtc3BlZWQtZGlhbFxuICogQGNhdGVnb3J5IGNvbnRyb2xcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgRWxlbWVudCB0aGF0IGRpc3BsYXlzIGEgTWF0ZXJpYWwgRGVzaWduIFNwZWVkIERpYWxvZyBjb21wb25lbnQuIEl0IGlzIHVzZWZ1bCB3aGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHByaW1hcnkgYWN0aW9uIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBpbiBhIHBhZ2UuXG4gKlxuICogICAgIFRoZSBTcGVlZCBkaWFsIGxvb2tzIGxpa2UgYSBgPG9ucy1mYWI+YCBlbGVtZW50IGJ1dCB3aWxsIGV4cGFuZCBhIG1lbnUgd2hlbiB0YXBwZWQuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQGNvZGVwZW4gZFlRWUxnXG4gKiBAdHV0b3JpYWwgdmFuaWxsYS9SZWZlcmVuY2Uvc3BlZWQtZGlhbFxuICogQHNlZWFsc28gb25zLXNwZWVkLWRpYWwtaXRlbVxuICogICBbZW5dVGhlIGA8b25zLXNwZWVkLWRpYWwtaXRlbT5gIHJlcHJlc2VudHMgYSBtZW51IGl0ZW0uWy9lbl1cbiAqICAgW2phXW9ucy1zcGVlZC1kaWFsLWl0ZW3jgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWZhYlxuICogICBbZW5db25zLWZhYiBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLWZhYuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy1zcGVlZC1kaWFsIHBvc2l0aW9uPVwibGVmdCBib3R0b21cIj5cbiAqICAgPG9ucy1mYWI+XG4gKiAgICAgPG9ucy1pY29uIGljb249XCJmYS10d2l0dGVyXCI+PC9vbnMtaWNvbj5cbiAqICAgPC9vbnMtZmFiPlxuICogICA8b25zLXNwZWVkLWRpYWwtaXRlbT5BPC9vbnMtc3BlZWQtZGlhbC1pdGVtPlxuICogICA8b25zLXNwZWVkLWRpYWwtaXRlbT5CPC9vbnMtc3BlZWQtZGlhbC1pdGVtPlxuICogICA8b25zLXNwZWVkLWRpYWwtaXRlbT5DPC9vbnMtc3BlZWQtZGlhbC1pdGVtPlxuICogPC9vbnMtc3BlZWQtZGlhbD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BlZWREaWFsRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IG9wZW5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHdoZW4gdGhlIG1lbnUgaXRlbXMgYXJlIHNob3duLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgY2xvc2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIHdoZW4gdGhlIG1lbnUgaXRlbXMgYXJlIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGNvbXBvbmVudC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSByaXBwbGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgdGhlIGJ1dHRvbiB3aWxsIGhhdmUgYSByaXBwbGUgZWZmZWN0IHdoZW4gdGFwcGVkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSByaXBwbGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUlmIHRoaXMgcHJvcGVydHkgaXMgZGVmaW5lZCwgdGhlIGJ1dHRvbiB3aWxsIGhhdmUgYSByaXBwbGUgZWZmZWN0IHdoZW4gdGFwcGVkLlsvZW5dXG4gICAqICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgcG9zaXRpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVxuICAgKiAgICAgU3BlY2lmeSB0aGUgdmVydGljYWwgYW5kIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIGNvbXBvbmVudC5cbiAgICogICAgIEkuZS4gdG8gZGlzcGxheSBpdCBpbiB0aGUgdG9wIHJpZ2h0IGNvcm5lciBzcGVjaWZ5IFwicmlnaHQgdG9wXCIuXG4gICAqICAgICBDaG9vc2UgZnJvbSBcInJpZ2h0XCIsIFwibGVmdFwiLCBcInRvcFwiIGFuZCBcImJvdHRvbVwiLlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVxuICAgKiAgICAg44GT44Gu6KaB57Sg44KS6KGo56S644GZ44KL5bem5Y+z44Go5LiK5LiL44Gu5L2N572u44KS5oyH5a6a44GX44G+44GZ44CCXG4gICAqICAgICDkvovjgYjjgbDjgIHlj7PkuIrjgavooajnpLrjgZnjgovloLTlkIjjgavjga9cInJpZ2h0IHRvcFwi44KS5oyH5a6a44GX44G+44GZ44CCXG4gICAqICAgICDlt6blj7PjgajkuIrkuIvjga7kvY3nva7jga7mjIflrprjgavjga/jgIFyaWdodOOBqGxlZnTjgIF0b3Djgahib3R0b23jgYzjgZ3jgozjgZ7jgozmjIflrprjgafjgY3jgb7jgZnjgIJcbiAgICogICBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXJlY3Rpb25cbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGRpcmVjdGlvbiB0aGUgaXRlbXMgYXJlIGRpc3BsYXllZC4gUG9zc2libGUgdmFsdWVzIGFyZSBcInVwXCIsIFwiZG93blwiLCBcImxlZnRcIiBhbmQgXCJyaWdodFwiLlsvZW5dXG4gICAqICAgW2phXVxuICAgKiAgICAg6KaB57Sg44GM6KGo56S644GZ44KL5pa55ZCR44KS5oyH5a6a44GX44G+44GZ44CCdXAsIGRvd24sIGxlZnQsIHJpZ2h044GM5oyH5a6a44Gn44GN44G+44GZ44CCXG4gICAqICAgWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgZGlzYWJsZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgaWYgYnV0dG9uIHNob3VsZCBiZSBkaXNhYmxlZC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZnjgovloLTlkIjjgavmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2NvbXBpbGUoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2JvdW5kT25DbGljayA9IHRoaXMuX29uQ2xpY2suYmluZCh0aGlzKTtcblxuICAgIGNvbnN0IHtvbkNvbm5lY3RlZCwgb25EaXNjb25uZWN0ZWR9ID0gdXRpbC5kZWZpbmVMaXN0ZW5lclByb3BlcnR5KHRoaXMsICdjbGljaycpO1xuICAgIHRoaXMuX2Nvbm5lY3RPbkNsaWNrID0gb25Db25uZWN0ZWQ7XG4gICAgdGhpcy5fZGlzY29ubmVjdE9uQ2xpY2sgPSBvbkRpc2Nvbm5lY3RlZDtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChkZWZhdWx0Q2xhc3NOYW1lKTtcbiAgICBhdXRvU3R5bGUucHJlcGFyZSh0aGlzKTtcbiAgICB0aGlzLl91cGRhdGVSaXBwbGUoKTtcbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG5cbiAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2RpcmVjdGlvbicpKSB7XG4gICAgICB0aGlzLl91cGRhdGVEaXJlY3Rpb24odGhpcy5nZXRBdHRyaWJ1dGUoJ2RpcmVjdGlvbicpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdXBkYXRlRGlyZWN0aW9uKCd1cCcpO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydjbGFzcycsICdtb2RpZmllcicsICdyaXBwbGUnLCAnZGlyZWN0aW9uJywgJ3Bvc2l0aW9uJywgJ29wZW4nXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIGRlZmF1bHRDbGFzc05hbWUsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyaXBwbGUnOlxuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fdXBkYXRlUmlwcGxlKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RpcmVjdGlvbic6XG4gICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl91cGRhdGVEaXJlY3Rpb24oY3VycmVudCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Bvc2l0aW9uJzpcbiAgICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29wZW4nOlxuICAgICAgICBpZiAoIXRoaXMuX2lnbm9yZU9wZW5TaWRlRWZmZWN0KSB7XG4gICAgICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHRoaXMuX3VwZGF0ZU9wZW4obGFzdCkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ib3VuZE9uQ2xpY2ssIGZhbHNlKTtcbiAgICB0aGlzLl9jb25uZWN0T25DbGljaygpO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kT25DbGljaywgZmFsc2UpO1xuICAgIHRoaXMuX2Rpc2Nvbm5lY3RPbkNsaWNrKCk7XG4gIH1cblxuICBnZXQgaXRlbXMoKSB7XG4gICAgcmV0dXJuIHV0aWwuYXJyYXlGcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgnb25zLXNwZWVkLWRpYWwtaXRlbScpKTtcbiAgfVxuXG4gIGdldCBfZmFiKCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnb25zLWZhYicpO1xuICB9XG5cbiAgX29uQ2xpY2soZXZlbnQpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCAmJiAhdGhpcy5kaXNhYmxlZCAmJiB0aGlzLnZpc2libGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9nZ2xlSXRlbXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9zaG93KCkge1xuICAgIGlmICghdGhpcy5pbmxpbmUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNob3coKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgX2hpZGUoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlubGluZSkge1xuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5oaWRlKCkudGhlbihyZXNvbHZlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfdXBkYXRlUmlwcGxlKCkge1xuICAgIGlmICh0aGlzLl9mYWIpIHtcbiAgICAgIHRoaXMuaGFzQXR0cmlidXRlKCdyaXBwbGUnKSA/IHRoaXMuX2ZhYi5zZXRBdHRyaWJ1dGUoJ3JpcHBsZScsICcnKSA6IHRoaXMuX2ZhYi5yZW1vdmVBdHRyaWJ1dGUoJ3JpcHBsZScpO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVEaXJlY3Rpb24oZGlyZWN0aW9uKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLml0ZW1zO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHN0eWxlcihjaGlsZHJlbltpXSwge1xuICAgICAgICB0cmFuc2l0aW9uRGVsYXk6IDI1ICogaSArICdtcycsXG4gICAgICAgIGJvdHRvbTogJ2F1dG8nLFxuICAgICAgICByaWdodDogJ2F1dG8nLFxuICAgICAgICB0b3A6ICdhdXRvJyxcbiAgICAgICAgbGVmdDogJ2F1dG8nXG4gICAgICB9KTtcbiAgICB9XG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ3VwJzpcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLmJvdHRvbSA9IDcyICsgNTYgKiBpICsgJ3B4JztcbiAgICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS5yaWdodCA9ICc4cHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZG93bic6XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS50b3AgPSA3MiArIDU2ICogaSArICdweCc7XG4gICAgICAgICAgY2hpbGRyZW5baV0uc3R5bGUubGVmdCA9ICc4cHgnO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS50b3AgPSAnOHB4JztcbiAgICAgICAgICBjaGlsZHJlbltpXS5zdHlsZS5yaWdodCA9IDcyICsgNTYgKiBpICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLnRvcCA9ICc4cHgnO1xuICAgICAgICAgIGNoaWxkcmVuW2ldLnN0eWxlLmxlZnQgPSA3MiArIDU2ICogaSArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB1dGlsLnRocm93KCdBcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB1cCwgZG93biwgbGVmdCBvciByaWdodC4nKTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmdldEF0dHJpYnV0ZSgncG9zaXRpb24nKTtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICAnZmFiLS10b3BfX2xlZnQnLFxuICAgICAgJ2ZhYi0tYm90dG9tX19yaWdodCcsXG4gICAgICAnZmFiLS1ib3R0b21fX2xlZnQnLFxuICAgICAgJ2ZhYi0tdG9wX19yaWdodCcsXG4gICAgICAnZmFiLS10b3BfX2NlbnRlcicsXG4gICAgICAnZmFiLS1ib3R0b21fX2NlbnRlcicpO1xuICAgIHN3aXRjaCAocG9zaXRpb24pIHtcbiAgICAgIGNhc2UgJ3RvcCByaWdodCc6XG4gICAgICBjYXNlICdyaWdodCB0b3AnOlxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2ZhYi0tdG9wX19yaWdodCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcCBsZWZ0JzpcbiAgICAgIGNhc2UgJ2xlZnQgdG9wJzpcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdmYWItLXRvcF9fbGVmdCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSByaWdodCc6XG4gICAgICBjYXNlICdyaWdodCBib3R0b20nOlxuICAgICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoJ2ZhYi0tYm90dG9tX19yaWdodCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSBsZWZ0JzpcbiAgICAgIGNhc2UgJ2xlZnQgYm90dG9tJzpcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdmYWItLWJvdHRvbV9fbGVmdCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NlbnRlciB0b3AnOlxuICAgICAgY2FzZSAndG9wIGNlbnRlcic6XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnZmFiLS10b3BfX2NlbnRlcicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NlbnRlciBib3R0b20nOlxuICAgICAgY2FzZSAnYm90dG9tIGNlbnRlcic6XG4gICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnZmFiLS1ib3R0b21fX2NlbnRlcicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIF9nZXRUcmFuc2xhdGUoKSB7XG4gICAgY29uc3QgaXNCb3R0b20gPSAodGhpcy5nZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJykgfHwgJycpLmluZGV4T2YoJ2JvdHRvbScpID49IDA7XG4gICAgY29uc3QgdHJhbnNsYXRlID0gaXNCb3R0b20gPyBgdHJhbnNsYXRlM2QoMHB4LCAtJHt1dGlsLmdsb2JhbHMuZmFiT2Zmc2V0IHx8IDB9cHgsIDBweCkgYCA6ICcnO1xuICAgIHJldHVybiB0cmFuc2xhdGU7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBzaG93XG4gICAqIEBzaWduYXR1cmUgc2hvdygpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHRoZSBzcGVlZCBkaWFsLlsvZW5dXG4gICAqICAgW2phXVNwZWVkIGRpYWzjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgc2hvdygpIHtcbiAgICB0aGlzLl9mYWIuc2hvdygpO1xuICAgIHN0eWxlcih0aGlzLCB7IHRyYW5zZm9ybTogdGhpcy5fZ2V0VHJhbnNsYXRlIH0pO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGhpZGVcbiAgICogQHNpZ25hdHVyZSBoaWRlKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUhpZGUgdGhlIHNwZWVkIGRpYWwuWy9lbl1cbiAgICogICBbamFdU3BlZWQgZGlhbOOCkumdnuihqOekuuOBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBoaWRlKCkge1xuICAgIHJldHVybiB0aGlzLmhpZGVJdGVtcygpLnRoZW4oKCk9PiB0aGlzLl9mYWIuaGlkZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHNob3dJdGVtc1xuICAgKiBAc2lnbmF0dXJlIHNob3dJdGVtcygpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHRoZSBzcGVlZCBkaWFsIGl0ZW1zLlsvZW5dXG4gICAqICAgW2phXVNwZWVkIGRpYWzjga7lrZDopoHntKDjgpLooajnpLrjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgc2hvd0l0ZW1zKCkge1xuICAgIGNvbnN0IGxhc3QgPSB0aGlzLm9wZW47XG4gICAgdGhpcy5faWdub3JlT3BlblNpZGVFZmZlY3QgPSB0cnVlO1xuICAgIHRoaXMub3BlbiA9IHRydWU7XG4gICAgdGhpcy5faWdub3JlT3BlblNpZGVFZmZlY3QgPSBmYWxzZTtcblxuICAgIHJldHVybiB0aGlzLl91cGRhdGVPcGVuKGxhc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgaGlkZUl0ZW1zXG4gICAqIEBzaWduYXR1cmUgaGlkZUl0ZW1zKClcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUhpZGUgdGhlIHNwZWVkIGRpYWwgaXRlbXMuWy9lbl1cbiAgICogICBbamFdU3BlZWQgZGlhbOOBruWtkOimgee0oOOCkumdnuihqOekuuOBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBoaWRlSXRlbXMoKSB7XG4gICAgY29uc3QgbGFzdCA9IHRoaXMub3BlbjtcbiAgICB0aGlzLl9pZ25vcmVPcGVuU2lkZUVmZmVjdCA9IHRydWU7XG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgdGhpcy5faWdub3JlT3BlblNpZGVFZmZlY3QgPSBmYWxzZTtcblxuICAgIHJldHVybiB0aGlzLl91cGRhdGVPcGVuKGxhc3QpO1xuICB9XG5cbiAgX3VwZGF0ZU9wZW4obGFzdCkge1xuICAgIC8vIHVwZGF0ZSBkaXJlY3Rpb25cbiAgICBpZiAodGhpcy5vcGVuKSB7XG4gICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2RpcmVjdGlvbicpKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZURpcmVjdGlvbih0aGlzLmdldEF0dHJpYnV0ZSgnZGlyZWN0aW9uJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlRGlyZWN0aW9uKCd1cCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB0b3RhbERlbGF5ID0gMDtcbiAgICBpZiAobGFzdCAhPT0gdGhpcy5vcGVuKSB7IC8vIGRvIG5vdGhpbmcgaWYgYWxyZWFkeSBvcGVuL2Nsb3NlZFxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLml0ZW1zO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBkZWxheSA9IDI1ICogKHRoaXMub3BlbiA/IGkgOiBjaGlsZHJlbi5sZW5ndGggLSBpKTtcbiAgICAgICAgdG90YWxEZWxheSArPSBkZWxheTtcbiAgICAgICAgc3R5bGVyKGNoaWxkcmVuW2ldLCB7XG4gICAgICAgICAgdHJhbnNmb3JtOiBgc2NhbGUoJHt0aGlzLm9wZW4gPyAxIDogMH0pYCxcbiAgICAgICAgICB0cmFuc2l0aW9uRGVsYXk6IGRlbGF5ICsgJ21zJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRvdGFsRGVsYXkgKz0gNTA7XG5cbiAgICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCB0aGlzLm9wZW4gPyAnb3BlbicgOiAnY2xvc2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZlcnJlZCA9IHV0aWwuZGVmZXIoKTtcbiAgICBzZXRUaW1lb3V0KGRlZmVycmVkLnJlc29sdmUsIHRvdGFsRGVsYXkpO1xuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBkaXNhYmxlZFxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZGlzYWJsZWQgb3Igbm90LlsvZW5dXG4gICAqICAgW2phXeeEoeWKueWMluOBleOCjOOBpuOBhOOCi+WgtOWQiOOBq2B0cnVlYOOAglsvamFdXG4gICAqL1xuICBzZXQgZGlzYWJsZWQodmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuaGlkZUl0ZW1zKCk7XG4gICAgfVxuICAgIHV0aWwuYXJyYXlGcm9tKHRoaXMuY2hpbGRyZW4pLmZvckVhY2goZSA9PiB7XG4gICAgICB1dGlsLm1hdGNoKGUsICcuZmFiJykgJiYgdXRpbC50b2dnbGVBdHRyaWJ1dGUoZSwgJ2Rpc2FibGVkJywgdmFsdWUpO1xuICAgIH0pO1xuXG4gICAgdXRpbC50b2dnbGVBdHRyaWJ1dGUodGhpcywgJ2Rpc2FibGVkJywgdmFsdWUpO1xuICB9XG5cbiAgZ2V0IGRpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgaW5saW5lXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgaW5saW5lIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg7Pjg6njgqTjg7PopoHntKDjga7loLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cbiAgZ2V0IGlubGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2lubGluZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2aXNpYmxlXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBvciBub3QuWy9lbl1cbiAgICogICBbamFd6KaB57Sg44GM6KaL44GI44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG4gIGdldCB2aXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLl9mYWIgJiYgdGhpcy5fZmFiLnZpc2libGUgJiYgdGhpcy5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZSc7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBpc09wZW5cbiAgICogQHNpZ25hdHVyZSBpc09wZW4oKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmV0dXJucyB3aGV0aGVyIHRoZSBtZW51IGlzIG9wZW4gb3Igbm90LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBpc09wZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMub3BlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG9wZW5cbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHdoZXRoZXIgdGhlIG1lbnUgaXMgb3BlbiBvciBub3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBvcGVuXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmV0dXJucyB3aGV0aGVyIHRoZSBtZW51IGlzIG9wZW4gb3Igbm90LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHRvZ2dsZVxuICAgKiBAc2lnbmF0dXJlIHRvZ2dsZSgpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Ub2dnbGUgdmlzaWJpbGl0eS5bL2VuXVxuICAgKiAgIFtqYV1TcGVlZCBkaWFs44Gu6KGo56S66Z2e6KGo56S644KS5YiH44KK5pu/44GI44G+44GZ44CCWy9qYV1cbiAgICovXG4gIHRvZ2dsZSgpIHtcbiAgICByZXR1cm4gdGhpcy52aXNpYmxlID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3coKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHRvZ2dsZUl0ZW1zXG4gICAqIEBzaWduYXR1cmUgdG9nZ2xlSXRlbXMoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVG9nZ2xlIGl0ZW0gdmlzaWJpbGl0eS5bL2VuXVxuICAgKiAgIFtqYV1TcGVlZCBkaWFs44Gu5a2Q6KaB57Sg44Gu6KGo56S66Z2e6KGo56S644KS5YiH44KK5pu/44GI44G+44GZ44CCWy9qYV1cbiAgICovXG4gIHRvZ2dsZUl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLm9wZW4gPyB0aGlzLmhpZGVJdGVtcygpIDogdGhpcy5zaG93SXRlbXMoKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZXZlbnRzKCkge1xuICAgIHJldHVybiBbJ29wZW4nLCAnY2xvc2UnXTtcbiAgfVxufVxuXG51dGlsLmRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzKFNwZWVkRGlhbEVsZW1lbnQsIFsnb3BlbicsICdyaXBwbGUnXSk7XG5cbm9uc0VsZW1lbnRzLlNwZWVkRGlhbCA9IFNwZWVkRGlhbEVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1zcGVlZC1kaWFsJywgU3BlZWREaWFsRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBpbnRlcm5hbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvaW5kZXguanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQge1BhZ2VMb2FkZXIsIGRlZmF1bHRQYWdlTG9hZGVyfSBmcm9tICcuLi9vbnMvcGFnZS1sb2FkZXIuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IHJld3JpdGFibGVzID0ge1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICByZWFkeShlbGVtZW50LCBjYWxsYmFjaykge1xuICAgIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG4gIH1cbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXNwbGl0dGVyLWNvbnRlbnRcbiAqIEBjYXRlZ29yeSBtZW51XG4gKiBAZGVzY3JpcHRpb25cbiAqICBbZW5dXG4gKiAgICBUaGUgYDxvbnMtc3BsaXR0ZXItY29udGVudD5gIGVsZW1lbnQgaXMgdXNlZCBhcyBhIGNoaWxkIGVsZW1lbnQgb2YgYDxvbnMtc3BsaXR0ZXI+YC5cbiAqXG4gKiAgICBJdCBjb250YWlucyB0aGUgbWFpbiBjb250ZW50IG9mIHRoZSBwYWdlIHdoaWxlIGA8b25zLXNwbGl0dGVyLXNpZGU+YCBjb250YWlucyB0aGUgbGlzdC5cbiAqICBbL2VuXVxuICogIFtqYV1vbnMtc3BsaXR0ZXItY29udGVudOimgee0oOOBr+OAgW9ucy1zcGxpdHRlcuimgee0oOOBruWtkOimgee0oOOBqOOBl+OBpuWIqeeUqOOBl+OBvuOBmeOAglsvamFdXG4gKiBAY29kZXBlbiByT1FPTUxcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9zcGxpdHRlclxuICogQGd1aWRlIGZ1bmRhbWVudGFscy5odG1sI21hbmFnaW5nLXBhZ2VzXG4gKiAgW2VuXU1hbmFnaW5nIG11bHRpcGxlIHBhZ2VzLlsvZW5dXG4gKiAgW2phXeikh+aVsOOBruODmuODvOOCuOOCkueuoeeQhuOBmeOCi1svamFdXG4gKiBAc2VlYWxzbyBvbnMtc3BsaXR0ZXJcbiAqICBbZW5dVGhlIGA8b25zLXNwbGl0dGVyPmAgY29tcG9uZW50IGlzIHRoZSBwYXJlbnQgZWxlbWVudC5bL2VuXVxuICogIFtqYV1vbnMtc3BsaXR0ZXLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLXNwbGl0dGVyLXNpZGVcbiAqICBbZW5dVGhlIGA8b25zLXNwbGl0dGVyLXNpZGU+YCBjb21wb25lbnQgY29udGFpbnMgdGhlIG1lbnUuWy9lbl1cbiAqICBbamFdb25zLXNwbGl0dGVyLXNpZGXjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtc3BsaXR0ZXI+XG4gKiAgIDxvbnMtc3BsaXR0ZXItY29udGVudD5cbiAqICAgICAuLi5cbiAqICAgPC9vbnMtc3BsaXR0ZXItY29udGVudD5cbiAqXG4gKiAgIDxvbnMtc3BsaXR0ZXItc2lkZSBzaWRlPVwibGVmdFwiIHdpZHRoPVwiODAlXCIgY29sbGFwc2U+XG4gKiAgICAgLi4uXG4gKiAgIDwvb25zLXNwbGl0dGVyLXNpZGU+XG4gKiA8L29ucy1zcGxpdHRlcj5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BsaXR0ZXJDb250ZW50RWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBwYWdlXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1cbiAgICogICAgIFRoZSB1cmwgb2YgdGhlIGNvbnRlbnQgcGFnZS4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0aGUgY29udGVudCB3aWxsIGJlIGxvYWRlZCBmcm9tIGEgYDx0ZW1wbGF0ZT5gIHRhZyBvciBhIHJlbW90ZSBmaWxlLlxuICAgKlxuICAgKiAgICAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBwdXQgYDxvbnMtcGFnZT5gIGVsZW1lbnQgYXMgYSBjaGlsZCBvZiB0aGUgZWxlbWVudC5cbiAgICogICBbL2VuXVxuICAgKiAgIFtqYV1vbnMtc3BsaXR0ZXItY29udGVudOimgee0oOOBq+ihqOekuuOBmeOCi+ODmuODvOOCuOOBrlVSTOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9wYWdlID0gbnVsbDtcbiAgICB0aGlzLl9wYWdlTG9hZGVyID0gZGVmYXVsdFBhZ2VMb2FkZXI7XG5cbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgcmV3cml0YWJsZXMucmVhZHkodGhpcywgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlID0gdGhpcy5fZ2V0UGFnZVRhcmdldCgpO1xuXG4gICAgICAgIGlmIChwYWdlKSB7XG4gICAgICAgICAgdGhpcy5sb2FkKHBhZ2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICghdXRpbC5tYXRjaCh0aGlzLnBhcmVudE5vZGUsICdvbnMtc3BsaXR0ZXInKSkge1xuICAgICAgdXRpbC50aHJvdygnXCJvbnMtc3BsaXR0ZXItY29udGVudFwiIG11c3QgaGF2ZSBcIm9ucy1zcGxpdHRlclwiIGFzIHBhcmVudCcpO1xuICAgIH1cbiAgfVxuXG4gIF9nZXRQYWdlVGFyZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlIHx8IHRoaXMuZ2V0QXR0cmlidXRlKCdwYWdlJyk7XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHt9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgcGFnZVxuICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgcGFnZSB0byBsb2FkIGluIHRoZSBzcGxpdHRlciBjb250ZW50LlsvZW5dXG4gICAqICAgW2phXeOBk+OBruimgee0oOWGheOBq+ihqOekuuOBmeOCi+ODmuODvOOCuOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBnZXQgcGFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IHBhZ2VcbiAgICovXG4gIHNldCBwYWdlKHBhZ2UpIHtcbiAgICB0aGlzLl9wYWdlID0gcGFnZTtcbiAgfVxuXG4gIGdldCBfY29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlblswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgcGFnZUxvYWRlclxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1QYWdlIGVsZW1lbnQgbG9hZGVkIGluIHRoZSBzcGxpdHRlciBjb250ZW50LlsvZW5dXG4gICAqICAgW2phXeOBk+OBruimgee0oOWGheOBq+ihqOekuuOBmeOCi+ODmuODvOOCuOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuICBnZXQgcGFnZUxvYWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUxvYWRlcjtcbiAgfVxuXG4gIHNldCBwYWdlTG9hZGVyKGxvYWRlcikge1xuICAgIGlmICghKGxvYWRlciBpbnN0YW5jZW9mIFBhZ2VMb2FkZXIpKSB7XG4gICAgICB1dGlsLnRocm93UGFnZUxvYWRlcigpO1xuICAgIH1cbiAgICB0aGlzLl9wYWdlTG9hZGVyID0gbG9hZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgbG9hZFxuICAgKiBAc2lnbmF0dXJlIGxvYWQocGFnZSwgW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFnZSwgW29wdGlvbnNdXG4gICAqICAgW2VuXVBhZ2UgVVJMLiBDYW4gYmUgZWl0aGVyIGFuIEhUTUwgZG9jdW1lbnQgb3IgYW4gYDx0ZW1wbGF0ZT5gIGlkLlsvZW5dXG4gICAqICAgW2phXXBhZ2Xjga5VUkzjgYvjgIFgPHRlbXBsYXRlPmDjgaflrqPoqIDjgZfjgZ/jg4bjg7Pjg5fjg6zjg7zjg4jjga5pZOWxnuaAp+OBruWApOOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuY2FsbGJhY2tdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHRoZSBwYWdlIHNwZWNpZmllZCBpbiBgcGFnZWAgaW4gdGhlIGNvbnRlbnQuWy9lbl1cbiAgICogICBbamFd5oyH5a6a44GX44GfVVJM44KS44Oh44Kk44Oz44Oa44O844K444KS6Kqt44G/6L6844G/44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIG5ldyBgPG9ucy1wYWdlPmAgZWxlbWVudFsvZW5dXG4gICAqICAgW2phXWA8b25zLXBhZ2U+YOimgee0oOOCkuino+axuuOBmeOCi1Byb21pc2Xjgqrjg5bjgrjjgqfjgq/jg4jjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cbiAgbG9hZChwYWdlLCBvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLl9wYWdlID0gcGFnZTtcbiAgICBjb25zdCBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGxldCBvbGRDb250ZW50ID0gdGhpcy5fY29udGVudCB8fCBudWxsO1xuXG4gICAgICB0aGlzLl9wYWdlTG9hZGVyLmxvYWQoe3BhZ2UsIHBhcmVudDogdGhpc30sIHBhZ2VFbGVtZW50ID0+IHtcbiAgICAgICAgaWYgKG9sZENvbnRlbnQpIHtcbiAgICAgICAgICB0aGlzLl9wYWdlTG9hZGVyLnVubG9hZChvbGRDb250ZW50KTtcbiAgICAgICAgICBvbGRDb250ZW50ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0aGlzLl9zaG93KCkpO1xuXG4gICAgICAgIGNhbGxiYWNrKHBhZ2VFbGVtZW50KTtcbiAgICAgICAgcmVzb2x2ZShwYWdlRWxlbWVudCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIF9zaG93KCkge1xuICAgIGlmICh0aGlzLl9jb250ZW50KSB7XG4gICAgICB0aGlzLl9jb250ZW50Ll9zaG93KCk7XG4gICAgfVxuICB9XG5cbiAgX2hpZGUoKSB7XG4gICAgaWYgKHRoaXMuX2NvbnRlbnQpIHtcbiAgICAgIHRoaXMuX2NvbnRlbnQuX2hpZGUoKTtcbiAgICB9XG4gIH1cblxuICBfZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fY29udGVudCkge1xuICAgICAgdGhpcy5fcGFnZUxvYWRlci51bmxvYWQodGhpcy5fY29udGVudCk7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlKCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHJld3JpdGFibGVzKCkge1xuICAgIHJldHVybiByZXdyaXRhYmxlcztcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5TcGxpdHRlckNvbnRlbnQgPSBTcGxpdHRlckNvbnRlbnRFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtc3BsaXR0ZXItY29udGVudCcsIFNwbGl0dGVyQ29udGVudEVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IG9uc0VsZW1lbnRzIGZyb20gJy4uL29ucy9lbGVtZW50cy5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgdXRpbCBmcm9tICcuLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BsaXR0ZXJNYXNrRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fYm91bmRPbkNsaWNrID0gdGhpcy5fb25DbGljay5iaW5kKHRoaXMpO1xuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wYXJlbnROb2RlLl9zaWRlcy5ldmVyeShzaWRlID0+IHNpZGUubW9kZSA9PT0gJ3NwbGl0JykpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IG5vbmUgIWltcG9ydGFudCcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX29uQ2xpY2soZXZlbnQpIHtcbiAgICBpZiAodGhpcy5vbkNsaWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIHRoaXMub25DbGljaygpO1xuICAgIH0gZWxzZSBpZiAodXRpbC5tYXRjaCh0aGlzLnBhcmVudE5vZGUsICdvbnMtc3BsaXR0ZXInKSkge1xuICAgICAgdGhpcy5wYXJlbnROb2RlLl9zaWRlcy5mb3JFYWNoKHNpZGUgPT4gc2lkZS5jbG9zZSgnbGVmdCcpLmNhdGNoKCgpID0+IHt9KSk7XG4gICAgfVxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ib3VuZE9uQ2xpY2spO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JvdW5kT25DbGljayk7XG4gIH1cbn1cblxub25zRWxlbWVudHMuU3BsaXR0ZXJNYXNrID0gU3BsaXR0ZXJNYXNrRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXNwbGl0dGVyLW1hc2snLCBTcGxpdHRlck1hc2tFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCB1dGlsIGZyb20gJy4uLy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBzdHlsZXIgZnJvbSAnLi4vLi4vb25zL3N0eWxlci5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uLy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcbmltcG9ydCBCYXNlQW5pbWF0b3IgZnJvbSAnLi4vLi4vb25zL2Jhc2UtYW5pbWF0b3IuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTcGxpdHRlckFuaW1hdG9yIGV4dGVuZHMgQmFzZUFuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2N1YmljLWJlemllciguMSwgLjcsIC4xLCAxKScsIGR1cmF0aW9uID0gMC4zLCBkZWxheSA9IDB9ID0ge30pIHtcbiAgICBzdXBlcih7IHRpbWluZywgZHVyYXRpb24sIGRlbGF5IH0pO1xuICB9XG5cbiAgdXBkYXRlT3B0aW9ucyhvcHRpb25zID0ge30pIHtcbiAgICB1dGlsLmV4dGVuZCh0aGlzLCB7XG4gICAgICB0aW1pbmc6IHRoaXMudGltaW5nLCBkdXJhdGlvbjogdGhpcy5kdXJhdGlvbiwgZGVsYXk6IHRoaXMuZGVsYXlcbiAgICB9LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHNpZGVFbGVtZW50XG4gICAqL1xuICBhY3RpdmF0ZShzaWRlRWxlbWVudCkge1xuICAgIGNvbnN0IHNwbGl0dGVyID0gc2lkZUVsZW1lbnQucGFyZW50Tm9kZTtcblxuICAgIGNvbnRlbnRSZWFkeShzcGxpdHRlciwgKCkgPT4ge1xuICAgICAgdGhpcy5fc2lkZSA9IHNpZGVFbGVtZW50O1xuICAgICAgdGhpcy5fb3Bwb3NpdGVTaWRlID0gc3BsaXR0ZXIucmlnaHQgIT09IHNpZGVFbGVtZW50ICYmIHNwbGl0dGVyLnJpZ2h0IHx8IHNwbGl0dGVyLmxlZnQgIT09IHNpZGVFbGVtZW50ICYmIHNwbGl0dGVyLmxlZnQ7XG4gICAgICB0aGlzLl9jb250ZW50ID0gc3BsaXR0ZXIuY29udGVudDtcbiAgICAgIHRoaXMuX21hc2sgPSBzcGxpdHRlci5tYXNrO1xuICAgIH0pO1xuICB9XG5cbiAgZGVhY3RpdmF0ZSgpIHtcbiAgICB0aGlzLmNsZWFyVHJhbnNpdGlvbigpO1xuICAgIHRoaXMuX21hc2sgJiYgdGhpcy5jbGVhck1hc2soKTtcbiAgICB0aGlzLl9jb250ZW50ID0gdGhpcy5fc2lkZSA9IHRoaXMuX29wcG9zaXRlU2lkZSA9IHRoaXMuX21hc2sgPSBudWxsO1xuICB9XG5cbiAgZ2V0IG1pbnVzKCkge1xuICAgIHJldHVybiB0aGlzLl9zaWRlLnNpZGUgPT09ICdyaWdodCcgPyAnLScgOiAnJztcbiAgfVxuXG4gIGNsZWFyVHJhbnNpdGlvbigpIHtcbiAgICAnc2lkZSBtYXNrIGNvbnRlbnQnLnNwbGl0KC9cXHMrLylcbiAgICAgIC5mb3JFYWNoKGUgPT4gdGhpc1snXycgKyBlXSAmJiBzdHlsZXIuY2xlYXIodGhpc1snXycgKyBlXSwgJ3RyYW5zZm9ybSB0cmFuc2l0aW9uJykpO1xuICB9XG5cbiAgY2xlYXJNYXNrKCkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBvdGhlciBzaWRlIG5lZWRzIHRoZSBtYXNrIGJlZm9yZSBjbGVhcmluZ1xuICAgIGlmICghdGhpcy5fb3Bwb3NpdGVTaWRlIHx8IHRoaXMuX29wcG9zaXRlU2lkZS5tb2RlID09PSAnc3BsaXQnIHx8ICF0aGlzLl9vcHBvc2l0ZVNpZGUuaXNPcGVuKSB7XG4gICAgICB0aGlzLl9tYXNrLnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICAgIHRoaXMuX21hc2suc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRpc3RhbmNlXG4gICAqL1xuICB0cmFuc2xhdGUoZGlzdGFuY2UpIHtcblxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIG9wZW4oZG9uZSkge1xuICAgIGRvbmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAqL1xuICBjbG9zZShkb25lKSB7XG4gICAgZG9uZSgpO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IFNwbGl0dGVyQW5pbWF0b3IgZnJvbSAnLi9hbmltYXRvci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE92ZXJsYXlTcGxpdHRlckFuaW1hdG9yIGV4dGVuZHMgU3BsaXR0ZXJBbmltYXRvciB7XG5cbiAgdHJhbnNsYXRlKGRpc3RhbmNlKSB7XG4gICAgdGhpcy5fbWFzay5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsgLy8gQXZvaWQgY29udGVudCBjbGlja3NcblxuICAgIGFuaW1pdCh0aGlzLl9zaWRlKVxuICAgICAgLnF1ZXVlKHtcbiAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlM2QoJHt0aGlzLm1pbnVzICsgZGlzdGFuY2V9cHgsIDAsIDApYFxuICAgICAgfSlcbiAgICAgIC5wbGF5KCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZG9uZVxuICAgKi9cbiAgb3Blbihkb25lKSB7XG4gICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgIGFuaW1pdCh0aGlzLl9zaWRlKVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKCR7dGhpcy5taW51c30xMDAlLCAwLCAwKWBcbiAgICAgICAgfSwgdGhpcy5kZWYpXG4gICAgICAgIC5xdWV1ZShjYWxsYmFjayA9PiB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lICYmIGRvbmUoKTtcbiAgICAgICAgfSksXG5cbiAgICAgIGFuaW1pdCh0aGlzLl9tYXNrKVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIGRpc3BsYXk6ICdibG9jaydcbiAgICAgICAgfSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICBvcGFjaXR5OiAnMSdcbiAgICAgICAgfSwge1xuICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgIHRpbWluZzogJ2xpbmVhcicsXG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAqL1xuICBjbG9zZShkb25lKSB7XG5cbiAgICBhbmltaXQucnVuQWxsKFxuICAgICAgYW5pbWl0KHRoaXMuX3NpZGUpXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknXG4gICAgICAgIH0sIHRoaXMuZGVmKVxuICAgICAgICAucXVldWUoY2FsbGJhY2sgPT4ge1xuICAgICAgICAgIGRvbmUgJiYgZG9uZSgpO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0pLFxuXG4gICAgICBhbmltaXQodGhpcy5fbWFzaylcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICBvcGFjaXR5OiAnMCdcbiAgICAgICAgfSwge1xuICAgICAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgICAgIHRpbWluZzogJ2xpbmVhcicsXG4gICAgICAgIH0pXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi8uLi9vbnMvYW5pbWl0LmpzJztcbmltcG9ydCBTcGxpdHRlckFuaW1hdG9yIGZyb20gJy4vYW5pbWF0b3IuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQdXNoU3BsaXR0ZXJBbmltYXRvciBleHRlbmRzIFNwbGl0dGVyQW5pbWF0b3Ige1xuXG4gIF9nZXRTbGlkaW5nRWxlbWVudHMoKSB7XG4gICAgY29uc3Qgc2xpZGluZ0VsZW1lbnRzID0gW3RoaXMuX3NpZGUsIHRoaXMuX2NvbnRlbnRdO1xuICAgIGlmICh0aGlzLl9vcHBvc2l0ZVNpZGUgJiYgdGhpcy5fb3Bwb3NpdGVTaWRlLm1vZGUgPT09ICdzcGxpdCcpIHtcbiAgICAgIHNsaWRpbmdFbGVtZW50cy5wdXNoKHRoaXMuX29wcG9zaXRlU2lkZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNsaWRpbmdFbGVtZW50cztcbiAgfVxuXG4gIHRyYW5zbGF0ZShkaXN0YW5jZSkge1xuICAgIGlmICghdGhpcy5fc2xpZGluZ0VsZW1lbnRzKSB7XG4gICAgICB0aGlzLl9zbGlkaW5nRWxlbWVudHMgPSB0aGlzLl9nZXRTbGlkaW5nRWxlbWVudHMoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXNrLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOyAvLyBBdm9pZCBjb250ZW50IGNsaWNrc1xuXG4gICAgYW5pbWl0KHRoaXMuX3NsaWRpbmdFbGVtZW50cylcbiAgICAgIC5xdWV1ZSh7XG4gICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKCR7dGhpcy5taW51cyArIGRpc3RhbmNlfXB4LCAwLCAwKWBcbiAgICAgIH0pXG4gICAgICAucGxheSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIG9wZW4oZG9uZSkge1xuICAgIGNvbnN0IG1heCA9IHRoaXMuX3NpZGUub2Zmc2V0V2lkdGg7XG4gICAgdGhpcy5fc2xpZGluZ0VsZW1lbnRzID0gdGhpcy5fZ2V0U2xpZGluZ0VsZW1lbnRzKCk7XG5cbiAgICBhbmltaXQucnVuQWxsKFxuICAgICAgYW5pbWl0KHRoaXMuX3NsaWRpbmdFbGVtZW50cylcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgke3RoaXMubWludXMgKyBtYXh9cHgsIDAsIDApYFxuICAgICAgICB9LCB0aGlzLmRlZilcbiAgICAgICAgLnF1ZXVlKGNhbGxiYWNrID0+IHtcbiAgICAgICAgICB0aGlzLl9zbGlkaW5nRWxlbWVudHMgPSBudWxsO1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSAmJiBkb25lKCk7XG4gICAgICAgIH0pLFxuXG4gICAgICBhbmltaXQodGhpcy5fbWFzaylcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snXG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBkb25lXG4gICAqL1xuICBjbG9zZShkb25lKSB7XG4gICAgdGhpcy5fc2xpZGluZ0VsZW1lbnRzID0gdGhpcy5fZ2V0U2xpZGluZ0VsZW1lbnRzKCk7XG5cbiAgICBhbmltaXQucnVuQWxsKFxuICAgICAgYW5pbWl0KHRoaXMuX3NsaWRpbmdFbGVtZW50cylcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKHtcbiAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKSdcbiAgICAgICAgfSwgdGhpcy5kZWYpXG4gICAgICAgIC5xdWV1ZShjYWxsYmFjayA9PiB7XG4gICAgICAgICAgdGhpcy5fc2xpZGluZ0VsZW1lbnRzID0gbnVsbDtcbiAgICAgICAgICBzdXBlci5jbGVhclRyYW5zaXRpb24oKTtcbiAgICAgICAgICBkb25lICYmIGRvbmUoKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KSxcblxuICAgICAgYW5pbWl0KHRoaXMuX21hc2spXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi8uLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5pbXBvcnQgc3R5bGVyIGZyb20gJy4uLy4uL29ucy9zdHlsZXIuanMnO1xuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi8uLi9vbnMvYW5pbWl0LmpzJztcbmltcG9ydCBTcGxpdHRlckFuaW1hdG9yIGZyb20gJy4vYW5pbWF0b3IuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXZlYWxTcGxpdHRlckFuaW1hdG9yIGV4dGVuZHMgU3BsaXR0ZXJBbmltYXRvciB7XG5cbiAgX2dldFNsaWRpbmdFbGVtZW50cygpIHtcbiAgICBjb25zdCBzbGlkaW5nRWxlbWVudHMgPSBbdGhpcy5fY29udGVudCwgdGhpcy5fbWFza107XG4gICAgaWYgKHRoaXMuX29wcG9zaXRlU2lkZSAmJiB0aGlzLl9vcHBvc2l0ZVNpZGUubW9kZSA9PT0gJ3NwbGl0Jykge1xuICAgICAgc2xpZGluZ0VsZW1lbnRzLnB1c2godGhpcy5fb3Bwb3NpdGVTaWRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2xpZGluZ0VsZW1lbnRzO1xuICB9XG5cbiAgYWN0aXZhdGUoc2lkZUVsZW1lbnQpIHtcbiAgICBzdXBlci5hY3RpdmF0ZShzaWRlRWxlbWVudCk7XG4gICAgaWYgKHNpZGVFbGVtZW50Lm1vZGUgPT09ICdjb2xsYXBzZScpIHtcbiAgICAgIHRoaXMuX3NldFN0eWxlcyhzaWRlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgZGVhY3RpdmF0ZSgpIHtcbiAgICB0aGlzLl9zaWRlICYmIHRoaXMuX3Vuc2V0U3R5bGVzKHRoaXMuX3NpZGUpO1xuICAgIHN1cGVyLmRlYWN0aXZhdGUoKTtcbiAgfVxuXG4gIF9zZXRTdHlsZXMoc2lkZUVsZW1lbnQpIHtcbiAgICBzdHlsZXIoc2lkZUVsZW1lbnQsIHtcbiAgICAgIGxlZnQ6IHNpZGVFbGVtZW50LnNpZGUgPT09ICdyaWdodCcgPyAnYXV0bycgOiAwLFxuICAgICAgcmlnaHQ6IHNpZGVFbGVtZW50LnNpZGUgPT09ICdyaWdodCcgID8gMCA6ICdhdXRvJyxcbiAgICAgIHpJbmRleDogMCxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJ2JsYWNrJyxcbiAgICAgIHRyYW5zZm9ybTogdGhpcy5fZ2VuZXJhdGVCZWhpbmRQYWdlU3R5bGUoMCkuY29udGFpbmVyLnRyYW5zZm9ybSxcbiAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc3BsaXR0ZXIgPSBzaWRlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIGNvbnRlbnRSZWFkeShzcGxpdHRlciwgKCkgPT4gc3BsaXR0ZXIuY29udGVudCAmJiBzdHlsZXIoc3BsaXR0ZXIuY29udGVudCwgeyBib3hTaGFkb3c6ICcwIDAgMTJweCAwIHJnYmEoMCwgMCwgMCwgMC4yKScgfSkpO1xuICB9XG5cbiAgX3Vuc2V0U3R5bGVzKHNpZGVFbGVtZW50KSB7XG4gICAgc3R5bGVyLmNsZWFyKHNpZGVFbGVtZW50LCAnbGVmdCByaWdodCB6SW5kZXggYmFja2dyb3VuZENvbG9yIGRpc3BsYXknKTtcbiAgICBpZiAoc2lkZUVsZW1lbnQuX2NvbnRlbnQpIHtcbiAgICAgIHNpZGVFbGVtZW50Ll9jb250ZW50LnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgb3RoZXIgc2lkZSBuZWVkcyB0aGUgY29tbW9uIHN0eWxlc1xuICAgIGlmICghdGhpcy5fb3Bwb3NpdGVTaWRlIHx8IHRoaXMuX29wcG9zaXRlU2lkZS5tb2RlID09PSAnc3BsaXQnKSB7XG4gICAgICBzaWRlRWxlbWVudC5wYXJlbnRFbGVtZW50LmNvbnRlbnQgJiYgc3R5bGVyLmNsZWFyKHNpZGVFbGVtZW50LnBhcmVudEVsZW1lbnQuY29udGVudCwgJ2JveFNoYWRvdycpO1xuICAgIH1cbiAgfVxuXG4gIF9nZW5lcmF0ZUJlaGluZFBhZ2VTdHlsZShkaXN0YW5jZSkge1xuICAgIGNvbnN0IG1heCA9IHRoaXMubWF4V2lkdGg7XG5cbiAgICBsZXQgYmVoaW5kRGlzdGFuY2UgPSAoZGlzdGFuY2UgLSBtYXgpIC8gbWF4ICogMTA7XG4gICAgYmVoaW5kRGlzdGFuY2UgPSBpc05hTihiZWhpbmREaXN0YW5jZSkgPyAwIDogTWF0aC5tYXgoTWF0aC5taW4oYmVoaW5kRGlzdGFuY2UsIDApLCAtMTApO1xuXG4gICAgY29uc3QgYmVoaW5kVHJhbnNmb3JtID0gYHRyYW5zbGF0ZTNkKCR7KHRoaXMubWludXMgPyAtMSA6IDEpICogYmVoaW5kRGlzdGFuY2V9JSwgMCwgMClgO1xuICAgIGNvbnN0IG9wYWNpdHkgPSAxICsgYmVoaW5kRGlzdGFuY2UgLyAxMDA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDoge1xuICAgICAgICBvcGFjaXR5XG4gICAgICB9LFxuICAgICAgY29udGFpbmVyOiB7XG4gICAgICAgIHRyYW5zZm9ybTogYmVoaW5kVHJhbnNmb3JtXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHRyYW5zbGF0ZShkaXN0YW5jZSkge1xuICAgIHRoaXMuX3NpZGUuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIHRoaXMuX3NpZGUuc3R5bGUuekluZGV4ID0gMTtcbiAgICB0aGlzLm1heFdpZHRoID0gdGhpcy5tYXhXaWR0aCB8fCB0aGlzLl9nZXRNYXhXaWR0aCgpO1xuICAgIGNvbnN0IG1lbnVTdHlsZSA9IHRoaXMuX2dlbmVyYXRlQmVoaW5kUGFnZVN0eWxlKE1hdGgubWluKGRpc3RhbmNlLCB0aGlzLm1heFdpZHRoKSk7XG5cbiAgICBpZiAoIXRoaXMuX3NsaWRpbmdFbGVtZW50cykge1xuICAgICAgdGhpcy5fc2xpZGluZ0VsZW1lbnRzID0gdGhpcy5fZ2V0U2xpZGluZ0VsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbWFzay5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsgLy8gQXZvaWQgY29udGVudCBjbGlja3NcblxuICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICBhbmltaXQodGhpcy5fc2xpZGluZ0VsZW1lbnRzKVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKCR7dGhpcy5taW51cyArIGRpc3RhbmNlfXB4LCAwLCAwKWBcbiAgICAgICAgfSksXG4gICAgICBhbmltaXQodGhpcy5fc2lkZS5fY29udGVudClcbiAgICAgICAgLnF1ZXVlKG1lbnVTdHlsZS5jb250ZW50KSxcbiAgICAgIGFuaW1pdCh0aGlzLl9zaWRlKVxuICAgICAgICAucXVldWUobWVudVN0eWxlLmNvbnRhaW5lcilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIG9wZW4oZG9uZSkge1xuICAgIHRoaXMuX3NpZGUuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIHRoaXMuX3NpZGUuc3R5bGUuekluZGV4ID0gMTtcbiAgICB0aGlzLm1heFdpZHRoID0gdGhpcy5tYXhXaWR0aCB8fCB0aGlzLl9nZXRNYXhXaWR0aCgpO1xuICAgIGNvbnN0IG1lbnVTdHlsZSA9IHRoaXMuX2dlbmVyYXRlQmVoaW5kUGFnZVN0eWxlKHRoaXMubWF4V2lkdGgpO1xuICAgIHRoaXMuX3NsaWRpbmdFbGVtZW50cyA9IHRoaXMuX2dldFNsaWRpbmdFbGVtZW50cygpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7IC8vIEZpeDogVGltZSB0byB1cGRhdGUgcHJldmlvdXMgdHJhbnNsYXRlM2QgYWZ0ZXIgY2hhbmdpbmcgc3R5bGUuZGlzcGxheVxuICAgICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgICAgYW5pbWl0KHRoaXMuX3NsaWRpbmdFbGVtZW50cylcbiAgICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAgIC5xdWV1ZSh7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgke3RoaXMubWludXMgKyB0aGlzLm1heFdpZHRofXB4LCAwLCAwKWBcbiAgICAgICAgICB9LCB0aGlzLmRlZiksXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuX21hc2spXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUoe1xuICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgIGFuaW1pdCh0aGlzLl9zaWRlLl9jb250ZW50KVxuICAgICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgICAgLnF1ZXVlKG1lbnVTdHlsZS5jb250ZW50LCB0aGlzLmRlZiksXG5cbiAgICAgICAgYW5pbWl0KHRoaXMuX3NpZGUpXG4gICAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgICAucXVldWUobWVudVN0eWxlLmNvbnRhaW5lciwgdGhpcy5kZWYpXG4gICAgICAgICAgLnF1ZXVlKGNhbGxiYWNrID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3NsaWRpbmdFbGVtZW50cyA9IG51bGw7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgZG9uZSAmJiBkb25lKCk7XG4gICAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0sIDEwMDAvNjApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGRvbmVcbiAgICovXG4gIGNsb3NlKGRvbmUpIHtcbiAgICBjb25zdCBtZW51U3R5bGUgPSB0aGlzLl9nZW5lcmF0ZUJlaGluZFBhZ2VTdHlsZSgwKTtcbiAgICB0aGlzLl9zbGlkaW5nRWxlbWVudHMgPSB0aGlzLl9nZXRTbGlkaW5nRWxlbWVudHMoKTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICBhbmltaXQodGhpcy5fc2xpZGluZ0VsZW1lbnRzKVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJ1xuICAgICAgICB9LCB0aGlzLmRlZiksXG5cbiAgICAgIGFuaW1pdCh0aGlzLl9tYXNrKVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoe1xuICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9KSxcblxuICAgICAgYW5pbWl0KHRoaXMuX3NpZGUuX2NvbnRlbnQpXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZShtZW51U3R5bGUuY29udGVudCwgdGhpcy5kZWYpLFxuXG4gICAgICBhbmltaXQodGhpcy5fc2lkZSlcbiAgICAgICAgLndhaXQodGhpcy5kZWxheSlcbiAgICAgICAgLnF1ZXVlKG1lbnVTdHlsZS5jb250YWluZXIsIHRoaXMuZGVmKVxuICAgICAgICAucXVldWUoY2FsbGJhY2sgPT4ge1xuICAgICAgICAgIHRoaXMuX3NsaWRpbmdFbGVtZW50cyA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fc2lkZS5zdHlsZS56SW5kZXggPSAwO1xuICAgICAgICAgIHRoaXMuX3NpZGUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICB0aGlzLl9zaWRlLl9jb250ZW50LnN0eWxlLm9wYWNpdHkgPSAnJztcbiAgICAgICAgICBkb25lICYmIGRvbmUoKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgX2dldE1heFdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLl9zaWRlLm9mZnNldFdpZHRoO1xuICB9XG59XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEFuaW1hdG9yRmFjdG9yeSBmcm9tICcuLi9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyc7XG5pbXBvcnQgT3ZlcmxheVNwbGl0dGVyQW5pbWF0b3IgZnJvbSAnLi9vbnMtc3BsaXR0ZXIvb3ZlcmxheS1hbmltYXRvci5qcyc7XG5pbXBvcnQgUHVzaFNwbGl0dGVyQW5pbWF0b3IgZnJvbSAnLi9vbnMtc3BsaXR0ZXIvcHVzaC1hbmltYXRvci5qcyc7XG5pbXBvcnQgUmV2ZWFsU3BsaXR0ZXJBbmltYXRvciBmcm9tICcuL29ucy1zcGxpdHRlci9yZXZlYWwtYW5pbWF0b3IuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGRldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyIGZyb20gJy4uL29ucy9pbnRlcm5hbC9kZXZpY2UtYmFjay1idXR0b24tZGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcblxuY29uc3QgX2FuaW1hdG9yRGljdCA9IHtcbiAgZGVmYXVsdDogT3ZlcmxheVNwbGl0dGVyQW5pbWF0b3IsXG4gIG92ZXJsYXk6IE92ZXJsYXlTcGxpdHRlckFuaW1hdG9yLFxuICBwdXNoOiBQdXNoU3BsaXR0ZXJBbmltYXRvcixcbiAgcmV2ZWFsOiBSZXZlYWxTcGxpdHRlckFuaW1hdG9yXG59O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1zcGxpdHRlclxuICogQGNhdGVnb3J5IG1lbnVcbiAqIEBkZXNjcmlwdGlvblxuICogIFtlbl1cbiAqICAgIEEgY29tcG9uZW50IHRoYXQgZW5hYmxlcyByZXNwb25zaXZlIGxheW91dCBieSBpbXBsZW1lbnRpbmcgYm90aCBhIHR3by1jb2x1bW4gbGF5b3V0IGFuZCBhIHNsaWRpbmcgbWVudSBsYXlvdXQuXG4gKlxuICogICAgSXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYXV0b21hdGljYWxseSBleHBhbmQgaW50byBhIGNvbHVtbiBsYXlvdXQgb24gbGFyZ2Ugc2NyZWVucyBhbmQgY29sbGFwc2UgdGhlIG1lbnUgb24gc21hbGxlciBzY3JlZW5zLiBXaGVuIHRoZSBtZW51IGlzIGNvbGxhcHNlZCB0aGUgdXNlciBjYW4gb3BlbiBpdCBieSBzd2lwaW5nLlxuICogIFsvZW5dXG4gKiAgW2phXVsvamFdXG4gKiBAY29kZXBlbiByT1FPTUxcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9zcGxpdHRlclxuICogQGd1aWRlIGZ1bmRhbWVudGFscy5odG1sI21hbmFnaW5nLXBhZ2VzXG4gKiAgW2VuXU1hbmFnaW5nIG11bHRpcGxlIHBhZ2VzLlsvZW5dXG4gKiAgW2phXeikh+aVsOOBruODmuODvOOCuOOCkueuoeeQhuOBmeOCi1svamFdXG4gKiBAc2VlYWxzbyBvbnMtc3BsaXR0ZXItY29udGVudFxuICogIFtlbl1UaGUgYDxvbnMtc3BsaXR0ZXItY29udGVudD5gIGNvbXBvbmVudCBjb250YWlucyB0aGUgbWFpbiBjb250ZW50IG9mIHRoZSBwYWdlLlsvZW5dXG4gKiAgW2phXW9ucy1zcGxpdHRlci1jb250ZW5044Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1zcGxpdHRlci1zaWRlXG4gKiAgW2VuXVRoZSBgPG9ucy1zcGxpdHRlci1zaWRlPmAgY29tcG9uZW50IGNvbnRhaW5zIHRoZSBtZW51LlsvZW5dXG4gKiAgW2phXW9ucy1zcGxpdHRlci1zaWRl44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXNwbGl0dGVyIGlkPVwic3BsaXR0ZXJcIj5cbiAqICAgPG9ucy1zcGxpdHRlci1jb250ZW50PlxuICogICAgIC4uLlxuICogICA8L29ucy1zcGxpdHRlci1jb250ZW50PlxuICpcbiAqICAgPG9ucy1zcGxpdHRlci1zaWRlIHNpZGU9XCJsZWZ0XCIgd2lkdGg9XCI4MCVcIiBjb2xsYXBzZSBzd2lwZWFibGU+XG4gKiAgICAgLi4uXG4gKiAgIDwvb25zLXNwbGl0dGVyLXNpZGU+XG4gKiA8L29ucy1zcGxpdHRlcj5cbiAqXG4gKiA8c2NyaXB0PlxuICogICB2YXIgc3BsaXR0ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3BsaXR0ZXInKTtcbiAqICAgc3BsaXR0ZXIubGVmdC5vcGVuKCk7XG4gKiA8L3NjcmlwdD5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BsaXR0ZXJFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIF9nZXRTaWRlKHNpZGUpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdXRpbC5maW5kQ2hpbGQodGhpcywgZSA9PiB7XG4gICAgICByZXR1cm4gdXRpbC5tYXRjaChlLCAnb25zLXNwbGl0dGVyLXNpZGUnKSAmJiBlLmdldEF0dHJpYnV0ZSgnc2lkZScpID09PSBzaWRlO1xuICAgIH0pO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBsZWZ0XG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1MZWZ0IGA8b25zLXNwbGl0dGVyLXNpZGU+YCBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgbGVmdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0U2lkZSgnbGVmdCcpO1xuICB9XG4gIC8qKlxuICAgKiBAcHJvcGVydHkgcmlnaHRcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVJpZ2h0IGA8b25zLXNwbGl0dGVyLXNpZGU+YCBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgcmlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldFNpZGUoJ3JpZ2h0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHNpZGVcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcnN0IGA8b25zLXNwbGl0dGVyLXNpZGU+YCBlbGVtZW50IHJlZ2FyZGxlc3MgdGhlIGFjdHVhbCBzaWRlLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgc2lkZSgpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJ29ucy1zcGxpdHRlci1zaWRlJyk7XG4gIH1cblxuICBnZXQgX3NpZGVzKCkge1xuICAgIHJldHVybiBbdGhpcy5sZWZ0LCB0aGlzLnJpZ2h0XS5maWx0ZXIoZSA9PiBlKTtcbiAgfVxuICAvKipcbiAgICogQHByb3BlcnR5IGNvbnRlbnRcbiAgICogQHJlYWRvbmx5XG4gICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBgPG9ucy1zcGxpdHRlci1jb250ZW50PmAgZWxlbWVudC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgZ2V0IGNvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsICdvbnMtc3BsaXR0ZXItY29udGVudCcpO1xuICB9XG5cbiAgZ2V0IHRvcFBhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudC5fY29udGVudDtcbiAgfVxuXG4gIGdldCBtYXNrKCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnb25zLXNwbGl0dGVyLW1hc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1CYWNrLWJ1dHRvbiBoYW5kbGVyLlsvZW5dXG4gICAqICAgW2phXeODkOODg+OCr+ODnOOCv+ODs+ODj+ODs+ODieODqeOAglsvamFdXG4gICAqL1xuICBnZXQgb25EZXZpY2VCYWNrQnV0dG9uKCkge1xuICAgIHJldHVybiB0aGlzLl9iYWNrQnV0dG9uSGFuZGxlcjtcbiAgfVxuXG4gIHNldCBvbkRldmljZUJhY2tCdXR0b24oY2FsbGJhY2spIHtcbiAgICBpZiAodGhpcy5fYmFja0J1dHRvbkhhbmRsZXIpIHtcbiAgICAgIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICB0aGlzLl9iYWNrQnV0dG9uSGFuZGxlciA9IGRldmljZUJhY2tCdXR0b25EaXNwYXRjaGVyLmNyZWF0ZUhhbmRsZXIodGhpcywgY2FsbGJhY2spO1xuICB9XG5cbiAgX29uRGV2aWNlQmFja0J1dHRvbihldmVudCkge1xuICAgIHRoaXMuX3NpZGVzLnNvbWUocyA9PiBzLmlzT3BlbiA/IHMuY2xvc2UoKSA6IGZhbHNlKSB8fCBldmVudC5jYWxsUGFyZW50SGFuZGxlcigpO1xuICB9XG5cbiAgX29uTW9kZUNoYW5nZShlKSB7XG4gICAgaWYgKGUudGFyZ2V0LnBhcmVudE5vZGUpIHtcbiAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2xheW91dCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgX2xheW91dCgpIHtcbiAgICB0aGlzLl9zaWRlcy5mb3JFYWNoKHNpZGUgPT4ge1xuICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICB0aGlzLmNvbnRlbnQuc3R5bGVbc2lkZS5zaWRlXSA9IHNpZGUubW9kZSA9PT0gJ3NwbGl0JyA/IHNpZGUuc3R5bGUud2lkdGggOiAwO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX29uTW9kZUNoYW5nZSA9IHRoaXMuX29uTW9kZUNoYW5nZS5iaW5kKHRoaXMpO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgICF0aGlzLm1hc2sgJiYgdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvbnMtc3BsaXR0ZXItbWFzaycpKTtcbiAgICAgIHRoaXMuX2xheW91dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5vbkRldmljZUJhY2tCdXR0b24gPSB0aGlzLl9vbkRldmljZUJhY2tCdXR0b24uYmluZCh0aGlzKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21vZGVjaGFuZ2UnLCB0aGlzLl9vbk1vZGVDaGFuZ2UsIGZhbHNlKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuX2JhY2tCdXR0b25IYW5kbGVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLl9iYWNrQnV0dG9uSGFuZGxlciA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb2RlY2hhbmdlJywgdGhpcy5fb25Nb2RlQ2hhbmdlLCBmYWxzZSk7XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge31cblxuICBfc2hvdygpIHtcbiAgICB1dGlsLnByb3BhZ2F0ZUFjdGlvbih0aGlzLCAnX3Nob3cnKTtcbiAgfVxuXG4gIF9oaWRlKCkge1xuICAgIHV0aWwucHJvcGFnYXRlQWN0aW9uKHRoaXMsICdfaGlkZScpO1xuICB9XG5cbiAgX2Rlc3Ryb3koKSB7XG4gICAgdXRpbC5wcm9wYWdhdGVBY3Rpb24odGhpcywgJ19kZXN0cm95Jyk7XG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgfVxuXG4gIHN0YXRpYyByZWdpc3RlckFuaW1hdG9yKG5hbWUsIEFuaW1hdG9yKSB7XG4gICAgaWYgKCEoQW5pbWF0b3IgaW5zdGFuY2VvZiBTcGxpdHRlckFuaW1hdG9yKSkge1xuICAgICAgdXRpbC50aHJvd0FuaW1hdG9yKCdTcGxpdHRlcicpO1xuICAgIH1cbiAgICBfYW5pbWF0b3JEaWN0W25hbWVdID0gQW5pbWF0b3I7XG4gIH1cblxuICBzdGF0aWMgZ2V0IFNwbGl0dGVyQW5pbWF0b3IoKSB7XG4gICAgcmV0dXJuIFNwbGl0dGVyQW5pbWF0b3I7XG4gIH1cblxuICBzdGF0aWMgZ2V0IGFuaW1hdG9ycygpIHtcbiAgICByZXR1cm4gX2FuaW1hdG9yRGljdDtcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5TcGxpdHRlciA9IFNwbGl0dGVyRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXNwbGl0dGVyJywgU3BsaXR0ZXJFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IEFuaW1hdG9yRmFjdG9yeSBmcm9tICcuLi9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyc7XG5pbXBvcnQgb3JpZW50YXRpb24gZnJvbSAnLi4vb25zL29yaWVudGF0aW9uLmpzJztcbmltcG9ydCBpbnRlcm5hbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvaW5kZXguanMnO1xuaW1wb3J0IE1vZGlmaWVyVXRpbCBmcm9tICcuLi9vbnMvaW50ZXJuYWwvbW9kaWZpZXItdXRpbC5qcyc7XG5pbXBvcnQgQmFzZUVsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZWxlbWVudC5qcyc7XG5pbXBvcnQgU3BsaXR0ZXJBbmltYXRvciBmcm9tICcuL29ucy1zcGxpdHRlci9hbmltYXRvci5qcyc7XG5pbXBvcnQgU3dpcGVSZXZlYWwgZnJvbSAnLi4vb25zL2ludGVybmFsL3N3aXBlLXJldmVhbC5qcyc7XG5pbXBvcnQgRG9vckxvY2sgZnJvbSAnLi4vb25zL2Rvb3Jsb2NrLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuaW1wb3J0IHsgUGFnZUxvYWRlciwgZGVmYXVsdFBhZ2VMb2FkZXJ9IGZyb20gJy4uL29ucy9wYWdlLWxvYWRlci5qcyc7XG5pbXBvcnQgU3BsaXR0ZXJFbGVtZW50IGZyb20gJy4vb25zLXNwbGl0dGVyLmpzJztcblxuY29uc3QgU1BMSVRfTU9ERSA9ICdzcGxpdCc7XG5jb25zdCBDT0xMQVBTRV9NT0RFID0gJ2NvbGxhcHNlJztcbmNvbnN0IENMT1NFRF9TVEFURSA9ICdjbG9zZWQnO1xuY29uc3QgT1BFTl9TVEFURSA9ICdvcGVuJztcbmNvbnN0IENIQU5HSU5HX1NUQVRFID0gJ2NoYW5naW5nJztcblxuY29uc3QgcmV3cml0YWJsZXMgPSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHNwbGl0dGVyU2lkZUVsZW1lbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHJlYWR5KHNwbGl0dGVyU2lkZUVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbiAgfVxufTtcblxuY2xhc3MgQ29sbGFwc2VEZXRlY3Rpb24ge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCB0YXJnZXQpIHtcbiAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLl9vbkNoYW5nZSA9IHRoaXMuX29uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgdGFyZ2V0ICYmIHRoaXMuY2hhbmdlVGFyZ2V0KHRhcmdldCk7XG4gIH1cblxuICBjaGFuZ2VUYXJnZXQodGFyZ2V0KSB7XG4gICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0O1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHRoaXMuX29yaWVudGF0aW9uID0gWydwb3J0cmFpdCcsICdsYW5kc2NhcGUnXS5pbmRleE9mKHRhcmdldCkgIT09IC0xO1xuICAgICAgdGhpcy5hY3RpdmF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIF9tYXRjaCh2YWx1ZSkge1xuICAgIGlmICh0aGlzLl9vcmllbnRhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuX3RhcmdldCA9PT0gKHZhbHVlLmlzUG9ydHJhaXQgPyAncG9ydHJhaXQnIDogJ2xhbmRzY2FwZScpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUubWF0Y2hlcztcbiAgfVxuXG4gIF9vbkNoYW5nZSh2YWx1ZSkge1xuICAgIHRoaXMuX2VsZW1lbnQuX3VwZGF0ZU1vZGUodGhpcy5fbWF0Y2godmFsdWUpID8gQ09MTEFQU0VfTU9ERSA6IFNQTElUX01PREUpO1xuICB9XG5cbiAgYWN0aXZhdGUoKSB7XG4gICAgaWYgKHRoaXMuX29yaWVudGF0aW9uKSB7XG4gICAgICBvcmllbnRhdGlvbi5vbignY2hhbmdlJywgdGhpcy5fb25DaGFuZ2UpO1xuICAgICAgdGhpcy5fb25DaGFuZ2Uoe2lzUG9ydHJhaXQ6IG9yaWVudGF0aW9uLmlzUG9ydHJhaXQoKX0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9xdWVyeVJlc3VsdCA9IHdpbmRvdy5tYXRjaE1lZGlhKHRoaXMuX3RhcmdldCk7XG4gICAgICB0aGlzLl9xdWVyeVJlc3VsdC5hZGRMaXN0ZW5lcih0aGlzLl9vbkNoYW5nZSk7XG4gICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLl9xdWVyeVJlc3VsdCk7XG4gICAgfVxuICB9XG5cbiAgZGlzYWJsZSgpIHtcbiAgICBpZiAodGhpcy5fb3JpZW50YXRpb24pIHtcbiAgICAgIG9yaWVudGF0aW9uLm9mZignY2hhbmdlJywgdGhpcy5fb25DaGFuZ2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fcXVlcnlSZXN1bHQpIHtcbiAgICAgIHRoaXMuX3F1ZXJ5UmVzdWx0LnJlbW92ZUxpc3RlbmVyKHRoaXMuX29uQ2hhbmdlKTtcbiAgICAgIHRoaXMuX3F1ZXJ5UmVzdWx0ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuY29uc3Qgd2lkdGhUb1B4ID0gKHdpZHRoLCBwYXJlbnQpID0+IHtcbiAgY29uc3QgW3ZhbHVlLCBweF0gPSBbcGFyc2VJbnQod2lkdGgsIDEwKSwgL3B4Ly50ZXN0KHdpZHRoKV07XG4gIHJldHVybiBweCA/IHZhbHVlIDogTWF0aC5yb3VuZChwYXJlbnQub2Zmc2V0V2lkdGggKiB2YWx1ZSAvIDEwMCk7XG59O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1zcGxpdHRlci1zaWRlXG4gKiBAY2F0ZWdvcnkgbWVudVxuICogQGRlc2NyaXB0aW9uXG4gKiAgW2VuXVxuICogICAgVGhlIGA8b25zLXNwbGl0dGVyLXNpZGU+YCBlbGVtZW50IGlzIHVzZWQgYXMgYSBjaGlsZCBlbGVtZW50IG9mIGA8b25zLXNwbGl0dGVyPmAuXG4gKlxuICogICAgSXQgd2lsbCBiZSBkaXNwbGF5ZWQgb24gZWl0aGVyIHRoZSBsZWZ0IG9yIHJpZ2h0IHNpZGUgb2YgdGhlIGA8b25zLXNwbGl0dGVyLWNvbnRlbnQ+YCBlbGVtZW50LlxuICpcbiAqICAgIEl0IHN1cHBvcnRzIHR3byBtb2RlczogY29sbGFwc2VkIGFuZCBzcGxpdC4gV2hlbiBpdCdzIGluIGNvbGxhcHNlZCBtb2RlIGl0IHdpbGwgYmUgaGlkZGVuIGZyb20gdmlldyBhbmQgY2FuIGJlIGRpc3BsYXllZCB3aGVuIHRoZSB1c2VyIHN3aXBlcyB0aGUgc2NyZWVuIG9yIHRhcHMgYSBidXR0b24uIEluIHNwbGl0IG1vZGUgdGhlIGVsZW1lbnQgaXMgYWx3YXlzIHNob3duLiBJdCBjYW4gYmUgY29uZmlndXJlZCB0byBhdXRvbWF0aWNhbGx5IHN3aXRjaCBiZXR3ZWVuIHRoZSB0d28gbW9kZXMgZGVwZW5kaW5nIG9uIHRoZSBzY3JlZW4gc2l6ZS5cbiAqICBbL2VuXVxuICogIFtqYV1vbnMtc3BsaXR0ZXItc2lkZeimgee0oOOBr+OAgW9ucy1zcGxpdHRlcuimgee0oOOBruWtkOimgee0oOOBqOOBl+OBpuWIqeeUqOOBl+OBvuOBmeOAglsvamFdXG4gKiBAY29kZXBlbiByT1FPTUxcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9zcGxpdHRlclxuICogQGd1aWRlIGZ1bmRhbWVudGFscy5odG1sI21hbmFnaW5nLXBhZ2VzXG4gKiAgW2VuXU1hbmFnaW5nIG11bHRpcGxlIHBhZ2VzLlsvZW5dXG4gKiAgW2phXeikh+aVsOOBruODmuODvOOCuOOCkueuoeeQhuOBmeOCi1svamFdXG4gKiBAc2VlYWxzbyBvbnMtc3BsaXR0ZXJcbiAqICBbZW5dVGhlIGA8b25zLXNwbGl0dGVyPmAgaXMgdGhlIHBhcmVudCBjb21wb25lbnQuWy9lbl1cbiAqICBbamFdb25zLXNwbGl0dGVy44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1zcGxpdHRlci1jb250ZW50XG4gKiAgW2VuXVRoZSBgPG9ucy1zcGxpdHRlci1jb250ZW50PmAgY29tcG9uZW50IGNvbnRhaW5zIHRoZSBtYWluIGNvbnRlbnQgb2YgdGhlIHBhZ2UuWy9lbl1cbiAqICBbamFdb25zLXNwbGl0dGVyLWNvbnRlbnTjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtc3BsaXR0ZXI+XG4gKiAgIDxvbnMtc3BsaXR0ZXItY29udGVudD5cbiAqICAgICAuLi5cbiAqICAgPC9vbnMtc3BsaXR0ZXItY29udGVudD5cbiAqXG4gKiAgIDxvbnMtc3BsaXR0ZXItc2lkZSBzaWRlPVwibGVmdFwiIHdpZHRoPVwiODAlXCIgY29sbGFwc2U+XG4gKiAgICAgLi4uXG4gKiAgIDwvb25zLXNwbGl0dGVyLXNpZGU+XG4gKiA8L29ucy1zcGxpdHRlcj5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3BsaXR0ZXJTaWRlRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IG1vZGVjaGFuZ2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIGNvbXBvbmVudCdzIG1vZGUgY2hhbmdlcy5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7opoHntKDjga7jg6Ljg7zjg4njgYzlpInljJbjgZfjgZ/pmpvjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5zaWRlXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50Lm1vZGVcbiAgICogICBbZW5dUmV0dXJucyB0aGUgY3VycmVudCBtb2RlLiBDYW4gYmUgZWl0aGVyIGBcImNvbGxhcHNlXCJgIG9yIGBcInNwbGl0XCJgLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOBruODouODvOODieOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHJlb3BlblxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBiZWZvcmUgdGhlIHNsaWRpbmcgbWVudSBpcyBvcGVuZWQuWy9lbl1cbiAgICogICBbamFd44K544Op44Kk44OH44Kj44Oz44Kw44Oh44OL44Ol44O844GM6ZaL44GP5YmN44Gr55m654Gr44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAqICAgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgqrjg5bjgrjjgqfjgq/jg4jjgafjgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jYW5jZWxcbiAgICogICBbZW5dQ2FsbCB0byBjYW5jZWwgb3BlbmluZyBzbGlkaW5nIG1lbnUuWy9lbl1cbiAgICogICBbamFd44K544Op44Kk44OH44Kj44Oz44Kw44Oh44OL44Ol44O844GM6ZaL44GP44Gu44KS44Kt44Oj44Oz44K744Or44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnNpZGVcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3RvcGVuXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGFmdGVyIHRoZSBzbGlkaW5nIG1lbnUgaXMgb3BlbmVkLlsvZW5dXG4gICAqICAgW2phXeOCueODqeOCpOODh+OCo+ODs+OCsOODoeODi+ODpeODvOOBjOmWi+OBhOOBn+W+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnNpZGVcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHByZWNsb3NlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGJlZm9yZSB0aGUgc2xpZGluZyBtZW51IGlzIGNsb3NlZC5bL2VuXVxuICAgKiAgIFtqYV3jgrnjg6njgqTjg4fjgqPjg7PjgrDjg6Hjg4vjg6Xjg7zjgYzplonjgZjjgovliY3jgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOBp+OBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5zaWRlXG4gICAqICAgW2VuXUNvbXBvbmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kz44Oz44Od44O844ON44Oz44OI44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUNhbGwgdG8gY2FuY2VsIG9wZW5pbmcgc2xpZGluZy1tZW51LlsvZW5dXG4gICAqICAgW2phXeOCueODqeOCpOODh+OCo+ODs+OCsOODoeODi+ODpeODvOOBjOmWieOBmOOCi+OBruOCkuOCreODo+ODs+OCu+ODq+OBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdGNsb3NlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGFmdGVyIHRoZSBzbGlkaW5nIG1lbnUgaXMgY2xvc2VkLlsvZW5dXG4gICAqICAgW2phXeOCueODqeOCpOODh+OCo+ODs+OCsOODoeODi+ODpeODvOOBjOmWieOBmOOBn+W+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44Gn44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50LnNpZGVcbiAgICogICBbZW5dQ29tcG9uZW50IG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgrPjg7Pjg53jg7zjg43jg7Pjg4jjga7jgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHN3aXBlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCB3aGVuZXZlciB0aGUgdXNlciBzbGlkZXMgdGhlIHNwbGl0dGVyLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5yYXRpb1xuICAgKiAgIFtlbl1EZWNpbWFsIHJhdGlvICgwLTEpLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5hbmltYXRpb25PcHRpb25zXG4gICAqICAgW2VuXVsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFuaW1hdGlvblxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCAgZGVmYXVsdFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24uIFVzZSBvbmUgb2YgYG92ZXJsYXlgLCBgcHVzaGAsIGByZXZlYWxgIG9yICBgZGVmYXVsdGAuWy9lbl1cbiAgICogIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PjgpLmjIflrprjgZfjgb7jgZnjgIJcIm92ZXJsYXlcIiwgXCJwdXNoXCIsIFwicmV2ZWFsXCIsIFwiZGVmYXVsdFwi44Gu44GE44Ga44KM44GL44KS5oyH5a6a44Gn44GN44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uLW9wdGlvbnNcbiAgICogQHR5cGUge0V4cHJlc3Npb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CCZS5nLiB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYW5pbWF0aW9uT3B0aW9uc1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgdGltaW5nIGFuZCBkZWxheSB3aXRoIGFuIG9iamVjdCBsaXRlcmFsLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgdGltaW5nLCBkZWxheeOCkuOCquODluOCuOOCp+OCr+ODiOODquODhuODqeODq+OBp+aMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBvcGVuLXRocmVzaG9sZFxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVmYXVsdCAgMC4zXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgaG93IG11Y2ggdGhlIG1lbnUgbmVlZHMgdG8gYmUgc3dpcGVkIGJlZm9yZSBvcGVuaW5nLiBBIHZhbHVlIGJldHdlZW4gYDBgIGFuZCBgMWAuWy9lbl1cbiAgICogIFtqYV3jganjga7jgY/jgonjgYTjgrnjg6/jgqTjg5fjgZnjgozjgbDjgrnjg6njgqTjg4fjgqPjg7PjgrDjg6Hjg4vjg6Xjg7zjgpLplovjgY/jgYvjganjgYbjgYvjga7libLlkIjjgpLmjIflrprjgZfjgb7jgZnjgIIw44GL44KJMeOBrumWk+OBruaVsOWApOOCkuaMh+WumuOBl+OBvuOBmeOAguOCueODr+OCpOODl+OBrui3nembouOBjOOBk+OBk+OBp+aMh+WumuOBl+OBn+aVsOWApOaOm+OBkeOCi+OBk+OBruimgee0oOOBruW5heOCiOOCiuOCguWkp+OBjeOBkeOCjOOBsOOAgeOCueODr+OCpOODl+OBjOe1guOCj+OBo+OBn+aZguOBq+OBk+OBruimgee0oOOCkumWi+OBjeOBvuOBmeOAguODh+ODleOCqeODq+ODiOOBrzAuM+OBp+OBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGNvbGxhcHNlXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1cbiAgICogICAgIFNwZWNpZnkgdGhlIGNvbGxhcHNlIGJlaGF2aW9yLiBWYWxpZCB2YWx1ZXMgYXJlIGBcInBvcnRyYWl0XCJgLCBgXCJsYW5kc2NhcGVcImAgb3IgYSBtZWRpYSBxdWVyeS5cbiAgICogICAgIFRoZSBzdHJpbmcgYFwicG9ydHJhaXRcImAgbWVhbnMgdGhlIHZpZXcgd2lsbCBjb2xsYXBzZSB3aGVuIHRoZSBkZXZpY2UgaXMgaW4gcG9ydHJhaXQgb3JpZW50YXRpb24uXG4gICAqICAgICBUaGUgc3RyaW5nIGBcImxhbmRzY2FwZVwiYCBtZWFucyB0aGUgdmlldyB3aWxsIGNvbGxhcHNlIHdoZW4gdGhlIGRldmljZSBpcyBpbiBsYW5kc2NhcGUgb3JpZW50YXRpb24uXG4gICAqICAgICBJZiB0aGUgdmFsdWUgaXMgYSBtZWRpYSBxdWVyeSwgdGhlIHZpZXcgd2lsbCBjb2xsYXBzZSB3aGVuIHRoZSBtZWRpYSBxdWVyeSByZXNvbHZlcyB0byBgdHJ1ZWAuXG4gICAqICAgICBJZiB0aGUgYXR0cmlidXRlIGlzIHNldCwgaW5jbHVkaW5nIGFzIGFuIGVtcHR5IHN0cmluZywgdGhlIHZpZXcgd2lsbCBhbHdheXMgYmUgaW4gYFwiY29sbGFwc2VcImAgbW9kZS5cbiAgICogICAgIElmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHNldCwgdGhlIHZpZXcgd2lsbCBiZSBpbiBgXCJzcGxpdFwiYCBtb2RlLlxuICAgKiAgIFsvZW5dXG4gICAqICAgW2phXVxuICAgKiAgICAg5bem5YG044Gu44Oa44O844K444KS6Z2e6KGo56S644Gr44GZ44KL5p2h5Lu244KS5oyH5a6a44GX44G+44GZ44CCcG9ydHJhaXQsIGxhbmRzY2FwZeOAgXdpZHRoICNweOOCguOBl+OBj+OBr+ODoeODh+OCo+OCouOCr+OCqOODquOBruaMh+WumuOBjOWPr+iDveOBp+OBmeOAglxuICAgKiAgICAgcG9ydHJhaXTjgoLjgZfjgY/jga9sYW5kc2NhcGXjgpLmjIflrprjgZnjgovjgajjgIHjg4fjg5DjgqTjgrnjga7nlLvpnaLjgYznuKblkJHjgY3jgoLjgZfjgY/jga/mqKrlkJHjgY3jgavjgarjgaPjgZ/mmYLjgavpgannlKjjgZXjgozjgb7jgZnjgIJcbiAgICogICAgIOODoeODh+OCo+OCouOCr+OCqOODquOCkuaMh+WumuOBmeOCi+OBqOOAgeaMh+WumuOBl+OBn+OCr+OCqOODquOBq+mBqeWQiOOBl+OBpuOBhOOCi+WgtOWQiOOBq+mBqeeUqOOBleOCjOOBvuOBmeOAglxuICAgKiAgICAg5YCk44Gr5L2V44KC5oyH5a6a44GX44Gq44GE5aC05ZCI44Gr44Gv44CB5bi444GrY29sbGFwc2Xjg6Ljg7zjg4njgavjgarjgorjgb7jgZnjgIJcbiAgICogICBbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzd2lwZS10YXJnZXQtd2lkdGhcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSB3aWR0aCBvZiBzd2lwZWFibGUgYXJlYSBjYWxjdWxhdGVkIGZyb20gdGhlIGVkZ2UgKGluIHBpeGVscykuIFVzZSB0aGlzIHRvIGVuYWJsZSBzd2lwZSBvbmx5IHdoZW4gdGhlIGZpbmdlciB0b3VjaCBvbiB0aGUgc2NyZWVuIGVkZ2UuWy9lbl1cbiAgICogICBbamFd44K544Ov44Kk44OX44Gu5Yik5a6a6aCY5Z+f44KS44OU44Kv44K744Or5Y2Y5L2N44Gn5oyH5a6a44GX44G+44GZ44CC55S76Z2i44Gu56uv44GL44KJ5oyH5a6a44GX44Gf6Led6Zui44Gr6YGU44GZ44KL44Go44Oa44O844K444GM6KGo56S644GV44KM44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgd2lkdGhcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUNhbiBiZSBzcGVjaWZpZWQgaW4gZWl0aGVyIHBpeGVscyBvciBhcyBhIHBlcmNlbnRhZ2UsIGUuZy4gYDkwJWAgb3IgYDIwMHB4YC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7opoHntKDjga7mqKrluYXjgpLmjIflrprjgZfjgb7jgZnjgIJweOOBqCXjgafjga7mjIflrprjgYzlj6/og73jgafjgZnjgIJlZy4gOTAlLCAyMDBweFsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHNpZGVcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlZmF1bHQgbGVmdFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB3aGljaCBzaWRlIG9mIHRoZSBzY3JlZW4gdGhlIGA8b25zLXNwbGl0dGVyLXNpZGU+YCBlbGVtZW50IGlzIGxvY2F0ZWQuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYFwibGVmdFwiYCBhbmQgYFwicmlnaHRcImAuWy9lbl1cbiAgICogICBbamFd44GT44Gu6KaB57Sg44GM5bem44GL5Y+z44GL44KS5oyH5a6a44GX44G+44GZ44CC5oyH5a6a44Gn44GN44KL5YCk44GvXCJsZWZ0XCLjgYtcInJpZ2h0XCLjga7jgb/jgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RlXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1DdXJyZW50IG1vZGUuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYFwiY29sbGFwc2VcImAgb3IgYFwic3BsaXRcImAuIFRoaXMgYXR0cmlidXRlIGlzIHJlYWQgb25seS5bL2VuXVxuICAgKiAgIFtqYV3nj77lnKjjga7jg6Ljg7zjg4njgYzoqK3lrprjgZXjgozjgb7jgZnjgIJcImNvbGxhcHNlXCLjgoLjgZfjgY/jga9cInNwbGl0XCLjgYzmjIflrprjgZXjgozjgb7jgZnjgILjgZPjga7lsZ7mgKfjga/oqq3jgb/ovrzjgb/lsILnlKjjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBwYWdlXG4gICAqIEBpbml0b25seVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIFVSTCBvZiB0aGUgbWVudSBwYWdlLlsvZW5dXG4gICAqICAgW2phXW9ucy1zcGxpdHRlci1zaWRl6KaB57Sg44Gr6KGo56S644GZ44KL44Oa44O844K444GuVVJM44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgc3dpcGVhYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0byBlbmFibGUgc3dpcGUgaW50ZXJhY3Rpb24gb24gY29sbGFwc2UgbW9kZS5bL2VuXVxuICAgKiAgIFtqYV1jb2xsYXBzZeODouODvOODieaZguOBq+OCueODr+OCpOODl+aTjeS9nOOCkuacieWKueOBq+OBmeOCi+WgtOWQiOOBq+aMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgc3dpcGVhYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0byBlbmFibGUgc3dpcGUgaW50ZXJhY3Rpb24gb24gY29sbGFwc2UgbW9kZS5bL2VuXVxuICAgKiAgIFtqYV1jb2xsYXBzZeODouODvOODieaZguOBq+OCueODr+OCpOODl+aTjeS9nOOCkuacieWKueOBq+OBmeOCi+WgtOWQiOOBq+aMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9wYWdlID0gbnVsbDtcbiAgICB0aGlzLl9zdGF0ZSA9IENMT1NFRF9TVEFURTtcbiAgICB0aGlzLl9sb2NrID0gbmV3IERvb3JMb2NrKCk7XG4gICAgdGhpcy5fcGFnZUxvYWRlciA9IGRlZmF1bHRQYWdlTG9hZGVyO1xuICAgIHRoaXMuX2NvbGxhcHNlRGV0ZWN0aW9uID0gbmV3IENvbGxhcHNlRGV0ZWN0aW9uKHRoaXMpO1xuXG4gICAgdGhpcy5fYW5pbWF0b3JGYWN0b3J5ID0gbmV3IEFuaW1hdG9yRmFjdG9yeSh7XG4gICAgICBhbmltYXRvcnM6IFNwbGl0dGVyRWxlbWVudC5hbmltYXRvcnMsXG4gICAgICBiYXNlQ2xhc3M6IFNwbGl0dGVyQW5pbWF0b3IsXG4gICAgICBiYXNlQ2xhc3NOYW1lOiAnU3BsaXR0ZXJBbmltYXRvcicsXG4gICAgICBkZWZhdWx0QW5pbWF0aW9uOiB0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uJylcbiAgICB9KTtcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAvLyBUaGVzZSBhdHRyaWJ1dGVzIGFyZSB1c2VkIGVhcmx5IGJ5IHRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAgdGhpcy5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soJ3dpZHRoJyk7XG4gICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdzaWRlJykpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3NpZGUnLCAnbGVmdCcpO1xuICAgICAgfVxuXG4gICAgICByZXdyaXRhYmxlcy5yZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSB0aGlzLl9wYWdlIHx8IHRoaXMuZ2V0QXR0cmlidXRlKCdwYWdlJyk7XG4gICAgICAgIHBhZ2UgJiYgdGhpcy5sb2FkKHBhZ2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAoIXV0aWwubWF0Y2godGhpcy5wYXJlbnROb2RlLCAnb25zLXNwbGl0dGVyJykpIHtcbiAgICAgIHV0aWwudGhyb3coJ1BhcmVudCBtdXN0IGJlIGFuIG9ucy1zcGxpdHRlciBlbGVtZW50Jyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9zd2lwZSkge1xuICAgICAgdGhpcy5fc3dpcGUgPSBuZXcgU3dpcGVSZXZlYWwoe1xuICAgICAgICBlbGVtZW50OiB0aGlzLFxuICAgICAgICBlbGVtZW50SGFuZGxlcjogdGhpcy5wYXJlbnRFbGVtZW50LFxuICAgICAgICBzd2lwZU1heDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJhdGlvID0gMTtcbiAgICAgICAgICB0aGlzLl9vblN3aXBlICYmIHRoaXMuX29uU3dpcGUocmF0aW8sIHRoaXMuX2FuaW1hdGlvbk9wdCk7XG4gICAgICAgICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdzd2lwZScsIHsgcmF0aW8sIGFuaW1hdGlvbk9wdGlvbnM6IHRoaXMuX2FuaW1hdGlvbk9wdCB9KTtcbiAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3dpcGVNaWQ6IChkaXN0YW5jZSwgd2lkdGgpID0+IHtcbiAgICAgICAgICBjb25zdCByYXRpbyA9IGRpc3RhbmNlIC8gd2lkdGg7XG4gICAgICAgICAgdGhpcy5fb25Td2lwZSAmJiB0aGlzLl9vblN3aXBlKHJhdGlvKTtcbiAgICAgICAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3N3aXBlJywgeyByYXRpbyB9KTtcbiAgICAgICAgICB0aGlzLl9hbmltYXRvci50cmFuc2xhdGUoZGlzdGFuY2UpO1xuICAgICAgICB9LFxuICAgICAgICBzd2lwZU1pbjogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJhdGlvID0gMDtcbiAgICAgICAgICB0aGlzLl9vblN3aXBlICYmIHRoaXMuX29uU3dpcGUocmF0aW8sIHRoaXMuX2FuaW1hdGlvbk9wdCk7XG4gICAgICAgICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdzd2lwZScsIHsgcmF0aW8sIGFuaW1hdGlvbk9wdGlvbnM6IHRoaXMuX2FuaW1hdGlvbk9wdCB9KTtcbiAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFRocmVzaG9sZDogKCkgPT4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgcGFyc2VGbG9hdCh0aGlzLmdldEF0dHJpYnV0ZSgnb3Blbi10aHJlc2hvbGQnKSkgfHwgMC4zKSksXG4gICAgICAgIGdldFNpZGU6ICgpID0+IHRoaXMuc2lkZSxcbiAgICAgICAgaXNJbml0aWFsU3RhdGU6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBjbG9zZWQgPSB0aGlzLl9zdGF0ZSA9PT0gQ0xPU0VEX1NUQVRFO1xuICAgICAgICAgIHRoaXMuX3N0YXRlID0gQ0hBTkdJTkdfU1RBVEU7XG4gICAgICAgICAgcmV0dXJuIGNsb3NlZDtcbiAgICAgICAgfSxcbiAgICAgICAgaWdub3JlU3dpcGU6IChldmVudCwgZGlzdGFuY2UpID0+IHtcbiAgICAgICAgICBjb25zdCBpc09wZW4gPSB0aGlzLmlzT3BlbjtcbiAgICAgICAgICBjb25zdCB2YWxpZERyYWcgPSBkID0+IHRoaXMuc2lkZSA9PT0gJ2xlZnQnXG4gICAgICAgICAgICA/ICgoZCA9PT0gJ2xlZnQnICYmIGlzT3BlbikgfHwgKGQgPT09ICdyaWdodCcgJiYgIWlzT3BlbikpXG4gICAgICAgICAgICA6ICgoZCA9PT0gJ2xlZnQnICYmICFpc09wZW4pIHx8IChkID09PSAncmlnaHQnICYmIGlzT3BlbikpO1xuXG4gICAgICAgICAgY29uc3QgYXJlYSA9IE1hdGgubWF4KDAsIHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdzd2lwZS10YXJnZXQtd2lkdGgnKSwgMTApIHx8IDApO1xuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX21vZGUgPT09IFNQTElUX01PREUgfHwgdGhpcy5fbG9jay5pc0xvY2tlZCgpIHx8IHRoaXMuX2lzT3RoZXJTaWRlT3BlbigpXG4gICAgICAgICAgICB8fCAhdmFsaWREcmFnKGV2ZW50Lmdlc3R1cmUuZGlyZWN0aW9uKVxuICAgICAgICAgICAgfHwgKCFpc09wZW4gJiYgYXJlYSAhPT0gMCAmJiBkaXN0YW5jZSA+IGFyZWEpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soJ3N3aXBlYWJsZScpO1xuICAgIH1cblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLmNvbnN0cnVjdG9yLm9ic2VydmVkQXR0cmlidXRlcy5mb3JFYWNoKGF0dHIgPT4gdGhpcy5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYXR0ciwgbnVsbCwgdGhpcy5nZXRBdHRyaWJ1dGUoYXR0cikpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBzaWRlKCkge1xuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnc2lkZScpID09PSAncmlnaHQnID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgfVxuXG4gIHNldCBzaWRlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2lkZScsIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGlocy5yZW1vdmVBdHRyaWJ1dGUoJ3NpZGUnKTtcbiAgICB9XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9zd2lwZSAmJiB0aGlzLl9zd2lwZS5kaXNwb3NlKCk7XG4gICAgdGhpcy5fYW5pbWF0b3IgPSB0aGlzLl9hbmltYXRpb25PcHQgPSB0aGlzLl9zd2lwZSA9IG51bGw7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydhbmltYXRpb24nLCAnd2lkdGgnLCAnY29sbGFwc2UnLCAnc3dpcGVhYmxlJywgJ2FuaW1hdGlvbi1vcHRpb25zJ107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgY2FzZSAnc3dpcGVhYmxlJzpcbiAgICAgICAgdGhpcy5fc3dpcGUgJiYgdGhpcy5fc3dpcGUudXBkYXRlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2lkdGgnOlxuICAgICAgICBjdXJyZW50ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyk7IC8vIFNvbWV0aW1lcyB1bmRlZmluZWQuIENFIGJ1Zz9cbiAgICAgICAgdGhpcy5zdHlsZS53aWR0aCA9IC9eXFxkKyhweHwlKSQvLnRlc3QoY3VycmVudCkgPyBjdXJyZW50IDogJzgwJSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYW5pbWF0aW9uJzpcbiAgICAgIGNhc2UgJ2FuaW1hdGlvbi1vcHRpb25zJzpcbiAgICAgICAgdGhpcy5fdXBkYXRlQW5pbWF0aW9uKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpc1t1dGlsLmNhbWVsaXplKGBfdXBkYXRlLSR7bmFtZX1gKV0oY3VycmVudCk7XG4gICAgfVxuICB9XG5cbiAgX2VtaXRFdmVudChuYW1lKSB7XG4gICAgaWYgKG5hbWUuc2xpY2UoMCwgMykgIT09ICdwcmUnKSB7XG4gICAgICByZXR1cm4gdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsIG5hbWUsIHtzaWRlOiB0aGlzfSk7XG4gICAgfVxuICAgIGxldCBpc0NhbmNlbGVkID0gZmFsc2U7XG5cbiAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgbmFtZSwge1xuICAgICAgc2lkZTogdGhpcyxcbiAgICAgIGNhbmNlbDogKCkgPT4gaXNDYW5jZWxlZCA9IHRydWVcbiAgICB9KTtcblxuICAgIHJldHVybiBpc0NhbmNlbGVkO1xuICB9XG5cbiAgX2lzT3RoZXJTaWRlT3BlbigpIHtcbiAgICByZXR1cm4gISF1dGlsLmZpbmRDaGlsZCh0aGlzLnBhcmVudEVsZW1lbnQsXG4gICAgICBlbCA9PiBlbCBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3IgJiYgZWwgIT09IHRoaXMgJiYgZWwuX21vZGUgPT09IENPTExBUFNFX01PREUgJiYgZWwuaXNPcGVuXG4gICAgKTtcbiAgfVxuXG4gIF91cGRhdGVDb2xsYXBzZSh2YWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCdjb2xsYXBzZScpKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSAnc3BsaXQnKSB7XG4gICAgICB0aGlzLl9jb2xsYXBzZURldGVjdGlvbi5kaXNhYmxlKCk7XG4gICAgICByZXR1cm4gdGhpcy5fdXBkYXRlTW9kZShTUExJVF9NT0RFKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gJ2NvbGxhcHNlJykge1xuICAgICAgdGhpcy5fY29sbGFwc2VEZXRlY3Rpb24uZGlzYWJsZSgpO1xuICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZU1vZGUoQ09MTEFQU0VfTU9ERSk7XG4gICAgfVxuXG4gICAgdGhpcy5fY29sbGFwc2VEZXRlY3Rpb24uY2hhbmdlVGFyZ2V0KHZhbHVlKTtcbiAgfVxuXG4gIF91cGRhdGVNb2RlKG1vZGUpIHtcbiAgICBpZiAobW9kZSAhPT0gdGhpcy5fbW9kZSkge1xuICAgICAgdGhpcy5fbW9kZSA9IG1vZGU7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnbW9kZScsIG1vZGUpOyAvLyByZWFkb25seSBhdHRyaWJ1dGUgZm9yIHRoZSB1c2Vyc1xuXG4gICAgICBpZiAobW9kZSA9PT0gU1BMSVRfTU9ERSkge1xuICAgICAgICB0aGlzLl9hbmltYXRvciAmJiB0aGlzLl9hbmltYXRvci5kZWFjdGl2YXRlKCk7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gQ0xPU0VEX1NUQVRFO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fYW5pbWF0b3IgJiYgdGhpcy5fYW5pbWF0b3IuYWN0aXZhdGUodGhpcyk7XG4gICAgICAgIHRoaXMuX3N0YXRlID09PSBPUEVOX1NUQVRFICYmIHRoaXMuX2FuaW1hdG9yLm9wZW4oKTtcbiAgICAgIH1cblxuICAgICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdtb2RlY2hhbmdlJywgeyBzaWRlOiB0aGlzLCBtb2RlIH0pO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVBbmltYXRpb24oYW5pbWF0aW9uID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2FuaW1hdGlvbicpKSB7XG4gICAgaWYgKHRoaXMucGFyZW50Tm9kZSkge1xuICAgICAgdGhpcy5fYW5pbWF0b3IgJiYgdGhpcy5fYW5pbWF0b3IuZGVhY3RpdmF0ZSgpO1xuICAgICAgdGhpcy5fYW5pbWF0b3IgPSB0aGlzLl9hbmltYXRvckZhY3RvcnkubmV3QW5pbWF0b3Ioe2FuaW1hdGlvbn0pO1xuICAgICAgdGhpcy5fYW5pbWF0b3IuYWN0aXZhdGUodGhpcyk7XG4gICAgICB0aGlzLl9hbmltYXRpb25PcHQgPSB7XG4gICAgICAgIHRpbWluZzogdGhpcy5fYW5pbWF0b3IuZHVyYXRpb24sXG4gICAgICAgIGR1cmF0aW9uOiB0aGlzLl9hbmltYXRvci5kdXJhdGlvblxuICAgICAgfTtcbiAgICAgIHRoaXMuX2FuaW1hdG9yLnVwZGF0ZU9wdGlvbnModGhpcy5hbmltYXRpb25PcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IHBhZ2VcbiAgICogQHR5cGUgeyp9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1QYWdlIGxvY2F0aW9uIHRvIGxvYWQgaW4gdGhlIHNwbGl0dGVyIHNpZGUuWy9lbl1cbiAgICogICBbamFd44GT44Gu6KaB57Sg5YaF44Gr6KGo56S644GZ44KL44Oa44O844K444KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGdldCBwYWdlKCkge1xuICAgIHJldHVybiB0aGlzLl9wYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gcGFnZVxuICAgKi9cbiAgc2V0IHBhZ2UocGFnZSkge1xuICAgIHRoaXMuX3BhZ2UgPSBwYWdlO1xuICB9XG5cbiAgZ2V0IF9jb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLmNoaWxkcmVuWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBwYWdlTG9hZGVyXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgZ2V0IHBhZ2VMb2FkZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VMb2FkZXI7XG4gIH1cblxuICBzZXQgcGFnZUxvYWRlcihsb2FkZXIpIHtcbiAgICBpZiAoIShsb2FkZXIgaW5zdGFuY2VvZiBQYWdlTG9hZGVyKSkge1xuICAgICAgdXRpbC50aHJvd1BhZ2VMb2FkZXIoKTtcbiAgICB9XG4gICAgdGhpcy5fcGFnZUxvYWRlciA9IGxvYWRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgbW9kZVxuICAgKiBAcmVhZG9ubHlcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUN1cnJlbnQgbW9kZS4gUG9zc2libGUgdmFsdWVzIGFyZSBcInNwbGl0XCIsIFwiY29sbGFwc2VcIiwgXCJjbG9zZWRcIiwgXCJvcGVuXCIgb3IgXCJjaGFuZ2luZ1wiLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgbW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25Td2lwZVxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Ib29rIGNhbGxlZCB3aGVuZXZlciB0aGUgdXNlciBzbGlkZXMgdGhlIHNwbGl0dGVyLiBJdCBnZXRzIGEgZGVjaW1hbCByYXRpbyAoMC0xKSBhbmQgYW4gYW5pbWF0aW9uT3B0aW9ucyBvYmplY3QgYXMgYXJndW1lbnRzLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgb25Td2lwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fb25Td2lwZTtcbiAgfVxuXG4gIHNldCBvblN3aXBlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlICYmICEodmFsdWUgaW5zdGFuY2VvZiBGdW5jdGlvbikpIHtcbiAgICAgIHV0aWwudGhyb3coJ1wib25Td2lwZVwiIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIH1cbiAgICB0aGlzLl9vblN3aXBlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgYW5pbWF0aW9uT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNBdHRyaWJ1dGUoJ2FuaW1hdGlvbi1vcHRpb25zJykgP1xuICAgICAgQW5pbWF0b3JGYWN0b3J5LnBhcnNlQW5pbWF0aW9uT3B0aW9uc1N0cmluZyh0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKSkgOiB7fTtcbiAgfVxuXG4gIHNldCBhbmltYXRpb25PcHRpb25zKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgaXNPcGVuXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmaWVzIHdoZXRoZXIgdGhlIG1lbnUgaXMgb3BlbmVkLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBnZXQgaXNPcGVuKCkge1xuICAgIHJldHVybiB0aGlzLl9tb2RlID09PSBDT0xMQVBTRV9NT0RFICYmIHRoaXMuX3N0YXRlICE9PSBDTE9TRURfU1RBVEU7XG4gIH1cblxuICBzZXQgaXNPcGVuKHZhbHVlKSB7XG4gICAgdGhpcy50b2dnbGUoe30sIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIG9wZW5cbiAgICogQHNpZ25hdHVyZSBvcGVuKFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1UaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBtZW51IGhhcyBiZWVuIG9wZW5lZC5bL2VuXVxuICAgKiAgIFtqYV3jg6Hjg4vjg6Xjg7zjgYzplovjgYTjgZ/lvozjgavlkbzjgbPlh7rjgZXjgozjgovplqLmlbDjgqrjg5bjgrjjgqfjgq/jg4jjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dT3BlbiBtZW51IGluIGNvbGxhcHNlIG1vZGUuWy9lbl1cbiAgICogICBbamFdY29sbGFwc2Xjg6Ljg7zjg4njgavjgarjgaPjgabjgYTjgotvbnMtc3BsaXR0ZXItc2lkZeimgee0oOOCkumWi+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBzcGxpdHRlciBzaWRlIGVsZW1lbnQgb3IgZmFsc2UgaWYgbm90IGluIGNvbGxhcHNlIG1vZGVbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgb3BlbihvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlKG9wdGlvbnMsIHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2QgY2xvc2VcbiAgICogQHNpZ25hdHVyZSBjbG9zZShbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogICBbZW5dVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgbWVudSBoYXMgYmVlbiBjbG9zZWQuWy9lbl1cbiAgICogICBbamFd44Oh44OL44Ol44O844GM6ZaJ44GY44Gf5b6M44Gr5ZG844Gz5Ye644GV44KM44KL6Zai5pWw44Kq44OW44K444Kn44Kv44OI44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUNsb3NlIG1lbnUgaW4gY29sbGFwc2UgbW9kZS5bL2VuXVxuICAgKiAgIFtqYV1jb2xsYXBzZeODouODvOODieOBq+OBquOBo+OBpuOBhOOCi29ucy1zcGxpdHRlci1zaWRl6KaB57Sg44KS6ZaJ44GY44G+44GZ44CCWy9qYV1cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICogICBbZW5dUmVzb2x2ZXMgdG8gdGhlIHNwbGl0dGVyIHNpZGUgZWxlbWVudCBvciBmYWxzZSBpZiBub3QgaW4gY29sbGFwc2UgbW9kZVsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBjbG9zZShvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlKG9wdGlvbnMsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHRvZ2dsZVxuICAgKiBAc2lnbmF0dXJlIHRvZ2dsZShbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXU9wZW5zIGlmIGl0J3MgY2xvc2VkLiBDbG9zZXMgaWYgaXQncyBvcGVuLlsvZW5dXG4gICAqICAgW2phXemWi+OBkeOBpuOBhOOCi+WgtOWQiOOBr+imgee0oOOCkumWieOBmOOBvuOBmeOBneOBl+OBpumWi+OBkeOBpuOBhOOCi+WgtOWQiOOBr+imgee0oOOCkumWi+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBzcGxpdHRlciBzaWRlIGVsZW1lbnQgb3IgZmFsc2UgaWYgbm90IGluIGNvbGxhcHNlIG1vZGVbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgdG9nZ2xlKG9wdGlvbnMgPSB7fSwgZm9yY2UpIHtcbiAgICBjb25zdCBzaG91bGRPcGVuID0gdHlwZW9mIGZvcmNlID09PSAnYm9vbGVhbicgPyBmb3JjZSA6ICF0aGlzLmlzT3BlbjtcbiAgICBjb25zdCBhY3Rpb24gPSBzaG91bGRPcGVuID8gJ29wZW4nIDogJ2Nsb3NlJztcbiAgICBjb25zdCBGSU5BTF9TVEFURSA9IHNob3VsZE9wZW4gPyBPUEVOX1NUQVRFIDogQ0xPU0VEX1NUQVRFO1xuXG4gICAgaWYgKHRoaXMuX21vZGUgPT09IFNQTElUX01PREUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc3RhdGUgPT09IEZJTkFMX1NUQVRFKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbG9jay5pc0xvY2tlZCgpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ0Fub3RoZXIgc3BsaXR0ZXItc2lkZSBhY3Rpb24gaXMgYWxyZWFkeSBydW5uaW5nLicpO1xuICAgIH1cbiAgICBpZiAoc2hvdWxkT3BlbiAmJiB0aGlzLl9pc090aGVyU2lkZU9wZW4oKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdBbm90aGVyIG1lbnUgaXMgYWxyZWFkeSBvcGVuLicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZW1pdEV2ZW50KGBwcmUke2FjdGlvbn1gKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGBDYW5jZWxlZCBpbiBwcmUke2FjdGlvbn0gZXZlbnQuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdW5sb2NrID0gdGhpcy5fbG9jay5sb2NrKCk7XG4gICAgdGhpcy5fc3RhdGUgPSBDSEFOR0lOR19TVEFURTtcblxuICAgIGlmIChvcHRpb25zLmFuaW1hdGlvbikge1xuICAgICAgdGhpcy5fdXBkYXRlQW5pbWF0aW9uKG9wdGlvbnMuYW5pbWF0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICB0aGlzLl9hbmltYXRvclthY3Rpb25dKCgpID0+IHtcbiAgICAgICAgdXRpbC5pb3NQYWdlU2Nyb2xsRml4KHNob3VsZE9wZW4pO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IEZJTkFMX1NUQVRFO1xuICAgICAgICB1bmxvY2soKTtcbiAgICAgICAgdGhpcy5fZW1pdEV2ZW50KGBwb3N0JHthY3Rpb259YCk7XG4gICAgICAgIG9wdGlvbnMuY2FsbGJhY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBvcHRpb25zLmNhbGxiYWNrKHRoaXMpO1xuICAgICAgICByZXNvbHZlKHRoaXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQG1ldGhvZCBsb2FkXG4gICAqIEBzaWduYXR1cmUgbG9hZChwYWdlLCBbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYWdlXG4gICAqICAgW2VuXVBhZ2UgVVJMLiBDYW4gYmUgZWl0aGVyIGFuIEhUTUwgZG9jdW1lbnQgb3IgYSBgPHRlbXBsYXRlPmAuWy9lbl1cbiAgICogICBbamFdcGFnZeOBrlVSTOOBi+OAgWA8dGVtcGxhdGU+YOOBp+Wuo+iogOOBl+OBn+ODhuODs+ODl+ODrOODvOODiOOBrmlk5bGe5oCn44Gu5YCk44KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5jYWxsYmFja11cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNob3cgdGhlIHBhZ2Ugc3BlY2lmaWVkIGluIHBhZ2VVcmwgaW4gdGhlIHJpZ2h0IHNlY3Rpb25bL2VuXVxuICAgKiAgIFtqYV3mjIflrprjgZfjgZ9VUkzjgpLjg6HjgqTjg7Pjg5rjg7zjgrjjgpLoqq3jgb/ovrzjgb/jgb7jgZnjgIJbL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgbmV3IHBhZ2UgZWxlbWVudFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBsb2FkKHBhZ2UsIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuX3BhZ2UgPSBwYWdlO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gb3B0aW9ucy5jYWxsYmFjayB8fCAoKCkgPT4ge30pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgbGV0IG9sZENvbnRlbnQgPSB0aGlzLl9jb250ZW50IHx8IG51bGw7XG5cbiAgICAgIHRoaXMuX3BhZ2VMb2FkZXIubG9hZCh7cGFnZSwgcGFyZW50OiB0aGlzfSwgcGFnZUVsZW1lbnQgPT4ge1xuICAgICAgICBpZiAob2xkQ29udGVudCkge1xuICAgICAgICAgIHRoaXMuX3BhZ2VMb2FkZXIudW5sb2FkKG9sZENvbnRlbnQpO1xuICAgICAgICAgIG9sZENvbnRlbnQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHRoaXMuX3Nob3coKSk7XG5cbiAgICAgICAgY2FsbGJhY2socGFnZUVsZW1lbnQpO1xuICAgICAgICByZXNvbHZlKHBhZ2VFbGVtZW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgX3Nob3coKSB7XG4gICAgaWYgKHRoaXMuX2NvbnRlbnQpIHtcbiAgICAgIHRoaXMuX2NvbnRlbnQuX3Nob3coKTtcbiAgICB9XG4gIH1cblxuICBfaGlkZSgpIHtcbiAgICBpZiAodGhpcy5fY29udGVudCkge1xuICAgICAgdGhpcy5fY29udGVudC5faGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIF9kZXN0cm95KCkge1xuICAgIGlmICh0aGlzLl9jb250ZW50KSB7XG4gICAgICB0aGlzLl9wYWdlTG9hZGVyLnVubG9hZCh0aGlzLl9jb250ZW50KTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmUoKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZXZlbnRzKCkge1xuICAgIHJldHVybiBbJ3ByZW9wZW4nLCAncG9zdG9wZW4nLCAncHJlY2xvc2UnLCAncG9zdGNsb3NlJywgJ21vZGVjaGFuZ2UnLCAnc3dpcGUnXTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgcmV3cml0YWJsZXMoKSB7XG4gICAgcmV0dXJuIHJld3JpdGFibGVzO1xuICB9XG59XG5cbnV0aWwuZGVmaW5lQm9vbGVhblByb3BlcnRpZXMoU3BsaXR0ZXJTaWRlRWxlbWVudCwgWydzd2lwZWFibGUnXSk7XG5cbm9uc0VsZW1lbnRzLlNwbGl0dGVyU2lkZSA9IFNwbGl0dGVyU2lkZUVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1zcGxpdHRlci1zaWRlJywgU3BsaXR0ZXJTaWRlRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlQ2hlY2tib3hFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWNoZWNrYm94LmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuaW1wb3J0IEdlc3R1cmVEZXRlY3RvciBmcm9tICcuLi9vbnMvZ2VzdHVyZS1kZXRlY3Rvci5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJyc6ICdzd2l0Y2gtLSonLFxuICAnLnN3aXRjaF9faW5wdXQnOiAnc3dpdGNoLS0qX19pbnB1dCcsXG4gICcuc3dpdGNoX19oYW5kbGUnOiAnc3dpdGNoLS0qX19oYW5kbGUnLFxuICAnLnN3aXRjaF9fdG9nZ2xlJzogJ3N3aXRjaC0tKl9fdG9nZ2xlJ1xufTtcblxuY29uc3QgbG9jYXRpb25zID0ge1xuICBpb3M6IFsxLCAyMV0sXG4gIG1hdGVyaWFsOiBbMCwgMTZdXG59O1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy1zd2l0Y2hcbiAqIEBjYXRlZ29yeSBmb3JtXG4gKiBAZGVzY3JpcHRpb25cbiAqICAgW2VuXVxuICogICAgIFN3aXRjaCBjb21wb25lbnQuIFRoZSBzd2l0Y2ggY2FuIGJlIHRvZ2dsZWQgYm90aCBieSBkcmFnZ2luZyBhbmQgdGFwcGluZy5cbiAqXG4gKiAgICAgV2lsbCBhdXRvbWF0aWNhbGx5IGRpc3BsYXlzIGEgTWF0ZXJpYWwgRGVzaWduIHN3aXRjaCBvbiBBbmRyb2lkIGRldmljZXMuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV3jgrnjgqTjg4Pjg4HjgpLooajnpLrjgZnjgovjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgafjgZnjgIJbL2phXVxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1NYXRlcmlhbCBEZXNpZ24gc3dpdGNoWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAY29kZXBlbiBMcFhaUVFcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9zd2l0Y2hcbiAqIEBndWlkZSB0aGVtaW5nLmh0bWwjbW9kaWZpZXJzIFtlbl1Nb3JlIGRldGFpbHMgYWJvdXQgdGhlIGBtb2RpZmllcmAgYXR0cmlidXRlWy9lbl1bamFdbW9kaWZpZXLlsZ7mgKfjga7kvb/jgYTmlrlbL2phXVxuICogQGV4YW1wbGVcbiAqIDxvbnMtc3dpdGNoIGNoZWNrZWQ+PC9vbnMtc3dpdGNoPlxuICogPG9ucy1zd2l0Y2ggZGlzYWJsZWQ+PC9vbnMtc3dpdGNoPlxuICogPG9ucy1zd2l0Y2ggbW9kaWZpZXI9XCJtYXRlcmlhbFwiPjwvb25zLXN3aXRjaD5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTd2l0Y2hFbGVtZW50IGV4dGVuZHMgQmFzZUNoZWNrYm94RWxlbWVudCB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaygnbW9kaWZpZXInLCBudWxsLCB0aGlzLmdldEF0dHJpYnV0ZSgnbW9kaWZpZXInKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9vbkNoYW5nZSA9IHRoaXMuX29uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25SZWxlYXNlID0gdGhpcy5fb25SZWxlYXNlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fbGFzdFRpbWVTdGFtcCA9IDA7XG4gIH1cblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4gc2NoZW1lO1xuICB9XG5cbiAgZ2V0IF9kZWZhdWx0Q2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAnc3dpdGNoJztcbiAgfVxuXG4gIGdldCBfdGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxpbnB1dCB0eXBlPVwiJHt0aGlzLnR5cGV9XCIgY2xhc3M9XCIke3RoaXMuX2RlZmF1bHRDbGFzc05hbWV9X19pbnB1dFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIiR7dGhpcy5fZGVmYXVsdENsYXNzTmFtZX1fX3RvZ2dsZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiJHt0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lfV9faGFuZGxlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIiR7dGhpcy5fZGVmYXVsdENsYXNzTmFtZX1fX3RvdWNoXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiAnY2hlY2tib3gnO1xuICB9XG5cbiAgLyogT3duIHByb3BzICovXG5cbiAgX2dldFBvc2l0aW9uKGUpIHtcbiAgICBjb25zdCBsID0gdGhpcy5fbG9jYXRpb25zO1xuICAgIHJldHVybiBNYXRoLm1pbihsWzFdLCBNYXRoLm1heChsWzBdLCB0aGlzLl9zdGFydFggKyBlLmdlc3R1cmUuZGVsdGFYKSk7XG4gIH1cblxuICBfZW1pdENoYW5nZUV2ZW50KCkge1xuICAgIHV0aWwudHJpZ2dlckVsZW1lbnRFdmVudCh0aGlzLCAnY2hhbmdlJywge1xuICAgICAgdmFsdWU6IHRoaXMuY2hlY2tlZCxcbiAgICAgIHN3aXRjaDogdGhpcyxcbiAgICAgIGlzSW50ZXJhY3RpdmU6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIF9vbkNoYW5nZShldmVudCkge1xuICAgIGlmIChldmVudCAmJiBldmVudC5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpO1xuICB9XG5cbiAgX29uQ2xpY2soZXYpIHtcbiAgICBpZiAoZXYudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhgJHt0aGlzLmRlZmF1bHRFbGVtZW50Q2xhc3N9X190b3VjaGApXG4gICAgICB8fCAoZXYudGltZVN0YW1wIC0gdGhpcy5fbGFzdFRpbWVTdGFtcCA8IDUwKSAvLyBQcmV2ZW50IHNlY29uZCBjbGljayB0cmlnZ2VyZWQgYnkgPGxhYmVsPlxuICAgICkge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgdGhpcy5fbGFzdFRpbWVTdGFtcCA9IGV2LnRpbWVTdGFtcDtcbiAgfVxuXG4gIF9vbkhvbGQoZSkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgTW9kaWZpZXJVdGlsLmFkZE1vZGlmaWVyKHRoaXMsICdhY3RpdmUnKTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3JlbGVhc2UnLCB0aGlzLl9vblJlbGVhc2UpO1xuICAgIH1cbiAgfVxuXG4gIF9vbkRyYWdTdGFydChlKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgWydsZWZ0JywgJ3JpZ2h0J10uaW5kZXhPZihlLmdlc3R1cmUuZGlyZWN0aW9uKSA9PT0gLTEpIHtcbiAgICAgIE1vZGlmaWVyVXRpbC5yZW1vdmVNb2RpZmllcih0aGlzLCAnYWN0aXZlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZS5jb25zdW1lZCA9IHRydWU7XG5cbiAgICBNb2RpZmllclV0aWwuYWRkTW9kaWZpZXIodGhpcywgJ2FjdGl2ZScpO1xuICAgIHRoaXMuX3N0YXJ0WCA9IHRoaXMuX2xvY2F0aW9uc1t0aGlzLmNoZWNrZWQgPyAxIDogMF07Ly8gLSBlLmdlc3R1cmUuZGVsdGFYO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdkcmFnJywgdGhpcy5fb25EcmFnKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdyZWxlYXNlJywgdGhpcy5fb25SZWxlYXNlKTtcbiAgfVxuXG4gIF9vbkRyYWcoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5faGFuZGxlLnN0eWxlLmxlZnQgPSB0aGlzLl9nZXRQb3NpdGlvbihlKSArICdweCc7XG4gIH1cblxuICBfb25SZWxlYXNlKGUpIHtcbiAgICBjb25zdCBsID0gdGhpcy5fbG9jYXRpb25zO1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5fZ2V0UG9zaXRpb24oZSk7XG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuY2hlY2tlZDtcblxuICAgIHRoaXMuY2hlY2tlZCA9IHBvc2l0aW9uID49IChsWzBdICsgbFsxXSkgLyAyO1xuXG4gICAgaWYgKHRoaXMuY2hlY2tlZCAhPT0gcHJldmlvdXNWYWx1ZSkge1xuICAgICAgdGhpcy5fZW1pdENoYW5nZUV2ZW50KCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnJywgdGhpcy5fb25EcmFnKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWxlYXNlJywgdGhpcy5fb25SZWxlYXNlKTtcblxuICAgIHRoaXMuX2hhbmRsZS5zdHlsZS5sZWZ0ID0gJyc7XG4gICAgTW9kaWZpZXJVdGlsLnJlbW92ZU1vZGlmaWVyKHRoaXMsICdhY3RpdmUnKTtcbiAgfVxuXG4gIGNsaWNrKGV2ID0ge30pIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuY2hlY2tlZCA9ICF0aGlzLmNoZWNrZWQ7XG4gICAgICB0aGlzLl9lbWl0Q2hhbmdlRXZlbnQoKTtcbiAgICAgIHRoaXMuX2xhc3RUaW1lU3RhbXAgPSBldi50aW1lU3RhbXAgfHwgMDtcbiAgICB9XG4gIH1cblxuICBnZXQgX2hhbmRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKGAuJHt0aGlzLl9kZWZhdWx0Q2xhc3NOYW1lfV9faGFuZGxlYCk7XG4gIH1cblxuICBnZXQgY2hlY2tib3goKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lucHV0O1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2lucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX29uQ2hhbmdlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnU3RhcnQpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignaG9sZCcsIHRoaXMuX29uSG9sZCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCd0YXAnLCB0aGlzLmNsaWNrKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljayk7XG4gICAgdGhpcy5fZ2VzdHVyZURldGVjdG9yID0gbmV3IEdlc3R1cmVEZXRlY3Rvcih0aGlzLCB7IGRyYWdNaW5EaXN0YW5jZTogMSwgaG9sZFRpbWVvdXQ6IDI1MSwgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB7XG4gICAgICB0aGlzLl9pbnB1dC5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLl9vbkNoYW5nZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMuX29uRHJhZ1N0YXJ0KTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2hvbGQnLCB0aGlzLl9vbkhvbGQpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGFwJywgdGhpcy5jbGljayk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2spO1xuICAgIGlmICh0aGlzLl9nZXN0dXJlRGV0ZWN0b3IpIHtcbiAgICAgIHRoaXMuX2dlc3R1cmVEZXRlY3Rvci5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIFsuLi5zdXBlci5vYnNlcnZlZEF0dHJpYnV0ZXMsICdtb2RpZmllciddO1xuICB9XG5cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIGxhc3QsIGN1cnJlbnQpIHtcbiAgICBpZiAobmFtZSA9PT0gJ21vZGlmaWVyJykge1xuICAgICAgY29uc3QgbWQgPSAoY3VycmVudCB8fCAnJykuaW5kZXhPZignbWF0ZXJpYWwnKSAhPT0gLTE7XG4gICAgICB0aGlzLl9sb2NhdGlvbnMgPSBsb2NhdGlvbnNbbWQgPyAnbWF0ZXJpYWwnIDogJ2lvcyddO1xuICAgIH1cblxuICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZXZlbnQgY2hhbmdlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCB3aGVuIHRoZSBzd2l0Y2ggaXMgdG9nZ2xlZC5bL2VuXVxuICAgKiAgIFtqYV1PTi9PRkbjgYzlpInjgo/jgaPjgZ/mmYLjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC5zd2l0Y2hcbiAgICogICBbZW5dU3dpdGNoIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqTjg5njg7Pjg4jjgYznmbrngavjgZfjgZ9Td2l0Y2jjgqrjg5bjgrjjgqfjgq/jg4jjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGV2ZW50LnZhbHVlXG4gICAqICAgW2VuXUN1cnJlbnQgdmFsdWUuWy9lbl1cbiAgICogICBbamFd54++5Zyo44Gu5YCk44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtCb29sZWFufSBldmVudC5pc0ludGVyYWN0aXZlXG4gICAqICAgW2VuXVRydWUgaWYgdGhlIGNoYW5nZSB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyIGNsaWNraW5nIG9uIHRoZSBzd2l0Y2guWy9lbl1cbiAgICogICBbamFd44K/44OD44OX44KE44Kv44Oq44OD44Kv44Gq44Gp44Gu44Om44O844K244Gu5pON5L2c44Gr44KI44Gj44Gm5aSJ44KP44Gj44Gf5aC05ZCI44Gr44GvdHJ1ZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIG1vZGlmaWVyXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVRoZSBhcHBlYXJhbmNlIG9mIHRoZSBzd2l0Y2guWy9lbl1cbiAgICogIFtqYV3jgrnjgqTjg4Pjg4Hjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgc3dpdGNoIGlzIGJlIGRpc2FibGVkLlsvZW5dXG4gICAqICAgW2phXeOCueOCpOODg+ODgeOCkueEoeWKueOBrueKtuaFi+OBq+OBmeOCi+WgtOWQiOOBq+aMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGNoZWNrZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIHN3aXRjaCBpcyBjaGVja2VkLlsvZW5dXG4gICAqICAgW2phXeOCueOCpOODg+ODgeOBjE9O44Gu54q25oWL44Gr44GZ44KL44Go44GN44Gr5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgaW5wdXQtaWRcbiAgICogQHR5cGUge1N0cmluZ31cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGBpZGAgYXR0cmlidXRlIG9mIHRoZSBpbm5lciBgPGlucHV0PmAgZWxlbWVudC4gVGhpcyBpcyB1c2VmdWwgd2hlbiB1c2luZyBgPGxhYmVsIGZvcj1cIi4uLlwiPmAgZWxlbWVudHMuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBjaGVja2VkXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhpcyB2YWx1ZSBpcyBgdHJ1ZWAgaWYgdGhlIHN3aXRjaCBpcyBjaGVja2VkLlsvZW5dXG4gICAqICAgW2phXeOCueOCpOODg+ODgeOBjE9O44Gu5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2YWx1ZVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGlucHV0LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGNoZWNrYm94XG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgdW5kZXJseWluZyBjaGVja2JveCBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXeOCs+ODs+ODneODvOODjeODs+ODiOWGhemDqOOBrmNoZWNrYm946KaB57Sg44Gr44Gq44KK44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgZm9jdXNcbiAgICogQHNpZ25hdHVyZSBmb2N1cygpXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Gb2N1c2VzIHRoZSBzd2l0Y2guWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYmx1clxuICAgKiBAc2lnbmF0dXJlIGJsdXIoKVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dUmVtb3ZlcyBmb2N1cyBmcm9tIHRoZSBzd2l0Y2guWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG59XG5cbm9uc0VsZW1lbnRzLlN3aXRjaCA9IFN3aXRjaEVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy1zd2l0Y2gnLCBTd2l0Y2hFbGVtZW50KTtcbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGludGVybmFsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9pbmRleC5qcyc7XG5pbXBvcnQgYXV0b1N0eWxlIGZyb20gJy4uL29ucy9hdXRvc3R5bGUuanMnO1xuaW1wb3J0IFN3aXBlciBmcm9tICcuLi9vbnMvaW50ZXJuYWwvc3dpcGVyLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEJhc2VFbGVtZW50IGZyb20gJy4vYmFzZS9iYXNlLWVsZW1lbnQuanMnO1xuaW1wb3J0IGNvbnRlbnRSZWFkeSBmcm9tICcuLi9vbnMvY29udGVudC1yZWFkeS5qcyc7XG5cbmNvbnN0IHNjaGVtZSA9IHtcbiAgJy50YWJiYXJfX2NvbnRlbnQnOiAndGFiYmFyLS0qX19jb250ZW50JyxcbiAgJy50YWJiYXJfX2JvcmRlcic6ICd0YWJiYXItLSpfX2JvcmRlcicsXG4gICcudGFiYmFyJzogJ3RhYmJhci0tKidcbn07XG5cbmNvbnN0IHJld3JpdGFibGVzID0ge1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YWJiYXJFbGVtZW50XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICByZWFkeSh0YWJiYXJFbGVtZW50LCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cbn07XG5cbmNvbnN0IG51bGxQYWdlID0gaW50ZXJuYWwubnVsbEVsZW1lbnQ7XG5jb25zdCBsZXJwID0gKHgwLCB4MSwgdCkgPT4gKDEgLSB0KSAqIHgwICsgdCAqIHgxO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy10YWJiYXJcbiAqIEBjYXRlZ29yeSB0YWJiYXJcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQSBjb21wb25lbnQgdG8gZGlzcGxheSBhIHRhYiBiYXIgb24gdGhlIGJvdHRvbSBvZiBhIHBhZ2UuIFVzZWQgd2l0aCBgPG9ucy10YWI+YCB0byBtYW5hZ2UgcGFnZXMgdXNpbmcgdGFicy5bL2VuXVxuICogICBbamFd44K/44OW44OQ44O844KS44Oa44O844K45LiL6YOo44Gr6KGo56S644GZ44KL44Gf44KB44Gu44Kz44Oz44Od44O844ON44Oz44OI44Gn44GZ44CCb25zLXRhYuOBqOe1hOOBv+WQiOOCj+OBm+OBpuS9v+OBhuOBk+OBqOOBp+OAgeODmuODvOOCuOOCkueuoeeQhuOBp+OBjeOBvuOBmeOAglsvamFdXG4gKiBAY29kZXBlbiBwR3VETFxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3RhYmJhclxuICogQG1vZGlmaWVyIG1hdGVyaWFsXG4gKiAgIFtlbl1BIHRhYmJhciBpbiBNYXRlcmlhbCBEZXNpZ24uWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAbW9kaWZpZXIgYXV0b2dyb3dcbiAqICAgW2VuXVRhYnMgYXV0b21hdGljYWxseSBncm93IGRlcGVuZGluZyBvbiB0aGVpciBjb250ZW50IGluc3RlYWQgb2YgaGF2aW5nIGEgZml4ZWQgd2lkdGguWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAbW9kaWZpZXIgdG9wLWJvcmRlclxuICogICBbZW5dU2hvd3MgYSBzdGF0aWMgYm9yZGVyLWJvdHRvbSBpbiB0YWJzIGZvciBpT1MgdG9wIHRhYmJhcnMuWy9lbl1cbiAqICAgW2phXVsvamFdXG4gKiBAZ3VpZGUgZnVuZGFtZW50YWxzLmh0bWwjbWFuYWdpbmctcGFnZXNcbiAqICBbZW5dTWFuYWdpbmcgbXVsdGlwbGUgcGFnZXMuWy9lbl1cbiAqICBbamFd6KSH5pWw44Gu44Oa44O844K444KS566h55CG44GZ44KLWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy10YWJcbiAqICAgW2VuXVRoZSBgPG9ucy10YWI+YCBjb21wb25lbnQuWy9lbl1cbiAqICAgW2phXW9ucy10YWLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLXBhZ2VcbiAqICAgW2VuXVRoZSBgPG9ucy1wYWdlPmAgY29tcG9uZW50LlsvZW5dXG4gKiAgIFtqYV1vbnMtcGFnZeOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy10YWJiYXI+XG4gKiAgIDxvbnMtdGFiXG4gKiAgICAgcGFnZT1cImhvbWUuaHRtbFwiXG4gKiAgICAgbGFiZWw9XCJIb21lXCJcbiAqICAgICBhY3RpdmU+XG4gKiAgIDwvb25zLXRhYj5cbiAqICAgPG9ucy10YWJcbiAqICAgICBwYWdlPVwic2V0dGluZ3MuaHRtbFwiXG4gKiAgICAgbGFiZWw9XCJTZXR0aW5nc1wiXG4gKiAgICAgYWN0aXZlPlxuICogICA8L29ucy10YWI+XG4gKiA8L29ucy10YWJiYXI+XG4gKlxuICogPHRlbXBsYXRlIGlkPVwiaG9tZS5odG1sXCI+XG4gKiAgIC4uLlxuICogPC90ZW1wbGF0ZT5cbiAqXG4gKiA8dGVtcGxhdGUgaWQ9XCJzZXR0aW5ncy5odG1sXCI+XG4gKiAgIC4uLlxuICogPC90ZW1wbGF0ZT5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFiYmFyRWxlbWVudCBleHRlbmRzIEJhc2VFbGVtZW50IHtcblxuICAvKipcbiAgICogQGV2ZW50IHByZWNoYW5nZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZXMganVzdCBiZWZvcmUgdGhlIHRhYiBpcyBjaGFuZ2VkLlsvZW5dXG4gICAqICAgW2phXeOCouOCr+ODhuOCo+ODluOBquOCv+ODluOBjOWkieOCj+OCi+WJjeOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmluZGV4XG4gICAqICAgW2VuXUN1cnJlbnQgaW5kZXguWy9lbl1cbiAgICogICBbamFd54++5Zyo44Ki44Kv44OG44Kj44OW44Gr44Gq44Gj44Gm44GE44KLb25zLXRhYuOBruOCpOODs+ODh+ODg+OCr+OCueOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC50YWJJdGVtXG4gICAqICAgW2VuXVRhYiBpdGVtIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV10YWJJdGVt44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUNhbGwgdGhpcyBmdW5jdGlvbiB0byBjYW5jZWwgdGhlIGNoYW5nZSBldmVudC5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7plqLmlbDjgpLlkbzjgbPlh7rjgZnjgajjgIHjgqLjgq/jg4bjgqPjg5bjgarjgr/jg5bjga7lpInmm7TjgYzjgq3jg6Pjg7Pjgrvjg6vjgZXjgozjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGV2ZW50IHBvc3RjaGFuZ2VcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVzIGp1c3QgYWZ0ZXIgdGhlIHRhYiBpcyBjaGFuZ2VkLlsvZW5dXG4gICAqICAgW2phXeOCouOCr+ODhuOCo+ODluOBquOCv+ODluOBjOWkieOCj+OBo+OBn+W+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmluZGV4XG4gICAqICAgW2VuXUN1cnJlbnQgaW5kZXguWy9lbl1cbiAgICogICBbamFd54++5Zyo44Ki44Kv44OG44Kj44OW44Gr44Gq44Gj44Gm44GE44KLb25zLXRhYuOBruOCpOODs+ODh+ODg+OCr+OCueOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC50YWJJdGVtXG4gICAqICAgW2VuXVRhYiBpdGVtIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV10YWJJdGVt44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCByZWFjdGl2ZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZXMgaWYgdGhlIGFscmVhZHkgb3BlbiB0YWIgaXMgdGFwcGVkIGFnYWluLlsvZW5dXG4gICAqICAgW2phXeOBmeOBp+OBq+OCouOCr+ODhuOCo+ODluOBq+OBquOBo+OBpuOBhOOCi+OCv+ODluOBjOOCguOBhuS4gOW6puOCv+ODg+ODl+OChOOCr+ODquODg+OCr+OBleOCjOOBn+WgtOWQiOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudFxuICAgKiAgIFtlbl1FdmVudCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kk44OZ44Oz44OI44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGV2ZW50LmluZGV4XG4gICAqICAgW2VuXUN1cnJlbnQgaW5kZXguWy9lbl1cbiAgICogICBbamFd54++5Zyo44Ki44Kv44OG44Kj44OW44Gr44Gq44Gj44Gm44GE44KLb25zLXRhYuOBruOCpOODs+ODh+ODg+OCr+OCueOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC50YWJJdGVtXG4gICAqICAgW2VuXVRhYiBpdGVtIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV10YWJJdGVt44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBldmVudCBzd2lwZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZXMgd2hlbiB0aGUgdGFiYmFyIHN3aXBlcy5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogICBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCpOODmeODs+ODiOOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBldmVudC5pbmRleFxuICAgKiAgIFtlbl1DdXJyZW50IGluZGV4LlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOCouOCr+ODhuOCo+ODluOBq+OBquOBo+OBpuOBhOOCi29ucy10YWLjga7jgqTjg7Pjg4fjg4Pjgq/jgrnjgpLov5TjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQub3B0aW9uc1xuICAgKiAgIFtlbl1BbmltYXRpb24gb3B0aW9ucyBvYmplY3QuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IG5vbmVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBgXCJub25lXCJgIHRoZSB0cmFuc2l0aW9ucyB3aWxsIG5vdCBiZSBhbmltYXRlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb24tb3B0aW9uc1xuICAgKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgIJlLmcuIHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBhbmltYXRpb25PcHRpb25zXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCB0aW1pbmcgYW5kIGRlbGF5IHdpdGggYW4gb2JqZWN0IGxpdGVyYWwuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CCZS5nLiB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDEsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHBvc2l0aW9uXG4gICAqIEBpbml0b25seVxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVmYXVsdCBib3R0b21cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRhYmJhcidzIHBvc2l0aW9uLiBBdmFpbGFibGUgdmFsdWVzIGFyZSBgXCJib3R0b21cImAgYW5kIGBcInRvcFwiYC4gVXNlIGBcImF1dG9cImAgdG8gY2hvb3NlIHBvc2l0aW9uIGRlcGVuZGluZyBvbiBwbGF0Zm9ybSAoYm90dG9tIGZvciBpT1MgZmxhdCBkZXNpZ24sIHRvcCBmb3IgTWF0ZXJpYWwgRGVzaWduKS5bL2VuXVxuICAgKiAgIFtqYV3jgr/jg5bjg5Djg7zjga7kvY3nva7jgpLmjIflrprjgZfjgb7jgZnjgIJcImJvdHRvbVwi44KC44GX44GP44GvXCJ0b3BcIuOCkumBuOaKnuOBp+OBjeOBvuOBmeOAguODh+ODleOCqeODq+ODiOOBr1wiYm90dG9tXCLjgafjgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBzd2lwZWFibGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0aGUgdGFiIGJhciBjYW4gYmUgc2Nyb2xsZWQgYnkgZHJhZyBvciBzd2lwZS5bL2VuXVxuICAgKiAgIFtqYV3jgZPjga7lsZ7mgKfjgYzjgYLjgovmmYLjgIHjgr/jg5bjg5Djg7zjgpLjgrnjg6/jgqTjg5fjgoTjg4njg6njg4PjgrDjgafnp7vli5XjgafjgY3jgovjgojjgYbjgavjgarjgorjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBpZ25vcmUtZWRnZS13aWR0aFxuICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgKiBAZGVmYXVsdCAyMFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRGlzdGFuY2UgaW4gcGl4ZWxzIGZyb20gYm90aCBlZGdlcy4gU3dpcGluZyBvbiB0aGVzZSBhcmVhcyB3aWxsIHByaW9yaXRpemUgcGFyZW50IGNvbXBvbmVudHMgc3VjaCBhcyBgb25zLXNwbGl0dGVyYCBvciBgb25zLW5hdmlnYXRvcmAuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYWN0aXZlLWluZGV4XG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZWZhdWx0IDBcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBpbmRleCBvZiB0aGUgdGFiIHRoYXQgaXMgY3VycmVudGx5IGFjdGl2ZS5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGFjdGl2ZUluZGV4XG4gICAqIEB0eXBlIHtOdW1iZXJ9XG4gICAqIEBkZWZhdWx0IDBcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRoZSBpbmRleCBvZiB0aGUgdGFiIHRoYXQgaXMgY3VycmVudGx5IGFjdGl2ZS5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBoaWRlLXRhYnNcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdG8gaGlkZSB0aGUgdGFicy5bL2VuXVxuICAgKiAgIFtqYV3jgr/jg5bjgpLpnZ7ooajnpLrjgavjgZnjgovloLTlkIjjgavmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IGhpZGVUYWJzXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRvIGhpZGUgdGhlIHRhYnMuWy9lbl1cbiAgICogICBbamFd44K/44OW44KS6Z2e6KGo56S644Gr44GZ44KL5aC05ZCI44Gr5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgdGFiLWJvcmRlclxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRoZSB0YWJzIHNob3cgYSBkeW5hbWljIGJvdHRvbSBib3JkZXIuIE9ubHkgd29ya3MgZm9yIGlPUyBmbGF0IGRlc2lnbiBzaW5jZSB0aGUgYm9yZGVyIGlzIGFsd2F5cyB2aXNpYmxlIGluIE1hdGVyaWFsIERlc2lnbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHByb3BlcnR5IHRhYkJvcmRlclxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUlmIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRoZSB0YWJzIHNob3cgYSBkeW5hbWljIGJvdHRvbSBib3JkZXIuIE9ubHkgd29ya3MgZm9yIGlPUyBmbGF0IGRlc2lnbiBzaW5jZSB0aGUgYm9yZGVyIGlzIGFsd2F5cyB2aXNpYmxlIGluIE1hdGVyaWFsIERlc2lnbi5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHRhYmJhci5bL2VuXVxuICAgKiAgIFtqYV3jgr/jg5bjg5Djg7zjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2xvYWRJbmFjdGl2ZSA9IHV0aWwuZGVmZXIoKTsgLy8gSW1wcm92ZXMgIzIzMjRcbiAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fY29tcGlsZSgpKTtcblxuICAgIGNvbnN0IHtvbkNvbm5lY3RlZCwgb25EaXNjb25uZWN0ZWR9ID0gdXRpbC5kZWZpbmVMaXN0ZW5lclByb3BlcnR5KHRoaXMsICdzd2lwZScpO1xuICAgIHRoaXMuX2Nvbm5lY3RPblN3aXBlID0gb25Db25uZWN0ZWQ7XG4gICAgdGhpcy5fZGlzY29ubmVjdE9uU3dpcGUgPSBvbkRpc2Nvbm5lY3RlZDtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICghdGhpcy5fc3dpcGVyKSB7XG4gICAgICB0aGlzLl9zd2lwZXIgPSBuZXcgU3dpcGVyKHtcbiAgICAgICAgZ2V0RWxlbWVudDogKCkgPT4gdGhpcy5fY29udGVudEVsZW1lbnQsXG4gICAgICAgIGdldEluaXRpYWxJbmRleDogKCkgPT4gdGhpcy5hY3RpdmVJbmRleCB8fCB0aGlzLmdldEF0dHJpYnV0ZSgnYWN0aXZlSW5kZXgnKSxcbiAgICAgICAgZ2V0QXV0b1Njcm9sbFJhdGlvOiB0aGlzLl9nZXRBdXRvU2Nyb2xsUmF0aW8uYmluZCh0aGlzKSxcbiAgICAgICAgZ2V0QnViYmxlV2lkdGg6ICgpID0+IHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdpZ25vcmUtZWRnZS13aWR0aCcpIHx8IDI1LCAxMCksXG4gICAgICAgIGlzQXV0b1Njcm9sbGFibGU6ICgpID0+IHRydWUsXG4gICAgICAgIHByZUNoYW5nZUhvb2s6IHRoaXMuX29uUHJlQ2hhbmdlLmJpbmQodGhpcyksXG4gICAgICAgIHBvc3RDaGFuZ2VIb29rOiB0aGlzLl9vblBvc3RDaGFuZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgcmVmcmVzaEhvb2s6IHRoaXMuX29uUmVmcmVzaC5iaW5kKHRoaXMpLFxuICAgICAgICBzY3JvbGxIb29rOiB0aGlzLl9vblNjcm9sbC5iaW5kKHRoaXMpXG4gICAgICB9KTtcblxuICAgICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgICAgdGhpcy5fdGFiYmFyQm9yZGVyID0gdXRpbC5maW5kQ2hpbGQodGhpcy5fdGFiYmFyRWxlbWVudCwgJy50YWJiYXJfX2JvcmRlcicpO1xuICAgICAgICB0aGlzLl9zd2lwZXIuaW5pdCh7IHN3aXBlYWJsZTogdGhpcy5oYXNBdHRyaWJ1dGUoJ3N3aXBlYWJsZScpIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICB0aGlzLl91cGRhdGVWaXNpYmlsaXR5KCk7XG5cbiAgICAgIGlmICghdXRpbC5maW5kUGFyZW50KHRoaXMsICdvbnMtcGFnZScsIHAgPT4gcCA9PT0gZG9jdW1lbnQuYm9keSkpIHtcbiAgICAgICAgdGhpcy5fc2hvdygpOyAvLyBUaGlzIHRhYmJhciBpcyB0aGUgdG9wIGNvbXBvbmVudFxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fY29ubmVjdE9uU3dpcGUoKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICh0aGlzLl9zd2lwZXIgJiYgdGhpcy5fc3dpcGVyLmluaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLl9zd2lwZXIuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5fc3dpcGVyID0gbnVsbDtcbiAgICAgIHRoaXMuX3RhYmJhckJvcmRlciA9IG51bGw7XG4gICAgICB0aGlzLl90YWJzUmVjdCA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fZGlzY29ubmVjdE9uU3dpcGUoKTtcbiAgfVxuXG4gIF9ub3JtYWxpemVFdmVudChldmVudCkge1xuICAgIHJldHVybiB7IC4uLmV2ZW50LCBpbmRleDogZXZlbnQuYWN0aXZlSW5kZXgsIHRhYkl0ZW06IHRoaXMudGFic1tldmVudC5hY3RpdmVJbmRleF0gfTtcbiAgfVxuXG4gIF9vblBvc3RDaGFuZ2UoZXZlbnQpIHtcbiAgICBldmVudCA9IHRoaXMuX25vcm1hbGl6ZUV2ZW50KGV2ZW50KTtcbiAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3Bvc3RjaGFuZ2UnLCBldmVudCk7XG4gICAgY29uc3QgcGFnZSA9IGV2ZW50LnRhYkl0ZW0ucGFnZUVsZW1lbnQ7XG4gICAgcGFnZSAmJiBwYWdlLl9zaG93KCk7XG4gIH1cblxuICBfb25QcmVDaGFuZ2UoZXZlbnQpIHtcbiAgICBldmVudCA9IHRoaXMuX25vcm1hbGl6ZUV2ZW50KGV2ZW50KTtcbiAgICBldmVudC5jYW5jZWwgPSAoKSA9PiBldmVudC5jYW5jZWxlZCA9IHRydWU7XG5cbiAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3ByZWNoYW5nZScsIGV2ZW50KTtcblxuICAgIGlmICghZXZlbnQuY2FuY2VsZWQpIHtcbiAgICAgIGNvbnN0IHsgYWN0aXZlSW5kZXgsIGxhc3RBY3RpdmVJbmRleCB9ID0gZXZlbnQ7XG4gICAgICBjb25zdCB0YWJzID0gdGhpcy50YWJzO1xuXG4gICAgICB0YWJzW2FjdGl2ZUluZGV4XS5zZXRBY3RpdmUodHJ1ZSk7XG4gICAgICBpZiAobGFzdEFjdGl2ZUluZGV4ID49IDApIHtcbiAgICAgICAgY29uc3QgcHJldlRhYiA9IHRhYnNbbGFzdEFjdGl2ZUluZGV4XTtcbiAgICAgICAgcHJldlRhYi5zZXRBY3RpdmUoZmFsc2UpO1xuICAgICAgICBwcmV2VGFiLnBhZ2VFbGVtZW50ICYmIHByZXZUYWIucGFnZUVsZW1lbnQuX2hpZGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnQuY2FuY2VsZWQ7XG4gIH1cblxuICBfb25TY3JvbGwoaW5kZXgsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICh0aGlzLl90YWJiYXJCb3JkZXIpIHtcbiAgICAgIHRoaXMuX3RhYmJhckJvcmRlci5zdHlsZS50cmFuc2l0aW9uID0gYGFsbCAke29wdGlvbnMuZHVyYXRpb24gfHwgMH1zICR7b3B0aW9ucy50aW1pbmcgfHwgJyd9YDtcblxuICAgICAgaWYgKHRoaXMuX2F1dG9ncm93ICYmIHRoaXMuX3RhYnNSZWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYSA9IE1hdGguZmxvb3IoaW5kZXgpLCBiID0gTWF0aC5jZWlsKGluZGV4KSwgciA9IGluZGV4ICUgMTtcbiAgICAgICAgdGhpcy5fdGFiYmFyQm9yZGVyLnN0eWxlLndpZHRoID0gbGVycCh0aGlzLl90YWJzUmVjdFthXS53aWR0aCwgdGhpcy5fdGFic1JlY3RbYl0ud2lkdGgsIHIpICsgJ3B4JztcbiAgICAgICAgdGhpcy5fdGFiYmFyQm9yZGVyLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgke2xlcnAodGhpcy5fdGFic1JlY3RbYV0ubGVmdCwgdGhpcy5fdGFic1JlY3RbYl0ubGVmdCwgcil9cHgsIDAsIDApYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3RhYmJhckJvcmRlci5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoJHtpbmRleCAqIDEwMH0lLCAwLCAwKWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXRpbC50cmlnZ2VyRWxlbWVudEV2ZW50KHRoaXMsICdzd2lwZScsIHsgaW5kZXgsIG9wdGlvbnMgfSk7XG4gIH1cblxuICBfb25SZWZyZXNoKCkge1xuICAgIHRoaXMuX2F1dG9ncm93ID0gdXRpbC5oYXNNb2RpZmllcih0aGlzLCAnYXV0b2dyb3cnKTtcbiAgICB0aGlzLl90YWJzUmVjdCA9IHRoaXMudGFicy5tYXAodGFiID0+IHRhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG4gICAgaWYgKHRoaXMuX3RhYmJhckJvcmRlcikge1xuICAgICAgdGhpcy5fdGFiYmFyQm9yZGVyLnN0eWxlLmRpc3BsYXkgPSB0aGlzLmhhc0F0dHJpYnV0ZSgndGFiLWJvcmRlcicpIHx8IHV0aWwuaGFzTW9kaWZpZXIodGhpcywgJ21hdGVyaWFsJykgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdldEFjdGl2ZVRhYkluZGV4KCk7XG4gICAgICBpZiAodGhpcy5fdGFic1JlY3QubGVuZ3RoID4gMCAmJiBpbmRleCA+PSAwKSB7XG4gICAgICAgIHRoaXMuX3RhYmJhckJvcmRlci5zdHlsZS53aWR0aCA9IHRoaXMuX3RhYnNSZWN0W2luZGV4XS53aWR0aCArICdweCc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2dldEF1dG9TY3JvbGxSYXRpbyhtYXRjaGVzLCB2ZWxvY2l0eSwgc2l6ZSkge1xuICAgIGNvbnN0IHJhdGlvID0gLjY7IC8vIEJhc2UgcmF0aW9cbiAgICBjb25zdCBtb2RpZmllciA9IHNpemUgLyAzMDAgKiAobWF0Y2hlcyA/IC0xIDogMSk7IC8vIEJhc2VkIG9uIHNjcmVlbiBzaXplXG4gICAgcmV0dXJuIE1hdGgubWluKDEsIE1hdGgubWF4KDAsIHJhdGlvICsgdmVsb2NpdHkgKiBtb2RpZmllcikpO1xuICB9XG5cbiAgZ2V0IF90YWJiYXJFbGVtZW50KCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRDaGlsZCh0aGlzLCAnLnRhYmJhcicpO1xuICB9XG5cbiAgZ2V0IF9jb250ZW50RWxlbWVudCgpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJy50YWJiYXJfX2NvbnRlbnQnKTtcbiAgfVxuXG4gIGdldCBfdGFyZ2V0RWxlbWVudCgpIHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fY29udGVudEVsZW1lbnQ7XG4gICAgcmV0dXJuIGNvbnRlbnQgJiYgY29udGVudC5jaGlsZHJlblswXSB8fCBudWxsO1xuICB9XG5cbiAgX2NvbXBpbGUoKSB7XG4gICAgYXV0b1N0eWxlLnByZXBhcmUodGhpcyk7XG5cbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fY29udGVudEVsZW1lbnQgfHwgdXRpbC5jcmVhdGUoJy50YWJiYXJfX2NvbnRlbnQnKTtcbiAgICBjb250ZW50LmNsYXNzTGlzdC5hZGQoJ29ucy10YWJiYXJfX2NvbnRlbnQnKTtcbiAgICBjb25zdCB0YWJiYXIgPSB0aGlzLl90YWJiYXJFbGVtZW50IHx8IHV0aWwuY3JlYXRlKCcudGFiYmFyJyk7XG4gICAgdGFiYmFyLmNsYXNzTGlzdC5hZGQoJ29ucy10YWJiYXJfX2Zvb3RlcicpO1xuXG4gICAgaWYgKCF0YWJiYXIucGFyZW50Tm9kZSkge1xuICAgICAgd2hpbGUgKHRoaXMuZmlyc3RDaGlsZCkge1xuICAgICAgICB0YWJiYXIuYXBwZW5kQ2hpbGQodGhpcy5maXJzdENoaWxkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGFiYmFyLmNoaWxkcmVuLmxlbmd0aCA+IHRoaXMuYWN0aXZlSW5kZXggJiYgIXV0aWwuZmluZENoaWxkKHRhYmJhciwgJ1thY3RpdmVdJykpIHtcbiAgICAgIHRhYmJhci5jaGlsZHJlblt0aGlzLmFjdGl2ZUluZGV4XS5zZXRBdHRyaWJ1dGUoJ2FjdGl2ZScsICcnKTtcbiAgICB9XG5cbiAgICB0aGlzLl90YWJiYXJCb3JkZXIgPSB1dGlsLmZpbmRDaGlsZCh0YWJiYXIsICcudGFiYmFyX19ib3JkZXInKSB8fCB1dGlsLmNyZWF0ZSgnLnRhYmJhcl9fYm9yZGVyJyk7XG4gICAgdGFiYmFyLmFwcGVuZENoaWxkKHRoaXMuX3RhYmJhckJvcmRlcik7XG4gICAgdGFiYmFyLmNsYXNzTGlzdC5hZGQoJ29ucy1zd2lwZXItdGFiYmFyJyk7IC8vIEhpZGVzIG1hdGVyaWFsIGJvcmRlclxuXG4gICAgIWNvbnRlbnQuY2hpbGRyZW5bMF0gJiYgY29udGVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG4gICAgIWNvbnRlbnQuY2hpbGRyZW5bMV0gJiYgY29udGVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG4gICAgY29udGVudC5hcHBlbmRDaGlsZCA9IGNvbnRlbnQuYXBwZW5kQ2hpbGQuYmluZChjb250ZW50LmNoaWxkcmVuWzBdKTtcbiAgICBjb250ZW50Lmluc2VydEJlZm9yZSA9IGNvbnRlbnQuaW5zZXJ0QmVmb3JlLmJpbmQoY29udGVudC5jaGlsZHJlblswXSk7XG5cbiAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGFiYmFyKTsgLy8gVHJpZ2dlcnMgb25zLXRhYiBjb25uZWN0ZWRDYWxsYmFja1xuXG4gICAgTW9kaWZpZXJVdGlsLmluaXRNb2RpZmllcih0aGlzLCBzY2hlbWUpO1xuICB9XG5cbiAgX3VwZGF0ZVBvc2l0aW9uKHBvc2l0aW9uID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJykpIHtcbiAgICBjb25zdCB0b3AgPSB0aGlzLl90b3AgPSBwb3NpdGlvbiA9PT0gJ3RvcCcgfHwgKHBvc2l0aW9uID09PSAnYXV0bycgJiYgdXRpbC5oYXNNb2RpZmllcih0aGlzLCAnbWF0ZXJpYWwnKSk7XG4gICAgY29uc3QgYWN0aW9uID0gdG9wID8gdXRpbC5hZGRNb2RpZmllciA6IHV0aWwucmVtb3ZlTW9kaWZpZXI7XG5cbiAgICBhY3Rpb24odGhpcywgJ3RvcCcpO1xuXG4gICAgY29uc3QgcGFnZSA9IHV0aWwuZmluZFBhcmVudCh0aGlzLCAnb25zLXBhZ2UnKTtcbiAgICBpZiAocGFnZSkge1xuICAgICAgY29udGVudFJlYWR5KHBhZ2UsICgpID0+IHtcbiAgICAgICAgbGV0IHAgPSAwO1xuICAgICAgICBpZiAocGFnZS5jaGlsZHJlblswXSAmJiB1dGlsLm1hdGNoKHBhZ2UuY2hpbGRyZW5bMF0sICdvbnMtdG9vbGJhcicpKSB7XG4gICAgICAgICAgYWN0aW9uKHBhZ2UuY2hpbGRyZW5bMF0sICdub3NoYWRvdycpO1xuICAgICAgICAgIHAgPSAxOyAvLyBWaXN1YWwgZml4IGZvciBzb21lIGRldmljZXNcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBwYWdlLl9nZXRDb250ZW50RWxlbWVudCgpO1xuICAgICAgICBjb25zdCBjcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhZ2UuX2dldENvbnRlbnRFbGVtZW50KCksIG51bGwpO1xuXG4gICAgICAgIHRoaXMuc3R5bGUudG9wID0gdG9wID8gcGFyc2VJbnQoY3MuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy10b3AnKSwgMTApIC0gcCArICdweCcgOiAnJztcblxuICAgICAgICAvLyBSZWZyZXNoIGNvbnRlbnQgdG9wIC0gRml4IGZvciBpT1MgOFxuICAgICAgICBjb250ZW50LnN0eWxlLnRvcCA9IGNzLnRvcDtcbiAgICAgICAgY29udGVudC5zdHlsZS50b3AgPSAnJztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGludGVybmFsLmF1dG9TdGF0dXNCYXJGaWxsKCgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGxlZCA9IHV0aWwuZmluZFBhcmVudCh0aGlzLCBlID0+IGUuaGFzQXR0cmlidXRlKCdzdGF0dXMtYmFyLWZpbGwnKSk7XG4gICAgICB1dGlsLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLCAnc3RhdHVzLWJhci1maWxsJywgdG9wICYmICFmaWxsZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHRvcFBhZ2UoKSB7XG4gICAgY29uc3QgdGFicyA9IHRoaXMudGFicyxcbiAgICAgIGluZGV4ID0gdGhpcy5nZXRBY3RpdmVUYWJJbmRleCgpO1xuICAgIHJldHVybiB0YWJzW2luZGV4XVxuICAgICAgPyB0YWJzW2luZGV4XS5wYWdlRWxlbWVudCB8fCB0aGlzLnBhZ2VzWzBdIHx8IG51bGxcbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIGdldCBwYWdlcygpIHtcbiAgICByZXR1cm4gdXRpbC5hcnJheUZyb20odGhpcy5fdGFyZ2V0RWxlbWVudC5jaGlsZHJlbik7XG4gIH1cblxuICBnZXQgdGFicygpIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHRoaXMuX3RhYmJhckVsZW1lbnQuY2hpbGRyZW4sIGUgPT4gZS50YWdOYW1lID09PSAnT05TLVRBQicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2V0QWN0aXZlVGFiXG4gICAqIEBzaWduYXR1cmUgc2V0QWN0aXZlVGFiKGluZGV4LCBbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleFxuICAgKiAgIFtlbl1UYWIgaW5kZXguWy9lbl1cbiAgICogICBbamFd44K/44OW44Gu44Kk44Oz44OH44OD44Kv44K544KS5oyH5a6a44GX44G+44GZ44CCWy9qYV1cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLmNhbGxiYWNrXVxuICAgKiAgIFtlbl1GdW5jdGlvbiB0aGF0IHJ1bnMgd2hlbiB0aGUgbmV3IHBhZ2UgaGFzIGxvYWRlZC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1JZiB0aGlzIG9wdGlvbiBpcyBcIm5vbmVcIiwgdGhlIHRyYW5zaXRpb24gd29uJ3Qgc2xpZGUuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHNwZWNpZmllZCB0YWIgcGFnZS4gQW5pbWF0aW9ucyBhbmQgdGhlaXIgb3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSBzZWNvbmQgcGFyYW1ldGVyLlsvZW5dXG4gICAqICAgW2phXeaMh+WumuOBl+OBn+OCpOODs+ODh+ODg+OCr+OCueOBruOCv+ODluOCkuihqOekuuOBl+OBvuOBmeOAguOCouODi+ODoeODvOOCt+ODp+ODs+OBquOBqeOBruOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBp+OBjeOBvuOBmeOAglsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXUEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgcGFnZSBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuICBzZXRBY3RpdmVUYWIobmV4dEluZGV4LCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBwcmV2aW91c0luZGV4ID0gdGhpcy5hY3RpdmVJbmRleDtcblxuICAgIHRoaXMuX2FjdGl2ZUluZGV4U2tpcEVmZmVjdCA9IHRydWU7XG4gICAgdGhpcy5hY3RpdmVJbmRleCA9IG5leHRJbmRleDtcblxuICAgIHJldHVybiB0aGlzLl91cGRhdGVBY3RpdmVJbmRleChuZXh0SW5kZXgsIHByZXZpb3VzSW5kZXgsIG9wdGlvbnMpO1xuICB9XG5cbiAgX3VwZGF0ZUFjdGl2ZUluZGV4KG5leHRJbmRleCwgcHJldkluZGV4LCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBwcmV2VGFiID0gdGhpcy50YWJzW3ByZXZJbmRleF0sXG4gICAgICBuZXh0VGFiID0gdGhpcy50YWJzW25leHRJbmRleF07XG5cbiAgICBpZiAoIW5leHRUYWIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnU3BlY2lmaWVkIGluZGV4IGRvZXMgbm90IG1hdGNoIGFueSB0YWIuJyk7XG4gICAgfVxuXG4gICAgaWYgKG5leHRJbmRleCA9PT0gcHJldkluZGV4KSB7XG4gICAgICB1dGlsLnRyaWdnZXJFbGVtZW50RXZlbnQodGhpcywgJ3JlYWN0aXZlJywgeyBpbmRleDogbmV4dEluZGV4LCBhY3RpdmVJbmRleDogbmV4dEluZGV4LCB0YWJJdGVtOiBuZXh0VGFiIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0VGFiLnBhZ2VFbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBGSVhNRTogbmV4dFRhYi5sb2FkZWQgaXMgYnJva2VuIGluIFpvbmUuanMgcHJvbWlzZXMgKEFuZ3VsYXIyKVxuICAgIGNvbnN0IG5leHRQYWdlID0gbmV4dFRhYi5wYWdlRWxlbWVudDtcbiAgICByZXR1cm4gKG5leHRQYWdlID8gUHJvbWlzZS5yZXNvbHZlKG5leHRQYWdlKSA6IG5leHRUYWIubG9hZGVkKVxuICAgICAgLnRoZW4obmV4dFBhZ2UgPT4gdGhpcy5fc3dpcGVyLnNldEFjdGl2ZUluZGV4KG5leHRJbmRleCwge1xuICAgICAgICByZWplY3Q6IHRydWUsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGFuaW1hdGlvbjogcHJldlRhYiAmJiBuZXh0UGFnZSA/IG9wdGlvbnMuYW5pbWF0aW9uIHx8IHRoaXMuZ2V0QXR0cmlidXRlKCdhbmltYXRpb24nKSA6ICdub25lJyxcbiAgICAgICAgYW5pbWF0aW9uT3B0aW9uczogdXRpbC5leHRlbmQoXG4gICAgICAgICAgeyBkdXJhdGlvbjogLjMsIHRpbWluZzogJ2N1YmljLWJlemllciguNCwgLjcsIC41LCAxKScgfSxcbiAgICAgICAgICB0aGlzLmFuaW1hdGlvbk9wdGlvbnMsXG4gICAgICAgICAgb3B0aW9ucy5hbmltYXRpb25PcHRpb25zIHx8IHt9XG4gICAgICAgIClcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICBvcHRpb25zLmNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb3B0aW9ucy5jYWxsYmFjayhuZXh0UGFnZSk7XG4gICAgICAgIHJldHVybiBuZXh0UGFnZTtcbiAgICAgIH0pKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2V0VGFiYmFyVmlzaWJpbGl0eVxuICAgKiBAc2lnbmF0dXJlIHNldFRhYmJhclZpc2liaWxpdHkodmlzaWJsZSlcbiAgICogQHBhcmFtIHtCb29sZWFufSB2aXNpYmxlXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Vc2VkIHRvIGhpZGUgb3Igc2hvdyB0aGUgdGFiIGJhci5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cbiAgc2V0VGFiYmFyVmlzaWJpbGl0eSh2aXNpYmxlKSB7XG4gICAgdGhpcy5oaWRlVGFicyA9ICF2aXNpYmxlO1xuICB9XG5cbiAgc2hvdygpIHtcbiAgICB0aGlzLmhpZGVUYWJzID0gZmFsc2U7XG4gIH1cblxuICBoaWRlKCkge1xuICAgIHRoaXMuaGlkZVRhYnMgPSB0cnVlO1xuICB9XG5cbiAgX3VwZGF0ZVZpc2liaWxpdHkoKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIGNvbnN0IHZpc2libGUgPSAhdGhpcy5oaWRlVGFicztcbiAgICAgIHRoaXMuX2NvbnRlbnRFbGVtZW50LnN0eWxlW3RoaXMuX3RvcCA/ICd0b3AnIDogJ2JvdHRvbSddID0gdmlzaWJsZSA/ICcnIDogJzBweCc7XG4gICAgICB0aGlzLl90YWJiYXJFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSB2aXNpYmxlID8gJycgOiAnbm9uZSc7XG4gICAgICB2aXNpYmxlICYmIHRoaXMuX29uUmVmcmVzaCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSB2aXNpYmxlXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIHRhYmJhciBpcyB2aXNpYmxlIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3jgr/jg5bjg5Djg7zjgYzopovjgYjjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cbiAgZ2V0IHZpc2libGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmJhckVsZW1lbnQuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBzd2lwZWFibGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1FbmFibGUgc3dpcGUgaW50ZXJhY3Rpb24uWy9lbl1cbiAgICogICBbamFdc3dpcGVhYmxl44Gn44GC44KM44GwdHJ1ZeOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25Td2lwZVxuICAgKiBAdHlwZSB7RnVuY3Rpb259XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1Ib29rIGNhbGxlZCB3aGVuZXZlciB0aGUgdXNlciBzbGlkZXMgdGhlIHRhYmJhci4gSXQgZ2V0cyBhIGRlY2ltYWwgaW5kZXggYW5kIGFuIGFuaW1hdGlvbk9wdGlvbnMgb2JqZWN0IGFzIGFyZ3VtZW50cy5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQG1ldGhvZCBnZXRBY3RpdmVUYWJJbmRleFxuICAgKiBAc2lnbmF0dXJlIGdldEFjdGl2ZVRhYkluZGV4KClcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKiAgIFtlbl1UaGUgaW5kZXggb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGFiLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOCouOCr+ODhuOCo+ODluOBq+OBquOBo+OBpuOBhOOCi+OCv+ODluOBruOCpOODs+ODh+ODg+OCr+OCueOCkui/lOOBl+OBvuOBmeOAglsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1SZXR1cm5zIHRhYiBpbmRleCBvbiBjdXJyZW50IGFjdGl2ZSB0YWIuIElmIGFjdGl2ZSB0YWIgaXMgbm90IGZvdW5kLCByZXR1cm5zIC0xLlsvZW5dXG4gICAqICAgW2phXeePvuWcqOOCouOCr+ODhuOCo+ODluOBq+OBquOBo+OBpuOBhOOCi+OCv+ODluOBruOCpOODs+ODh+ODg+OCr+OCueOCkui/lOOBl+OBvuOBmeOAguePvuWcqOOCouOCr+ODhuOCo+ODluOBquOCv+ODluOBjOOBquOBhOWgtOWQiOOBq+OBry0x44KS6L+U44GX44G+44GZ44CCWy9qYV1cbiAgICovXG4gIGdldEFjdGl2ZVRhYkluZGV4KHRhYnMgPSB0aGlzLnRhYnMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0YWJzW2ldICYmIHRhYnNbaV0udGFnTmFtZSA9PT0gJ09OUy1UQUInICYmIHRhYnNbaV0uaXNBY3RpdmUoKSkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZUluZGV4KCkge1xuICAgIHJldHVybiBOdW1iZXIodGhpcy5nZXRBdHRyaWJ1dGUoJ2FjdGl2ZS1pbmRleCcpKTtcbiAgfVxuXG4gIHNldCBhY3RpdmVJbmRleCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYWN0aXZlLWluZGV4JywgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIF9zaG93KCkge1xuICAgIHRoaXMuX3N3aXBlci5zaG93KCk7XG5cbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgY29uc3QgdGFicyA9IHRoaXMudGFicztcbiAgICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gdGhpcy5nZXRBY3RpdmVUYWJJbmRleCh0YWJzKTtcbiAgICAgIHRoaXMuX2xvYWRJbmFjdGl2ZS5yZXNvbHZlKCk7XG4gICAgICBpZiAodGFicy5sZW5ndGggPiAwICYmIGFjdGl2ZUluZGV4ID49IDApIHtcbiAgICAgICAgdGFic1thY3RpdmVJbmRleF0ubG9hZGVkLnRoZW4oZWwgPT4gZWwgJiYgc2V0SW1tZWRpYXRlKCgpID0+IGVsLl9zaG93KCkpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9oaWRlKCkge1xuICAgIHRoaXMuX3N3aXBlci5oaWRlKCk7XG4gICAgY29uc3QgdG9wUGFnZSA9IHRoaXMudG9wUGFnZTtcbiAgICB0b3BQYWdlICYmIHRvcFBhZ2UuX2hpZGUoKTtcbiAgfVxuXG4gIF9kZXN0cm95KCkge1xuICAgIHRoaXMudGFicy5mb3JFYWNoKHRhYiA9PiB0YWIucmVtb3ZlKCkpO1xuICAgIHRoaXMucmVtb3ZlKCk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4gWydtb2RpZmllcicsICdwb3NpdGlvbicsICdzd2lwZWFibGUnLCAndGFiLWJvcmRlcicsICdoaWRlLXRhYnMnLCAnYWN0aXZlLWluZGV4J107XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgbGFzdCwgY3VycmVudCkge1xuICAgIGlmIChuYW1lID09PSAnbW9kaWZpZXInKSB7XG4gICAgICBNb2RpZmllclV0aWwub25Nb2RpZmllckNoYW5nZWQobGFzdCwgY3VycmVudCwgdGhpcywgc2NoZW1lKTtcbiAgICAgIGNvbnN0IGlzVG9wID0gbSA9PiAvKF58XFxzKyl0b3AoJHxcXHMrKS9pLnRlc3QobSk7XG4gICAgICBpc1RvcChsYXN0KSAhPT0gaXNUb3AoY3VycmVudCkgJiYgdGhpcy5fdXBkYXRlUG9zaXRpb24oKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwb3NpdGlvbicpIHtcbiAgICAgIHV0aWwuaXNBdHRhY2hlZCh0aGlzKSAmJiB0aGlzLl91cGRhdGVQb3NpdGlvbigpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3N3aXBlYWJsZScpIHtcbiAgICAgIHRoaXMuX3N3aXBlciAmJiB0aGlzLl9zd2lwZXIudXBkYXRlU3dpcGVhYmxlKHRoaXMuaGFzQXR0cmlidXRlKCdzd2lwZWFibGUnKSk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAnaGlkZS10YWJzJykge1xuICAgICAgdGhpcy5pc0Nvbm5lY3RlZCAmJiB0aGlzLl91cGRhdGVWaXNpYmlsaXR5KCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAnYWN0aXZlLWluZGV4Jykge1xuICAgICAgaWYgKHRoaXMuX2FjdGl2ZUluZGV4U2tpcEVmZmVjdCkge1xuICAgICAgICB0aGlzLl9hY3RpdmVJbmRleFNraXBFZmZlY3QgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gdGhpcy5fdXBkYXRlQWN0aXZlSW5kZXgoY3VycmVudCwgbGFzdCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXQgcmV3cml0YWJsZXMoKSB7XG4gICAgcmV0dXJuIHJld3JpdGFibGVzO1xuICB9XG5cbiAgc3RhdGljIGdldCBldmVudHMoKSB7XG4gICAgcmV0dXJuIFsncHJlY2hhbmdlJywgJ3Bvc3RjaGFuZ2UnLCAncmVhY3RpdmUnLCAnc3dpcGUnXTtcbiAgfVxuXG4gIGdldCBhbmltYXRpb25PcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmhhc0F0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKSA/XG4gICAgICB1dGlsLmFuaW1hdGlvbk9wdGlvbnNQYXJzZSh0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnKSkgOiB7fTtcbiAgfVxuXG4gIHNldCBhbmltYXRpb25PcHRpb25zKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdhbmltYXRpb24tb3B0aW9ucycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYW5pbWF0aW9uLW9wdGlvbnMnLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIH1cbiAgfVxufVxuXG51dGlsLmRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzKFRhYmJhckVsZW1lbnQsIFsnaGlkZS10YWJzJywgJ3N3aXBlYWJsZScsICd0YWItYm9yZGVyJ10pO1xuXG5vbnNFbGVtZW50cy5UYWJiYXIgPSBUYWJiYXJFbGVtZW50O1xuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdvbnMtdGFiYmFyJywgVGFiYmFyRWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCB1dGlsIGZyb20gJy4uL29ucy91dGlsLmpzJztcbmltcG9ydCBhdXRvU3R5bGUgZnJvbSAnLi4vb25zL2F1dG9zdHlsZS5qcyc7XG5pbXBvcnQgTW9kaWZpZXJVdGlsIGZyb20gJy4uL29ucy9pbnRlcm5hbC9tb2RpZmllci11dGlsLmpzJztcbmltcG9ydCBCYXNlRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1lbGVtZW50LmpzJztcbmltcG9ydCBUYWJiYXJFbGVtZW50IGZyb20gJy4vb25zLXRhYmJhci5qcyc7XG5pbXBvcnQgY29udGVudFJlYWR5IGZyb20gJy4uL29ucy9jb250ZW50LXJlYWR5LmpzJztcbmltcG9ydCB7IFBhZ2VMb2FkZXIsIGRlZmF1bHRQYWdlTG9hZGVyIH0gZnJvbSAnLi4vb25zL3BhZ2UtbG9hZGVyLmpzJztcblxuY29uc3QgZGVmYXVsdENsYXNzTmFtZSA9ICd0YWJiYXJfX2l0ZW0nO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcnOiAndGFiYmFyLS0qX19pdGVtJyxcbiAgJy50YWJiYXJfX2J1dHRvbic6ICd0YWJiYXItLSpfX2J1dHRvbidcbn07XG5cbi8qKlxuICogQGVsZW1lbnQgb25zLXRhYlxuICogQGNhdGVnb3J5IHRhYmJhclxuICogQGRlc2NyaXB0aW9uXG4gKiAgIFtlbl1SZXByZXNlbnRzIGEgdGFiIGluc2lkZSB0YWIgYmFyLiBFYWNoIGA8b25zLXRhYj5gIHJlcHJlc2VudHMgYSBwYWdlLlsvZW5dXG4gKiAgIFtqYV1cbiAqICAgICDjgr/jg5bjg5Djg7zjgavphY3nva7jgZXjgozjgovlkITjgqLjgqTjg4bjg6Djga7jgrPjg7Pjg53jg7zjg43jg7Pjg4jjgafjgZnjgILjgZ3jgozjgZ7jgozjga5vbnMtdGFi44Gv44Oa44O844K444KS6KGo44GX44G+44GZ44CCXG4gKiAgICAgb25zLXRhYuimgee0oOOBruS4reOBq+OBr+OAgeOCv+ODluOBq+ihqOekuuOBleOCjOOCi+OCs+ODs+ODhuODs+ODhOOCkuebtOaOpeiomOi/sOOBmeOCi+OBk+OBqOOBjOWHuuadpeOBvuOBmeOAglxuICogICBbL2phXVxuICogQGNvZGVwZW4gcEd1RExcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS90YWJiYXJcbiAqIEBndWlkZSBmdW5kYW1lbnRhbHMuaHRtbCNtYW5hZ2luZy1wYWdlc1xuICogICBbZW5dTWFuYWdpbmcgbXVsdGlwbGUgcGFnZXMuWy9lbl1cbiAqICAgW2phXeikh+aVsOOBruODmuODvOOCuOOCkueuoeeQhuOBmeOCi1svamFdXVxuICogQGd1aWRlIGFwcHNpemUuaHRtbCNyZW1vdmluZy1pY29uLXBhY2tzIFtlbl1SZW1vdmluZyBpY29uIHBhY2tzLlsvZW5dW2phXVsvamFdXG4gKiBAZ3VpZGUgZmFxLmh0bWwjaG93LWNhbi1pLXVzZS1jdXN0b20taWNvbi1wYWNrcyBbZW5dQWRkaW5nIGN1c3RvbSBpY29uIHBhY2tzLlsvZW5dW2phXVsvamFdXG4gKiBAc2VlYWxzbyBvbnMtdGFiYmFyXG4gKiAgIFtlbl1vbnMtdGFiYmFyIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtdGFiYmFy44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBzZWVhbHNvIG9ucy1wYWdlXG4gKiAgIFtlbl1vbnMtcGFnZSBjb21wb25lbnRbL2VuXVxuICogICBbamFdb25zLXBhZ2XjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWljb25cbiAqICAgW2VuXW9ucy1pY29uIGNvbXBvbmVudFsvZW5dXG4gKiAgIFtqYV1vbnMtaWNvbuOCs+ODs+ODneODvOODjeODs+ODiFsvamFdXG4gKiBAZXhhbXBsZVxuICogPG9ucy10YWJiYXI+XG4gKiAgIDxvbnMtdGFiXG4gKiAgICAgcGFnZT1cImhvbWUuaHRtbFwiXG4gKiAgICAgbGFiZWw9XCJIb21lXCJcbiAqICAgICBhY3RpdmU+XG4gKiAgIDwvb25zLXRhYj5cbiAqICAgPG9ucy10YWJcbiAqICAgICBwYWdlPVwic2V0dGluZ3MuaHRtbFwiXG4gKiAgICAgbGFiZWw9XCJTZXR0aW5nc1wiXG4gKiAgICAgYWN0aXZlPlxuICogICA8L29ucy10YWI+XG4gKiA8L29ucy10YWJiYXI+XG4gKlxuICogPHRlbXBsYXRlIGlkPVwiaG9tZS5odG1sXCI+XG4gKiAgIC4uLlxuICogPC90ZW1wbGF0ZT5cbiAqXG4gKiA8dGVtcGxhdGUgaWQ9XCJzZXR0aW5ncy5odG1sXCI+XG4gKiAgIC4uLlxuICogPC90ZW1wbGF0ZT5cblxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUYWJFbGVtZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQge1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIHBhZ2VcbiAgICogQGluaXRvbmx5XG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgcGFnZSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIHRoZSB0YWIgaXMgdGFwcGVkLlsvZW5dXG4gICAqICAgW2phXW9ucy10YWLjgYzlj4LnhafjgZnjgovjg5rjg7zjgrjjgbjjga5VUkzjgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBpY29uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1cbiAgICogICAgIFRoZSBpY29uIG5hbWUgZm9yIHRoZSB0YWIuIENhbiBzcGVjaWZ5IHRoZSBzYW1lIGljb24gbmFtZSBhcyBgPG9ucy1pY29uPmAuIENoZWNrIFtTZWUgYWxzb10oI3NlZWFsc28pIHNlY3Rpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAqICAgWy9lbl1cbiAgICogICBbamFdXG4gICAqICAgICDjgqLjgqTjgrPjg7PlkI3jgpLmjIflrprjgZfjgb7jgZnjgIJvbnMtaWNvbuOBqOWQjOOBmOOCouOCpOOCs+ODs+WQjeOCkuaMh+WumuOBp+OBjeOBvuOBmeOAglxuICAgKiAgICAg5YCL5Yil44Gr44Ki44Kk44Kz44Oz44KS44Kr44K544K/44Oe44Kk44K644GZ44KL5aC05ZCI44Gv44CBYmFja2dyb3VuZC1pbWFnZeOBquOBqeOBrkNTU+OCueOCv+OCpOODq+OCkueUqOOBhOOBpuaMh+WumuOBp+OBjeOBvuOBmeOAglxuICAgKiAgIFsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFjdGl2ZS1pY29uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgbmFtZSBvZiB0aGUgaWNvbiB3aGVuIHRoZSB0YWIgaXMgYWN0aXZlLlsvZW5dXG4gICAqICAgW2phXeOCouOCr+ODhuOCo+ODluOBrumam+OBruOCouOCpOOCs+ODs+WQjeOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGxhYmVsXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1UaGUgbGFiZWwgb2YgdGhlIHRhYiBpdGVtLlsvZW5dXG4gICAqICAgW2phXeOCouOCpOOCs+ODs+S4i+OBq+ihqOekuuOBleOCjOOCi+ODqeODmeODq+OCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGJhZGdlXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1EaXNwbGF5IGEgbm90aWZpY2F0aW9uIGJhZGdlIG9uIHRvcCBvZiB0aGUgdGFiLlsvZW5dXG4gICAqICAgW2phXeODkOODg+OCuOOBq+ihqOekuuOBmeOCi+WGheWuueOCkuaMh+WumuOBl+OBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAYXR0cmlidXRlIGFjdGl2ZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhpcyBhdHRyaWJ1dGUgc2hvdWxkIGJlIHNldCB0byB0aGUgdGFiIHRoYXQgaXMgYWN0aXZlIGJ5IGRlZmF1bHQuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmIChbJ2xhYmVsJywgJ2ljb24nLCAnYmFkZ2UnXS5zb21lKHRoaXMuaGFzQXR0cmlidXRlLmJpbmQodGhpcykpKSB7XG4gICAgICB0aGlzLl9jb21waWxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl9jb21waWxlKCkpO1xuICAgIH1cblxuICAgIHRoaXMuX3BhZ2VMb2FkZXIgPSBkZWZhdWx0UGFnZUxvYWRlcjtcbiAgICB0aGlzLl9vbkNsaWNrID0gdGhpcy5fb25DbGljay5iaW5kKHRoaXMpO1xuXG4gICAgY29uc3Qge29uQ29ubmVjdGVkLCBvbkRpc2Nvbm5lY3RlZH0gPSB1dGlsLmRlZmluZUxpc3RlbmVyUHJvcGVydHkodGhpcywgJ2NsaWNrJyk7XG4gICAgdGhpcy5fY29ubmVjdE9uQ2xpY2sgPSBvbkNvbm5lY3RlZDtcbiAgICB0aGlzLl9kaXNjb25uZWN0T25DbGljayA9IG9uRGlzY29ubmVjdGVkO1xuICB9XG5cbiAgc2V0IHBhZ2VMb2FkZXIobG9hZGVyKSB7XG4gICAgaWYgKCEobG9hZGVyIGluc3RhbmNlb2YgUGFnZUxvYWRlcikpIHtcbiAgICAgIHV0aWwudGhyb3dQYWdlTG9hZGVyKCk7XG4gICAgfVxuICAgIHRoaXMuX3BhZ2VMb2FkZXIgPSBsb2FkZXI7XG4gIH1cblxuICBnZXQgcGFnZUxvYWRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZUxvYWRlcjtcbiAgfVxuXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChkZWZhdWx0Q2xhc3NOYW1lKTtcblxuICAgIGlmICh0aGlzLl9idXR0b24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBidXR0b24gPSB1dGlsLmNyZWF0ZSgnYnV0dG9uLnRhYmJhcl9fYnV0dG9uJyk7XG4gICAgd2hpbGUgKHRoaXMuY2hpbGROb2Rlc1swXSkge1xuICAgICAgYnV0dG9uLmFwcGVuZENoaWxkKHRoaXMuY2hpbGROb2Rlc1swXSk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXQgPSB1dGlsLmNyZWF0ZSgnaW5wdXQnLCB7IGRpc3BsYXk6ICdub25lJyB9KTtcbiAgICBpbnB1dC50eXBlID0gJ3JhZGlvJztcblxuICAgIHRoaXMuYXBwZW5kQ2hpbGQoaW5wdXQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcblxuICAgIHRoaXMuX3VwZGF0ZUJ1dHRvbkNvbnRlbnQoKTtcbiAgICBNb2RpZmllclV0aWwuaW5pdE1vZGlmaWVyKHRoaXMsIHNjaGVtZSk7XG4gICAgdGhpcy5fdXBkYXRlUmlwcGxlKCk7XG4gIH1cblxuICBfdXBkYXRlUmlwcGxlKCkge1xuICAgIHRoaXMuX2J1dHRvbiAmJiB1dGlsLnVwZGF0ZVJpcHBsZSh0aGlzLl9idXR0b24sIHRoaXMuaGFzQXR0cmlidXRlKCdyaXBwbGUnKSk7XG4gIH1cblxuICBfdXBkYXRlQnV0dG9uQ29udGVudCgpIHtcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLl9idXR0b247XG5cbiAgICBsZXQgaWNvbldyYXBwZXIgPSB0aGlzLl9pY29uO1xuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnaWNvbicpKSB7XG4gICAgICBpY29uV3JhcHBlciA9IGljb25XcmFwcGVyIHx8IHV0aWwuY3JlYXRlRWxlbWVudCgnPGRpdiBjbGFzcz1cInRhYmJhcl9faWNvblwiPjxvbnMtaWNvbj48L29ucy1pY29uPjwvZGl2PicpO1xuICAgICAgY29uc3QgaWNvbiA9IGljb25XcmFwcGVyLmNoaWxkcmVuWzBdO1xuICAgICAgY29uc3QgZml4ID0gKGxhc3QgPT4gKCkgPT4gaWNvbi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soJ2ljb24nLCBsYXN0LCB0aGlzLmdldEF0dHJpYnV0ZSgnaWNvbicpKSkoaWNvbi5nZXRBdHRyaWJ1dGUoJ2ljb24nKSk7XG4gICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2ljb24nKSAmJiB0aGlzLmhhc0F0dHJpYnV0ZSgnYWN0aXZlLWljb24nKSkge1xuICAgICAgICBpY29uLnNldEF0dHJpYnV0ZSgnaWNvbicsIHRoaXMuZ2V0QXR0cmlidXRlKHRoaXMuaXNBY3RpdmUoKSA/ICdhY3RpdmUtaWNvbicgOiAnaWNvbicpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2ljb24nKSkge1xuICAgICAgICBpY29uLnNldEF0dHJpYnV0ZSgnaWNvbicsIHRoaXMuZ2V0QXR0cmlidXRlKCdpY29uJykpO1xuICAgICAgfVxuICAgICAgaWNvbldyYXBwZXIucGFyZW50RWxlbWVudCAhPT0gYnV0dG9uICYmIGJ1dHRvbi5pbnNlcnRCZWZvcmUoaWNvbldyYXBwZXIsIGJ1dHRvbi5maXJzdENoaWxkKTtcblxuICAgICAgLy8gZGlydHkgZml4IGZvciBodHRwczovL2dpdGh1Yi5jb20vT25zZW5VSS9PbnNlblVJL2lzc3Vlcy8xNjU0XG4gICAgICBpY29uLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayBpbnN0YW5jZW9mIEZ1bmN0aW9uXG4gICAgICAgID8gZml4KClcbiAgICAgICAgOiBzZXRJbW1lZGlhdGUoKCkgPT4gaWNvbi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBmaXgoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGljb25XcmFwcGVyICYmIGljb25XcmFwcGVyLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIFsnbGFiZWwnLCAnYmFkZ2UnXS5mb3JFYWNoKChhdHRyLCBpbmRleCkgPT4ge1xuICAgICAgbGV0IHByb3AgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoYC50YWJiYXJfXyR7YXR0cn1gKTtcbiAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZShhdHRyKSkge1xuICAgICAgICBwcm9wID0gcHJvcCB8fCB1dGlsLmNyZWF0ZShgLnRhYmJhcl9fJHthdHRyfWAgKyAoYXR0ciA9PT0gJ2JhZGdlJyA/ICcgbm90aWZpY2F0aW9uJyA6ICcnKSk7XG4gICAgICAgIHByb3AudGV4dENvbnRlbnQgPSB0aGlzLmdldEF0dHJpYnV0ZShhdHRyKTtcbiAgICAgICAgcHJvcC5wYXJlbnRFbGVtZW50ICE9PSBidXR0b24gJiYgYnV0dG9uLmFwcGVuZENoaWxkKHByb3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvcCAmJiBwcm9wLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0IF9pbnB1dCgpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJ2lucHV0Jyk7XG4gIH1cblxuICBnZXQgX2J1dHRvbigpIHtcbiAgICByZXR1cm4gdXRpbC5maW5kQ2hpbGQodGhpcywgJy50YWJiYXJfX2J1dHRvbicpO1xuICB9XG5cbiAgZ2V0IF9pY29uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJy50YWJiYXJfX2ljb24nKTtcbiAgfVxuXG4gIGdldCBfdGFiYmFyKCkge1xuICAgIHJldHVybiB1dGlsLmZpbmRQYXJlbnQodGhpcywgJ29ucy10YWJiYXInKTtcbiAgfVxuXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0aGlzLnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIHRoaXMpO1xuICB9XG5cbiAgX29uQ2xpY2soZXZlbnQpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICB0aGlzLl90YWJiYXIuc2V0QWN0aXZlVGFiKHRoaXMuaW5kZXgsIHsgcmVqZWN0OiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldEFjdGl2ZShhY3RpdmUgPSB0cnVlKSB7XG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIHRoaXMuX2lucHV0LmNoZWNrZWQgPSBhY3RpdmU7XG4gICAgICB0aGlzLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIGFjdGl2ZSk7XG4gICAgICB1dGlsLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLCAnYWN0aXZlJywgYWN0aXZlKTtcblxuICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdpY29uJykgJiYgdGhpcy5oYXNBdHRyaWJ1dGUoJ2FjdGl2ZS1pY29uJykpIHtcbiAgICAgICAgdGhpcy5faWNvbi5jaGlsZHJlblswXS5zZXRBdHRyaWJ1dGUoJ2ljb24nLCB0aGlzLmdldEF0dHJpYnV0ZShhY3RpdmUgPyAnYWN0aXZlLWljb24nIDogJ2ljb24nKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfbG9hZFBhZ2VFbGVtZW50KHBhcmVudCwgcGFnZSkge1xuICAgIHRoaXMuX2hhc0xvYWRlZCA9IHRydWU7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICB0aGlzLl9wYWdlTG9hZGVyLmxvYWQoeyBwYXJlbnQsIHBhZ2UgfSwgcGFnZUVsZW1lbnQgPT4ge1xuICAgICAgICBwYXJlbnQucmVwbGFjZUNoaWxkKHBhZ2VFbGVtZW50LCBwYXJlbnQuY2hpbGRyZW5bdGhpcy5pbmRleF0pOyAvLyBFbnN1cmUgcG9zaXRpb25cbiAgICAgICAgdGhpcy5fbG9hZGVkUGFnZSA9IHBhZ2VFbGVtZW50O1xuICAgICAgICByZXNvbHZlKHBhZ2VFbGVtZW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHBhZ2VFbGVtZW50KCkge1xuICAgIC8vIEl0IGhhcyBiZWVuIGxvYWRlZCBieSBvbnMtdGFiXG4gICAgaWYgKHRoaXMuX2xvYWRlZFBhZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sb2FkZWRQYWdlO1xuICAgIH1cbiAgICAvLyBNYW51YWxseSBhdHRhY2hlZCB0byBET00sIDEgcGVyIHRhYlxuICAgIGNvbnN0IHRhYmJhciA9IHRoaXMuX3RhYmJhcjtcbiAgICBpZiAodGFiYmFyLnBhZ2VzLmxlbmd0aCA9PT0gdGFiYmFyLnRhYnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGFiYmFyLnBhZ2VzW3RoaXMuaW5kZXhdO1xuICAgIH1cbiAgICAvLyBMb2FkZWQgaW4gYW5vdGhlciB3YXlcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgaXNBY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdhY3RpdmUnKTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrLCBmYWxzZSk7XG4gICAgaWYgKHRoaXMuX2xvYWRlZFBhZ2UpIHtcbiAgICAgIHRoaXMuX2hhc0xvYWRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5sb2FkZWQgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuX2Rpc2Nvbm5lY3RPbkNsaWNrKCk7XG4gIH1cblxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljaywgZmFsc2UpO1xuXG4gICAgaWYgKCF1dGlsLmlzQXR0YWNoZWQodGhpcykgfHwgdGhpcy5sb2FkZWQpIHtcbiAgICAgIHJldHVybjsgLy8gb25zLXRhYmJhciBjb21waWxhdGlvbiBtYXkgdHJpZ2dlciB0aGlzXG4gICAgfVxuXG4gICAgY29uc3QgZGVmZXJyZWQgPSB1dGlsLmRlZmVyKCk7XG4gICAgdGhpcy5sb2FkZWQgPSBkZWZlcnJlZC5wcm9taXNlO1xuXG4gICAgY29udGVudFJlYWR5KHRoaXMsICgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgIGNvbnN0IHRhYmJhciA9IHRoaXMuX3RhYmJhcjtcbiAgICAgIGlmICghdGFiYmFyKSB7XG4gICAgICAgIHV0aWwudGhyb3coJ1RhYiBlbGVtZW50cyBtdXN0IGJlIGNoaWxkcmVuIG9mIFRhYmJhcicpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGFiYmFyLmhhc0F0dHJpYnV0ZSgnbW9kaWZpZXInKSkge1xuICAgICAgICB1dGlsLmFkZE1vZGlmaWVyKHRoaXMsIHRhYmJhci5nZXRBdHRyaWJ1dGUoJ21vZGlmaWVyJykpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuX2hhc0xvYWRlZCkge1xuICAgICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ2FjdGl2ZScpKSB7XG4gICAgICAgICAgdGhpcy5zZXRBY3RpdmUodHJ1ZSk7XG4gICAgICAgICAgdGFiYmFyLmFjdGl2ZUluZGV4ID0gaW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5kZXggPT09IHRhYmJhci50YWJzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICB0YWJiYXIuX29uUmVmcmVzaCgpO1xuICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB0YWJiYXIuX29uUmVmcmVzaCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIFRhYmJhckVsZW1lbnQucmV3cml0YWJsZXMucmVhZHkodGFiYmFyLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFnZVRhcmdldCA9IHRoaXMucGFnZSB8fCB0aGlzLmdldEF0dHJpYnV0ZSgncGFnZScpO1xuICAgICAgICAgIGlmICghdGhpcy5wYWdlRWxlbWVudCAmJiBwYWdlVGFyZ2V0KSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRUYXJnZXQgPSB0YWJiYXIuX3RhcmdldEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBkdW1teVBhZ2UgPSB1dGlsLmNyZWF0ZSgnZGl2JywgeyBoZWlnaHQ6ICcxMDAlJywgd2lkdGg6ICcxMDAlJywgdmlzaWJpbGl0eTogJ2hpZGRlbicgfSk7XG4gICAgICAgICAgICBwYXJlbnRUYXJnZXQuaW5zZXJ0QmVmb3JlKGR1bW15UGFnZSwgcGFyZW50VGFyZ2V0LmNoaWxkcmVuW2luZGV4XSk7IC8vIEVuc3VyZSBwb3NpdGlvblxuXG4gICAgICAgICAgICBjb25zdCBsb2FkID0gKCkgPT4gdGhpcy5fbG9hZFBhZ2VFbGVtZW50KHBhcmVudFRhcmdldCwgcGFnZVRhcmdldCkudGhlbihkZWZlcnJlZC5yZXNvbHZlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzQWN0aXZlKCkgPyBsb2FkKCkgOiB0YWJiYXIuX2xvYWRJbmFjdGl2ZS5wcm9taXNlLnRoZW4obG9hZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnJlc29sdmUodGhpcy5wYWdlRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fY29ubmVjdE9uQ2xpY2soKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiBbJ21vZGlmaWVyJywgJ3JpcHBsZScsICdpY29uJywgJ2xhYmVsJywgJ3BhZ2UnLCAnYmFkZ2UnLCAnY2xhc3MnXTtcbiAgfVxuXG4gIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBsYXN0LCBjdXJyZW50KSB7XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlICdjbGFzcyc6XG4gICAgICAgIHV0aWwucmVzdG9yZUNsYXNzKHRoaXMsIGRlZmF1bHRDbGFzc05hbWUsIHNjaGVtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbW9kaWZpZXInOlxuICAgICAgICBjb250ZW50UmVhZHkodGhpcywgKCkgPT4gTW9kaWZpZXJVdGlsLm9uTW9kaWZpZXJDaGFuZ2VkKGxhc3QsIGN1cnJlbnQsIHRoaXMsIHNjaGVtZSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpcHBsZSc6XG4gICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl91cGRhdGVSaXBwbGUoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaWNvbic6XG4gICAgICBjYXNlICdsYWJlbCc6XG4gICAgICBjYXNlICdiYWRnZSc6XG4gICAgICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl91cGRhdGVCdXR0b25Db250ZW50KCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3BhZ2UnOlxuICAgICAgICB0aGlzLnBhZ2UgPSBjdXJyZW50IHx8ICcnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxub25zRWxlbWVudHMuVGFiID0gVGFiRWxlbWVudDtcbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnb25zLXRhYicsIFRhYkVsZW1lbnQpO1xuIiwiLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IEJhc2VBbmltYXRvciBmcm9tICcuLi8uLi9vbnMvYmFzZS1hbmltYXRvci5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvYXN0QW5pbWF0b3IgZXh0ZW5kcyBCYXNlQW5pbWF0b3Ige1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy50aW1pbmdcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZHVyYXRpb25cbiAgICogQHBhcmFtIHtOdW1iZXJ9IG9wdGlvbnMuZGVsYXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKHt0aW1pbmcgPSAnbGluZWFyJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMn0gPSB7fSkge1xuICAgIHN1cGVyKHsgdGltaW5nLCBkZWxheSwgZHVyYXRpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbW9kYWxcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNob3cobW9kYWwsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBtb2RhbFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZShtb2RhbCwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG59XG4iLCJcbi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBhbmltaXQgZnJvbSAnLi4vLi4vb25zL2FuaW1pdC5qcyc7XG5pbXBvcnQgVG9hc3RBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yLmpzJztcblxuLyoqXG4gKiBpT1Mgc3R5bGUgYW5pbWF0b3IgZm9yIGRpYWxvZy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmFkZVRvYXN0QW5pbWF0b3IgZXh0ZW5kcyBUb2FzdEFuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7dGltaW5nID0gJ2xpbmVhcicsIGRlbGF5ID0gMCwgZHVyYXRpb24gPSAwLjN9ID0ge30pIHtcbiAgICBzdXBlcih7IHRpbWluZywgZGVsYXksIGR1cmF0aW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvYXN0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzaG93KHRvYXN0LCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2sgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKCkge307XG5cbiAgICBhbmltaXQodG9hc3QsIHRoaXMuZGVmKVxuICAgICAgLmRlZmF1bHQoeyBvcGFjaXR5OiAwIH0sIHsgb3BhY2l0eTogMSB9KVxuICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9KVxuICAgICAgLnBsYXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0b2FzdFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgaGlkZSh0b2FzdCwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrID8gY2FsbGJhY2sgOiBmdW5jdGlvbigpIHt9O1xuXG4gICAgYW5pbWl0KHRvYXN0LCB0aGlzLmRlZilcbiAgICAgIC5kZWZhdWx0KHsgb3BhY2l0eTogMSB9LCB7IG9wYWNpdHk6IDAgfSlcbiAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSlcbiAgICAgIC5wbGF5KCk7XG4gIH1cbn1cbiIsIlxuLypcbkNvcHlyaWdodCAyMDEzLTIwMTUgQVNJQUwgQ09SUE9SQVRJT05cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuKi9cblxuaW1wb3J0IHV0aWwgZnJvbSAnLi4vLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGFuaW1pdCBmcm9tICcuLi8uLi9vbnMvYW5pbWl0LmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi8uLi9vbnMvcGxhdGZvcm0uanMnO1xuaW1wb3J0IGlQaG9uZVhQYXRjaCBmcm9tICcuLi8uLi9vbnMvaXBob25leC1wYXRjaC5qcyc7XG5pbXBvcnQgVG9hc3RBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yLmpzJztcblxuLyoqXG4gKiBBc2NlbmQgVG9hc3QgQW5pbWF0b3IuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFzY2VuZFRvYXN0QW5pbWF0b3IgZXh0ZW5kcyBUb2FzdEFuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7IHRpbWluZyA9ICdlYXNlJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMjUgfSA9IHt9KSB7XG4gICAgc3VwZXIoeyB0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbiB9KTtcblxuICAgIHRoaXMubWVzc2FnZURlbGF5ID0gdGhpcy5kdXJhdGlvbiAqIDAuNCArIHRoaXMuZGVsYXk7IC8vIERlbGF5IG1lc3NhZ2Ugb3BhY2l0eSBjaGFuZ2VcbiAgICBpZiAocGxhdGZvcm0uaXNBbmRyb2lkKCkpIHtcbiAgICAgIHRoaXMuYXNjZW5zaW9uID0gNDg7IC8vIFRvYXN0cyBhcmUgYWx3YXlzIDEgbGluZVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaVBob25lWFBhdGNoLmlzSVBob25lWFBvcnRyYWl0UGF0Y2hBY3RpdmUoKSkge1xuICAgICAgICB0aGlzLmFzY2Vuc2lvbiA9IDk4OyAvLyA2NCArIDM0XG4gICAgICB9IGVsc2UgaWYgKGlQaG9uZVhQYXRjaC5pc0lQaG9uZVhMYW5kc2NhcGVQYXRjaEFjdGl2ZSgpKSB7XG4gICAgICAgIHRoaXMuYXNjZW5zaW9uID0gODU7IC8vIDY0ICsgMjFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXNjZW5zaW9uID0gNjQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvYXN0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzaG93KHRvYXN0LCBjYWxsYmFjaykge1xuICAgIHRvYXN0ID0gdG9hc3QuX3RvYXN0O1xuICAgIHV0aWwuZ2xvYmFscy5mYWJPZmZzZXQgPSB0aGlzLmFzY2Vuc2lvbjtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICBhbmltaXQodG9hc3QsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsICR7dGhpcy5hc2NlbnNpb259cHgsIDApYCB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pLFxuXG4gICAgICBhbmltaXQodGhpcy5fZ2V0RmFicygpKVxuICAgICAgICAud2FpdCh0aGlzLmRlbGF5KVxuICAgICAgICAucXVldWUoeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgwLCAtJHt0aGlzLmFzY2Vuc2lvbn1weCwgMCkgc2NhbGUoMSlgIH0sIHRoaXMuZGVmKSxcblxuICAgICAgYW5pbWl0KHV0aWwuYXJyYXlGcm9tKHRvYXN0LmNoaWxkcmVuKSwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KHsgb3BhY2l0eTogMCB9LCB7IG9wYWNpdHk6IDEgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9hc3RcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGhpZGUodG9hc3QsIGNhbGxiYWNrKSB7XG4gICAgdG9hc3QgPSB0b2FzdC5fdG9hc3Q7XG4gICAgdXRpbC5nbG9iYWxzLmZhYk9mZnNldCA9IDA7XG5cbiAgICBhbmltaXQucnVuQWxsKFxuICAgICAgYW5pbWl0KHRvYXN0LCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScgfSxcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsICR7dGhpcy5hc2NlbnNpb259cHgsIDApYCB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KSxcblxuICAgICAgYW5pbWl0KHRoaXMuX2dldEZhYnMoKSwgdGhpcy5kZWYpXG4gICAgICAgIC53YWl0KHRoaXMuZGVsYXkpXG4gICAgICAgIC5xdWV1ZSh7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsIDAsIDApIHNjYWxlKDEpYCB9LCB0aGlzLmRlZiksXG5cbiAgICAgIGFuaW1pdCh1dGlsLmFycmF5RnJvbSh0b2FzdC5jaGlsZHJlbiksIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdCh7IG9wYWNpdHk6IDEgfSwgeyBvcGFjaXR5OiAwIH0pXG4gICAgKTtcbiAgfVxuXG4gIF9nZXRGYWJzKCkge1xuICAgIHJldHVybiB1dGlsLmFycmF5RnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdvbnMtZmFiW3Bvc2l0aW9ufj1ib3R0b21dLCBvbnMtc3BlZWQtZGlhbFtwb3NpdGlvbn49Ym90dG9tXScpKS5maWx0ZXIoZmFiID0+IGZhYi52aXNpYmxlKTtcbiAgfVxufVxuIiwiXG4vKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuLi8uLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IGlQaG9uZVhQYXRjaCBmcm9tICcuLi8uLi9vbnMvaXBob25leC1wYXRjaC5qcyc7XG5pbXBvcnQgVG9hc3RBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yLmpzJztcblxuLyoqXG4gKiBMaWZ0LWZhZGUgVG9hc3QgQW5pbWF0b3JcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmdFRvYXN0QW5pbWF0b3IgZXh0ZW5kcyBUb2FzdEFuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7IHRpbWluZyA9ICdlYXNlJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMzUgfSA9IHt9KSB7XG4gICAgc3VwZXIoeyB0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbiB9KTtcbiAgICB0aGlzLmJvZHlIZWlnaHQgPSBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodDsgLy8gYXZvaWQgRm9yY2VkIFN5bmNocm9ub3VzIExheW91dFxuICAgIGlmIChpUGhvbmVYUGF0Y2guaXNJUGhvbmVYUG9ydHJhaXRQYXRjaEFjdGl2ZSgpKSB7XG4gICAgICB0aGlzLmxpZnRBbW91bnQgPSAnY2FsYygxMDAlICsgMzRweCknO1xuICAgIH0gZWxzZSBpZiAoaVBob25lWFBhdGNoLmlzSVBob25lWExhbmRzY2FwZVBhdGNoQWN0aXZlKCkpIHtcbiAgICAgIHRoaXMubGlmdEFtb3VudCA9ICdjYWxjKDEwMCUgKyAyMXB4KSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGlmdEFtb3VudCA9ICcxMDAlJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9hc3RcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNob3codG9hc3QsIGNhbGxiYWNrKSB7XG4gICAgdG9hc3QgPSB0b2FzdC5fdG9hc3Q7XG5cbiAgICBhbmltaXQucnVuQWxsKFxuICAgICAgYW5pbWl0KHRvYXN0LCB0aGlzLmRlZilcbiAgICAgICAgLmRlZmF1bHQoXG4gICAgICAgICAgeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgwLCAke3RoaXMubGlmdEFtb3VudH0sIDApYCwgb3BhY2l0eTogMCB9LFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLCBvcGFjaXR5OiAxIH1cbiAgICAgICAgKVxuICAgICAgICAucXVldWUoZG9uZSA9PiB7XG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKTtcbiAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvYXN0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBoaWRlKHRvYXN0LCBjYWxsYmFjaykge1xuICAgIHRvYXN0ID0gdG9hc3QuX3RvYXN0O1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgIGFuaW1pdCh0b2FzdCwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLCBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgwLCAke3RoaXMubGlmdEFtb3VudH0sIDApYCwgb3BhY2l0eTogMCB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgZG9uZSgpO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBfdXBkYXRlUG9zaXRpb24odG9hc3QpIHtcbiAgICBpZiAocGFyc2VJbnQodG9hc3Quc3R5bGUudG9wLCAxMCkgPT09IDApIHtcbiAgICAgIHRvYXN0LnN0eWxlLnRvcCA9IHRvYXN0LnN0eWxlLmJvdHRvbSA9ICcnO1xuICAgIH1cbiAgfVxufVxuIiwiXG4vKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuLi8uLi9vbnMvdXRpbC5qcyc7XG5pbXBvcnQgYW5pbWl0IGZyb20gJy4uLy4uL29ucy9hbmltaXQuanMnO1xuaW1wb3J0IGlQaG9uZVhQYXRjaCBmcm9tICcuLi8uLi9vbnMvaXBob25leC1wYXRjaC5qcyc7XG5pbXBvcnQgVG9hc3RBbmltYXRvciBmcm9tICcuL2FuaW1hdG9yLmpzJztcblxuLyoqXG4gKiBGYWxsLWZhZGUgVG9hc3QgQW5pbWF0b3JcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmFsbFRvYXN0QW5pbWF0b3IgZXh0ZW5kcyBUb2FzdEFuaW1hdG9yIHtcblxuICBjb25zdHJ1Y3Rvcih7IHRpbWluZyA9ICdlYXNlJywgZGVsYXkgPSAwLCBkdXJhdGlvbiA9IDAuMzUgfSA9IHt9KSB7XG4gICAgc3VwZXIoeyB0aW1pbmcsIGRlbGF5LCBkdXJhdGlvbiB9KTtcbiAgICBpZiAoaVBob25lWFBhdGNoLmlzSVBob25lWFBvcnRyYWl0UGF0Y2hBY3RpdmUoKSkge1xuICAgICAgdGhpcy5mYWxsQW1vdW50ID0gJ2NhbGMoLTEwMCUgLSA0NHB4KSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmFsbEFtb3VudCA9ICctMTAwJSc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRvYXN0XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzaG93KHRvYXN0LCBjYWxsYmFjaykge1xuICAgIHRvYXN0ID0gdG9hc3QuX3RvYXN0O1xuICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uKHRvYXN0KTtcblxuICAgIGFuaW1pdC5ydW5BbGwoXG4gICAgICBhbmltaXQodG9hc3QsIHRoaXMuZGVmKVxuICAgICAgICAuZGVmYXVsdChcbiAgICAgICAgICB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKDAsICR7dGhpcy5mYWxsQW1vdW50fSwgMClgLCBvcGFjaXR5OiAwIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsIG9wYWNpdHk6IDEgfVxuICAgICAgICApXG4gICAgICAgIC5xdWV1ZShkb25lID0+IHtcbiAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdG9hc3RcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGhpZGUodG9hc3QsIGNhbGxiYWNrKSB7XG4gICAgdG9hc3QgPSB0b2FzdC5fdG9hc3Q7XG4gICAgdGhpcy5fdXBkYXRlUG9zaXRpb24odG9hc3QpO1xuXG4gICAgYW5pbWl0LnJ1bkFsbChcbiAgICAgIGFuaW1pdCh0b2FzdCwgdGhpcy5kZWYpXG4gICAgICAgIC5kZWZhdWx0KFxuICAgICAgICAgIHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLCBvcGFjaXR5OiAxIH0sXG4gICAgICAgICAgeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUzZCgwLCAke3RoaXMuZmFsbEFtb3VudH0sIDApYCwgb3BhY2l0eTogMCB9XG4gICAgICAgIClcbiAgICAgICAgLnF1ZXVlKGRvbmUgPT4ge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uKHRvYXN0LCB0cnVlKTtcbiAgICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgX3VwZGF0ZVBvc2l0aW9uKHRvYXN0LCBjbGVhblVwKSB7XG4gICAgbGV0IGNvcnJlY3RUb3A7XG4gICAgaWYgKGlQaG9uZVhQYXRjaC5pc0lQaG9uZVhQb3J0cmFpdFBhdGNoQWN0aXZlKCkpIHtcbiAgICAgIGNvcnJlY3RUb3AgPSAnNDRweCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvcnJlY3RUb3AgPSAnMCc7XG4gICAgfVxuXG4gICAgaWYgKHRvYXN0LnN0eWxlLnRvcCAhPT0gY29ycmVjdFRvcCkge1xuICAgICAgdG9hc3Quc3R5bGUudG9wID0gY29ycmVjdFRvcDtcbiAgICAgIHRvYXN0LnN0eWxlLmJvdHRvbSA9ICdpbml0aWFsJztcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG5Db3B5cmlnaHQgMjAxMy0yMDE1IEFTSUFMIENPUlBPUkFUSU9OXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbiovXG5cbmltcG9ydCBvbnNFbGVtZW50cyBmcm9tICcuLi9vbnMvZWxlbWVudHMuanMnO1xuaW1wb3J0IHV0aWwgZnJvbSAnLi4vb25zL3V0aWwuanMnO1xuaW1wb3J0IGF1dG9TdHlsZSBmcm9tICcuLi9vbnMvYXV0b3N0eWxlLmpzJztcbmltcG9ydCBNb2RpZmllclV0aWwgZnJvbSAnLi4vb25zL2ludGVybmFsL21vZGlmaWVyLXV0aWwuanMnO1xuaW1wb3J0IEFuaW1hdG9yRmFjdG9yeSBmcm9tICcuLi9vbnMvaW50ZXJuYWwvYW5pbWF0b3ItZmFjdG9yeS5qcyc7XG5pbXBvcnQgVG9hc3RBbmltYXRvciBmcm9tICcuL29ucy10b2FzdC9hbmltYXRvci5qcyc7XG5pbXBvcnQgRmFkZVRvYXN0QW5pbWF0b3IgZnJvbSAnLi9vbnMtdG9hc3QvZmFkZS1hbmltYXRvci5qcyc7XG5pbXBvcnQgQXNjZW5kVG9hc3RBbmltYXRvciBmcm9tICcuL29ucy10b2FzdC9hc2NlbmQtYW5pbWF0b3IuanMnO1xuaW1wb3J0IExpZnRUb2FzdEFuaW1hdG9yIGZyb20gJy4vb25zLXRvYXN0L2xpZnQtYW5pbWF0b3IuanMnO1xuaW1wb3J0IEZhbGxUb2FzdEFuaW1hdG9yIGZyb20gJy4vb25zLXRvYXN0L2ZhbGwtYW5pbWF0b3IuanMnO1xuaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL29ucy9wbGF0Zm9ybS5qcyc7XG5pbXBvcnQgQmFzZURpYWxvZ0VsZW1lbnQgZnJvbSAnLi9iYXNlL2Jhc2UtZGlhbG9nLmpzJztcbmltcG9ydCBjb250ZW50UmVhZHkgZnJvbSAnLi4vb25zL2NvbnRlbnQtcmVhZHkuanMnO1xuXG5jb25zdCBzY2hlbWUgPSB7XG4gICcudG9hc3QnOiAndG9hc3QtLSonLFxuICAnLnRvYXN0X19tZXNzYWdlJzogJ3RvYXN0LS0qX19tZXNzYWdlJyxcbiAgJy50b2FzdF9fYnV0dG9uJzogJ3RvYXN0LS0qX19idXR0b24nXG59O1xuXG5jb25zdCBkZWZhdWx0Q2xhc3NOYW1lID0gJ3RvYXN0JztcblxuY29uc3QgX2FuaW1hdG9yRGljdCA9IHtcbiAgJ2RlZmF1bHQnOiBwbGF0Zm9ybS5pc0FuZHJvaWQoKSA/IEFzY2VuZFRvYXN0QW5pbWF0b3IgOiBMaWZ0VG9hc3RBbmltYXRvcixcbiAgJ2ZhZGUnOiBGYWRlVG9hc3RBbmltYXRvcixcbiAgJ2FzY2VuZCc6IEFzY2VuZFRvYXN0QW5pbWF0b3IsXG4gICdsaWZ0JzogTGlmdFRvYXN0QW5pbWF0b3IsXG4gICdmYWxsJzogRmFsbFRvYXN0QW5pbWF0b3IsXG4gICdub25lJzogVG9hc3RBbmltYXRvclxufTtcblxuLyoqXG4gKiBAZWxlbWVudCBvbnMtdG9hc3RcbiAqIEBjYXRlZ29yeSBkaWFsb2dcbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dXG4gKiAgICAgVGhlIFRvYXN0IG9yIFNuYWNrYmFyIGNvbXBvbmVudCBpcyB1c2VmdWwgZm9yIGRpc3BsYXlpbmcgZGlzbWlzc2FibGUgaW5mb3JtYXRpb24gb3Igc2ltcGxlIGFjdGlvbnMgYXQgKG5vcm1hbGx5KSB0aGUgYm90dG9tIG9mIHRoZSBwYWdlLlxuICpcbiAqICAgICBUaGlzIGNvbXBvbmVudCBkb2VzIG5vdCBibG9jayB1c2VyIGlucHV0LCBhbGxvd2luZyB0aGUgYXBwIHRvIGNvbnRpbnVlIGl0cyBmbG93LiBGb3Igc2ltcGxlIHRvYXN0cywgY29uc2lkZXIgYG9ucy5ub3RpZmljYXRpb24udG9hc3RgIGluc3RlYWQuXG4gKiAgIFsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQHR1dG9yaWFsIHZhbmlsbGEvUmVmZXJlbmNlL3RvYXN0XG4gKiBAc2VlYWxzbyBvbnMtYWxlcnQtZGlhbG9nXG4gKiAgIFtlbl1UaGUgYDxvbnMtYWxlcnQtZGlhbG9nPmAgY29tcG9uZW50IGlzIHByZWZlcnJlZCBmb3IgZGlzcGxheWluZyB1bmRpc21pc3NhYmxlIGluZm9ybWF0aW9uLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb2FzdEVsZW1lbnQgZXh0ZW5kcyBCYXNlRGlhbG9nRWxlbWVudCB7XG5cbiAgLyoqXG4gICAqIEBldmVudCBwcmVzaG93XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1GaXJlZCBqdXN0IGJlZm9yZSB0aGUgdG9hc3QgaXMgZGlzcGxheWVkLlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOBjOihqOekuuOBleOCjOOCi+ebtOWJjeOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC50b2FzdFxuICAgKiAgIFtlbl1Ub2FzdCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44OA44Kk44Ki44Ot44Kw44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY2FuY2VsXG4gICAqICAgW2VuXUV4ZWN1dGUgdG8gc3RvcCB0aGUgdG9hc3QgZnJvbSBzaG93aW5nLlsvZW5dXG4gICAqICAgW2phXeOBk+OBrumWouaVsOOCkuWun+ihjOOBmeOCi+OBqOOAgeODgOOCpOOCouODreOCsOOBruihqOekuuOCkuatouOCgeOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdHNob3dcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXUZpcmVkIGp1c3QgYWZ0ZXIgdGhlIHRvYXN0IGlzIGRpc3BsYXllZC5bL2VuXVxuICAgKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzooajnpLrjgZXjgozjgZ/nm7TlvozjgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQudG9hc3RcbiAgICogICBbZW5dVG9hc3Qgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcHJlaGlkZVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dRmlyZWQganVzdCBiZWZvcmUgdGhlIHRvYXN0IGlzIGhpZGRlbi5bL2VuXVxuICAgKiAgIFtqYV3jg4DjgqTjgqLjg63jgrDjgYzpmqDjgozjgovnm7TliY3jgavnmbrngavjgZfjgb7jgZnjgIJbL2phXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgW2VuXUV2ZW50IG9iamVjdC5bL2VuXVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQudG9hc3RcbiAgICogICBbZW5dVG9hc3Qgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeODgOOCpOOCouODreOCsOOBruOCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNhbmNlbFxuICAgKiAgIFtlbl1FeGVjdXRlIHRvIHN0b3AgdGhlIHRvYXN0IGZyb20gaGlkaW5nLlsvZW5dXG4gICAqICAgW2phXeOBk+OBrumWouaVsOOCkuWun+ihjOOBmeOCi+OBqOOAgeODgOOCpOOCouODreOCsOOBjOmWieOBmOOCiOOBhuOBqOOBmeOCi+OBruOCkuatouOCgeOBvuOBmeOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAZXZlbnQgcG9zdGhpZGVcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFtlbl1GaXJlZCBqdXN0IGFmdGVyIHRoZSB0b2FzdCBpcyBoaWRkZW4uWy9lbl1cbiAgICogW2phXeODgOOCpOOCouODreOCsOOBjOmaoOOCjOOBn+W+jOOBq+eZuueBq+OBl+OBvuOBmeOAglsvamFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBbZW5dRXZlbnQgb2JqZWN0LlsvZW5dXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudC50b2FzdFxuICAgKiAgIFtlbl1Ub2FzdCBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44OA44Kk44Ki44Ot44Kw44Gu44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGUgYW5pbWF0aW9uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IGRlZmF1bHRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dVGhlIGFuaW1hdGlvbiB1c2VkIHdoZW4gc2hvd2luZyBhbmQgaGlkaW5nIHRoZSB0b2FzdC4gQ2FuIGJlIGVpdGhlciBgXCJkZWZhdWx0XCJgLCBgXCJhc2NlbmRcImAgKEFuZHJvaWQpLCBgXCJsaWZ0XCJgIChpT1MpLCBgXCJmYWxsXCJgLCBgXCJmYWRlXCJgIG9yIGBcIm5vbmVcImAuWy9lbl1cbiAgICogIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBhbmltYXRpb24tb3B0aW9uc1xuICAgKiBAdHlwZSB7RXhwcmVzc2lvbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIHRpbWluZywgZGVsYXnjgpLjgqrjg5bjgrjjgqfjgq/jg4jjg6rjg4bjg6njg6vjgafmjIflrprjgZfjgb7jgZnjgIJlLmcuIDxjb2RlPntkdXJhdGlvbjogMC4yLCBkZWxheTogMSwgdGltaW5nOiAnZWFzZS1pbid9PC9jb2RlPlsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgYW5pbWF0aW9uT3B0aW9uc1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIHRpbWluZyBhbmQgZGVsYXkgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCB0aW1pbmcsIGRlbGF544KS44Kq44OW44K444Kn44Kv44OI44Oq44OG44Op44Or44Gn5oyH5a6a44GX44G+44GZ44CC5L6L77yae2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAxLCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSB2aXNpYmxlXG4gICAqIEB0eXBlIHtCb29sZWFufVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dV2hldGhlciB0aGUgdG9hc3QgaXMgdmlzaWJsZSBvciBub3QuWy9lbl1cbiAgICogICBbamFd6KaB57Sg44GM6KaL44GI44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuX2RlZmF1bHREQkIgPSBudWxsO1xuICAgIGNvbnRlbnRSZWFkeSh0aGlzLCAoKSA9PiB0aGlzLl9jb21waWxlKCkpO1xuICB9XG5cbiAgZ2V0IF9zY2hlbWUoKSB7XG4gICAgcmV0dXJuIHNjaGVtZTtcbiAgfVxuXG4gIGdldCBfdG9hc3QoKSB7XG4gICAgcmV0dXJuIHV0aWwuZmluZENoaWxkKHRoaXMsIGAuJHtkZWZhdWx0Q2xhc3NOYW1lfWApO1xuICB9XG5cbiAgX3VwZGF0ZUFuaW1hdG9yRmFjdG9yeSgpIHtcbiAgICAvLyBSZXNldCBwb3NpdGlvbiBzdHlsZVxuICAgIHRoaXMuX3RvYXN0ICYmICh0aGlzLl90b2FzdC5zdHlsZS50b3AgPSB0aGlzLl90b2FzdC5zdHlsZS5ib3R0b20gPSAnJyk7XG5cbiAgICByZXR1cm4gbmV3IEFuaW1hdG9yRmFjdG9yeSh7XG4gICAgICBhbmltYXRvcnM6IF9hbmltYXRvckRpY3QsXG4gICAgICBiYXNlQ2xhc3M6IFRvYXN0QW5pbWF0b3IsXG4gICAgICBiYXNlQ2xhc3NOYW1lOiAnVG9hc3RBbmltYXRvcicsXG4gICAgICBkZWZhdWx0QW5pbWF0aW9uOiB0aGlzLmdldEF0dHJpYnV0ZSgnYW5pbWF0aW9uJylcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgb25EZXZpY2VCYWNrQnV0dG9uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1CYWNrLWJ1dHRvbiBoYW5kbGVyLlsvZW5dXG4gICAqICAgW2phXeODkOODg+OCr+ODnOOCv+ODs+ODj+ODs+ODieODqeOAglsvamFdXG4gICAqL1xuXG4gIF9jb21waWxlKCkge1xuICAgIGF1dG9TdHlsZS5wcmVwYXJlKHRoaXMpO1xuXG4gICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRoaXMuc3R5bGUuekluZGV4ID0gMTAwMDA7IC8vIExvd2VyIHRoYW4gZGlhbG9nc1xuXG4gICAgY29uc3QgbWVzc2FnZUNsYXNzTmFtZSA9ICd0b2FzdF9fbWVzc2FnZSc7XG4gICAgY29uc3QgYnV0dG9uQ2xhc3NOYW1lID0gJ3RvYXN0X19idXR0b24nO1xuXG4gICAgbGV0IHRvYXN0ID0gdXRpbC5maW5kQ2hpbGQodGhpcywgYC4ke2RlZmF1bHRDbGFzc05hbWV9YCk7XG4gICAgaWYgKCF0b2FzdCkge1xuICAgICAgdG9hc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRvYXN0LmNsYXNzTGlzdC5hZGQoZGVmYXVsdENsYXNzTmFtZSk7XG4gICAgICB3aGlsZSAodGhpcy5jaGlsZE5vZGVzWzBdKSB7XG4gICAgICAgIHRvYXN0LmFwcGVuZENoaWxkKHRoaXMuY2hpbGROb2Rlc1swXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGJ1dHRvbiA9IHV0aWwuZmluZENoaWxkKHRvYXN0LCBgLiR7YnV0dG9uQ2xhc3NOYW1lfWApO1xuICAgIGlmICghYnV0dG9uKSB7XG4gICAgICBidXR0b24gPSB1dGlsLmZpbmRDaGlsZCh0b2FzdCwgZSA9PiB1dGlsLm1hdGNoKGUsICcuYnV0dG9uJykgfHwgdXRpbC5tYXRjaChlLCAnYnV0dG9uJykpO1xuICAgICAgaWYgKGJ1dHRvbikge1xuICAgICAgICBidXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnYnV0dG9uJyk7XG4gICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKGJ1dHRvbkNsYXNzTmFtZSk7XG4gICAgICAgIHRvYXN0LmFwcGVuZENoaWxkKGJ1dHRvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF1dGlsLmZpbmRDaGlsZCh0b2FzdCwgYC4ke21lc3NhZ2VDbGFzc05hbWV9YCkpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gdXRpbC5maW5kQ2hpbGQodG9hc3QsICcubWVzc2FnZScpO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRvYXN0LmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAodG9hc3QuY2hpbGROb2Rlc1tpXSAhPT0gYnV0dG9uKSB7XG4gICAgICAgICAgICBtZXNzYWdlLmluc2VydEJlZm9yZSh0b2FzdC5jaGlsZE5vZGVzW2ldLCBtZXNzYWdlLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWVzc2FnZS5jbGFzc0xpc3QuYWRkKG1lc3NhZ2VDbGFzc05hbWUpO1xuXG4gICAgICB0b2FzdC5pbnNlcnRCZWZvcmUobWVzc2FnZSwgdG9hc3QuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgaWYgKHRvYXN0LnBhcmVudE5vZGUgIT09IHRoaXMpIHtcbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodG9hc3QpO1xuICAgIH1cblxuICAgIE1vZGlmaWVyVXRpbC5pbml0TW9kaWZpZXIodGhpcywgdGhpcy5fc2NoZW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgdmlzaWJsZVxuICAgKiBAdHlwZSB7Qm9vbGVhbn1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgdmlzaWJsZSBvciBub3QuWy9lbl1cbiAgICogICBbamFd6KaB57Sg44GM6KaL44GI44KL5aC05ZCI44GrYHRydWVg44CCWy9qYV1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc2hvd1xuICAgKiBAc2lnbmF0dXJlIHNob3coW29wdGlvbnNdKVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gICAqICAgW2VuXVBhcmFtZXRlciBvYmplY3QuWy9lbl1cbiAgICogICBbamFd44Kq44OX44K344On44Oz44KS5oyH5a6a44GZ44KL44Kq44OW44K444Kn44Kv44OI44CCWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbl1cbiAgICogICBbZW5dQW5pbWF0aW9uIG5hbWUuIEF2YWlsYWJsZSBhbmltYXRpb25zIGFyZSBgXCJkZWZhdWx0XCJgLCBgXCJhc2NlbmRcImAgKEFuZHJvaWQpLCBgXCJsaWZ0XCJgIChpT1MpLCBgXCJmYWxsXCJgLCBgXCJmYWRlXCJgIG9yIGBcIm5vbmVcImAuWy9lbl1cbiAgICogICBbamFdWy9qYV1cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmFuaW1hdGlvbk9wdGlvbnNdXG4gICAqICAgW2VuXVNwZWNpZnkgdGhlIGFuaW1hdGlvbidzIGR1cmF0aW9uLCBkZWxheSBhbmQgdGltaW5nLiBFLmcuIGB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9YC5bL2VuXVxuICAgKiAgIFtqYV3jgqLjg4vjg6Hjg7zjgrfjg6fjg7PmmYLjga5kdXJhdGlvbiwgZGVsYXksIHRpbWluZ+OCkuaMh+WumuOBl+OBvuOBmeOAgmUuZy4ge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfVsvamFdXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1TaG93IHRoZSBlbGVtZW50LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqICAgW2VuXVJlc29sdmVzIHRvIHRoZSBkaXNwbGF5ZWQgZWxlbWVudFsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHRvZ2dsZVxuICAgKiBAc2lnbmF0dXJlIHRvZ2dsZShbb3B0aW9uc10pXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICBbZW5dUGFyYW1ldGVyIG9iamVjdC5bL2VuXVxuICAgKiAgIFtqYV3jgqrjg5fjgrfjg6fjg7PjgpLmjIflrprjgZnjgovjgqrjg5bjgrjjgqfjgq/jg4jjgIJbL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uXVxuICAgKiAgIFtlbl1BbmltYXRpb24gbmFtZS4gQXZhaWxhYmxlIGFuaW1hdGlvbnMgYXJlIGBcImRlZmF1bHRcImAsIGBcImFzY2VuZFwiYCAoQW5kcm9pZCksIGBcImxpZnRcImAgKGlPUyksIGBcImZhbGxcImAsIGBcImZhZGVcImAgb3IgYFwibm9uZVwiYC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuYW5pbWF0aW9uT3B0aW9uc11cbiAgICogICBbZW5dU3BlY2lmeSB0aGUgYW5pbWF0aW9uJ3MgZHVyYXRpb24sIGRlbGF5IGFuZCB0aW1pbmcuIEUuZy4gYHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31gLlsvZW5dXG4gICAqICAgW2phXeOCouODi+ODoeODvOOCt+ODp+ODs+aZguOBrmR1cmF0aW9uLCBkZWxheSwgdGltaW5n44KS5oyH5a6a44GX44G+44GZ44CCZS5nLiB7ZHVyYXRpb246IDAuMiwgZGVsYXk6IDAuNCwgdGltaW5nOiAnZWFzZS1pbid9Wy9qYV1cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqICAgW2VuXVRvZ2dsZSB0b2FzdCB2aXNpYmlsaXR5LlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGhpZGVcbiAgICogQHNpZ25hdHVyZSBoaWRlKFtvcHRpb25zXSlcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgIFtlbl1QYXJhbWV0ZXIgb2JqZWN0LlsvZW5dXG4gICAqICAgW2phXeOCquODl+OCt+ODp+ODs+OCkuaMh+WumuOBmeOCi+OCquODluOCuOOCp+OCr+ODiOOAglsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gICAqICAgW2VuXUFuaW1hdGlvbiBuYW1lLiBBdmFpbGFibGUgYW5pbWF0aW9ucyBhcmUgYFwiZGVmYXVsdFwiYCwgYFwiYXNjZW5kXCJgIChBbmRyb2lkKSwgYFwibGlmdFwiYCAoaU9TKSwgYFwiZmFsbFwiYCwgYFwiZmFkZVwiYCBvciBgXCJub25lXCJgLlsvZW5dXG4gICAqICAgW2phXVsvamFdXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25PcHRpb25zXVxuICAgKiAgIFtlbl1TcGVjaWZ5IHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbiwgZGVsYXkgYW5kIHRpbWluZy4gRS5nLiBge2R1cmF0aW9uOiAwLjIsIGRlbGF5OiAwLjQsIHRpbWluZzogJ2Vhc2UtaW4nfWAuWy9lbl1cbiAgICogICBbamFd44Ki44OL44Oh44O844K344On44Oz5pmC44GuZHVyYXRpb24sIGRlbGF5LCB0aW1pbmfjgpLmjIflrprjgZfjgb7jgZnjgIJlLmcuIHtkdXJhdGlvbjogMC4yLCBkZWxheTogMC40LCB0aW1pbmc6ICdlYXNlLWluJ31bL2phXVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dSGlkZSB0b2FzdC5bL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKiAgIFtlbl1SZXNvbHZlcyB0byB0aGUgaGlkZGVuIGVsZW1lbnRbL2VuXVxuICAgKiAgIFtqYV1bL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gQW5pbWF0b3JcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlckFuaW1hdG9yKG5hbWUsIEFuaW1hdG9yKSB7XG4gICAgaWYgKCEoQW5pbWF0b3IucHJvdG90eXBlIGluc3RhbmNlb2YgVG9hc3RBbmltYXRvcikpIHtcbiAgICAgIHV0aWwudGhyb3coJ1wiQW5pbWF0b3JcIiBwYXJhbSBtdXN0IGluaGVyaXQgT25zVG9hc3RFbGVtZW50LlRvYXN0QW5pbWF0b3InKTtcbiAgICB9XG4gICAgX2FuaW1hdG9yRGljdFtuYW1lXSA9IEFuaW1hdG9yO1xuICB9XG5cbiAgc3RhdGljIGdldCBhbmltYXRvcnMoKSB7XG4gICAgcmV0dXJuIF9hbmltYXRvckRpY3Q7XG4gIH1cblxuICBzdGF0aWMgZ2V0IFRvYXN0QW5pbWF0b3IoKSB7XG4gICAgcmV0dXJuIFRvYXN0QW5pbWF0b3I7XG4gIH1cbn1cblxub25zRWxlbWVudHMuVG9hc3QgPSBUb2FzdEVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy10b2FzdCcsIFRvYXN0RWxlbWVudCk7XG4iLCIvKlxuQ29weXJpZ2h0IDIwMTMtMjAxNSBBU0lBTCBDT1JQT1JBVElPTlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4qL1xuXG5pbXBvcnQgb25zRWxlbWVudHMgZnJvbSAnLi4vb25zL2VsZW1lbnRzLmpzJztcbmltcG9ydCBCYXNlQnV0dG9uRWxlbWVudCBmcm9tICcuL2Jhc2UvYmFzZS1idXR0b24uanMnO1xuXG4vKipcbiAqIEBlbGVtZW50IG9ucy10b29sYmFyLWJ1dHRvblxuICogQGNhdGVnb3J5IHBhZ2VcbiAqIEBtb2RpZmllciBtYXRlcmlhbFxuICogICBbZW5dTWF0ZXJpYWwgRGVzaWduIHRvb2xiYXIgYnV0dG9uLlsvZW5dXG4gKiAgIFtqYV1bL2phXVxuICogQG1vZGlmaWVyIG91dGxpbmVcbiAqICAgW2VuXUEgYnV0dG9uIHdpdGggYW4gb3V0bGluZS5bL2VuXVxuICogICBbamFd44Ki44Km44OI44Op44Kk44Oz44KS44KC44Gj44Gf44Oc44K/44Oz44KS6KGo56S644GX44G+44GZ44CCWy9qYV1cbiAqIEBkZXNjcmlwdGlvblxuICogICBbZW5dQnV0dG9uIGNvbXBvbmVudCBmb3Igb25zLXRvb2xiYXIgYW5kIG9ucy1ib3R0b20tdG9vbGJhci5bL2VuXVxuICogICBbamFdb25zLXRvb2xiYXLjgYLjgovjgYTjga9vbnMtYm90dG9tLXRvb2xiYXLjgavoqK3nva7jgafjgY3jgovjg5zjgr/jg7PnlKjjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgafjgZnjgIJbL2phXVxuICogQGNvZGVwZW4gYUhtR0xcbiAqIEB0dXRvcmlhbCB2YW5pbGxhL1JlZmVyZW5jZS9wYWdlXG4gKiBAZ3VpZGUgY29tcGlsYXRpb24uaHRtbCN0b29sYmFyLWNvbXBpbGF0aW9uXG4gKiAgIFtlbl1BZGRpbmcgYSB0b29sYmFyWy9lbl1cbiAqICAgW2phXeODhOODvOODq+ODkOODvOOBrui/veWKoFsvamFdXG4gKiBAc2VlYWxzbyBvbnMtdG9vbGJhclxuICogICBbZW5dVGhlIGA8b25zLXRvb2xiYXI+YCBjb21wb25lbnQgZGlzcGxheXMgYSBuYXZpZ2F0aW9uIGJhciBhdCB0aGUgdG9wIG9mIGEgcGFnZS5bL2VuXVxuICogICBbamFdb25zLXRvb2xiYXLjgrPjg7Pjg53jg7zjg43jg7Pjg4hbL2phXVxuICogQHNlZWFsc28gb25zLWJhY2stYnV0dG9uXG4gKiAgIFtlbl1UaGUgYDxvbnMtYmFjay1idXR0b24+YCBkaXNwbGF5cyBhIGJhY2sgYnV0dG9uIGluIHRoZSBuYXZpZ2F0aW9uIGJhci5bL2VuXVxuICogICBbamFdb25zLWJhY2stYnV0dG9u44Kz44Oz44Od44O844ON44Oz44OIWy9qYV1cbiAqIEBleGFtcGxlXG4gKiA8b25zLXRvb2xiYXI+XG4gKiAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gKiAgICAgPG9ucy10b29sYmFyLWJ1dHRvbj5cbiAqICAgICAgIEJ1dHRvblxuICogICAgIDwvb25zLXRvb2xiYXItYnV0dG9uPlxuICogICA8L2Rpdj5cbiAqICAgPGRpdiBjbGFzcz1cImNlbnRlclwiPlxuICogICAgIFRpdGxlXG4gKiAgIDwvZGl2PlxuICogICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAqICAgICA8b25zLXRvb2xiYXItYnV0dG9uPlxuICogICAgICAgPG9ucy1pY29uIGljb249XCJpb24tbmF2aWNvblwiIHNpemU9XCIyOHB4XCI+PC9vbnMtaWNvbj5cbiAqICAgICA8L29ucy10b29sYmFyLWJ1dHRvbj5cbiAqICAgPC9kaXY+XG4gKiA8L29ucy10b29sYmFyPlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb29sYmFyQnV0dG9uRWxlbWVudCBleHRlbmRzIEJhc2VCdXR0b25FbGVtZW50IHtcblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBtb2RpZmllclxuICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGJ1dHRvbi5bL2VuXVxuICAgKiAgIFtqYV3jg5zjgr/jg7Pjga7ooajnj77jgpLmjIflrprjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBpY29uXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgW2VuXUNyZWF0ZXMgYW4gYG9ucy1pY29uYCBjb21wb25lbnQgd2l0aCB0aGlzIHN0cmluZy5bL2VuXVxuICAgKiAgW2phXWBvbnMtaWNvbmDjgrPjg7Pjg53jg7zjg43jg7Pjg4jjgpLmgqrmgKfjgZfjgb7jgZnjgIJbL2phXVxuICAgKi9cblxuICAvKipcbiAgICogQGF0dHJpYnV0ZSBkaXNhYmxlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogICBbZW5dU3BlY2lmeSBpZiBidXR0b24gc2hvdWxkIGJlIGRpc2FibGVkLlsvZW5dXG4gICAqICAgW2phXeODnOOCv+ODs+OCkueEoeWKueWMluOBmeOCi+WgtOWQiOOBr+aMh+WumuOBl+OBpuOBj+OBoOOBleOBhOOAglsvamFdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgZGlzYWJsZWRcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiAgIFtlbl1XaGV0aGVyIHRoZSBlbGVtZW50IGlzIGRpc2FibGVkIG9yIG5vdC5bL2VuXVxuICAgKiAgIFtqYV3nhKHlirnljJbjgZXjgozjgabjgYTjgovloLTlkIjjgatgdHJ1ZWDjgIJbL2phXVxuICAgKi9cblxuICBnZXQgX3NjaGVtZSgpIHtcbiAgICByZXR1cm4geyAnJzogJ3Rvb2xiYXItYnV0dG9uLS0qJyB9O1xuICB9XG5cbiAgZ2V0IF9kZWZhdWx0Q2xhc3NOYW1lKCkge1xuICAgIHJldHVybiAndG9vbGJhci1idXR0b24nO1xuICB9XG5cbiAgZ2V0IF9yaXBwbGVPcHQoKSB7XG4gICAgcmV0dXJuIFt0aGlzLCB1bmRlZmluZWQsIHsgY2VudGVyOiAnJywgJ3NpemUnOiAnY29udGFpbicsICdiYWNrZ3JvdW5kJzogJ3RyYW5zcGFyZW50JyB9XTtcbiAgfVxufVxuXG5vbnNFbGVtZW50cy5Ub29sYmFyQnV0dG9uID0gVG9vbGJhckJ1dHRvbkVsZW1lbnQ7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ29ucy10b29sYmFyLWJ1dHRvbicsIFRvb2xiYXJCdXR0b25FbGVtZW50KTtcbiIsImltcG9ydCBzZXR1cCBmcm9tICcuL3NldHVwLmpzJzsgLy8gQWRkIHBvbHlmaWxsc1xuaW1wb3J0IG9ucyBmcm9tICcuL29ucy9pbmRleC5qcyc7IC8vIEFkZCBvbnMgaW50ZXJuYWxzXG5cbi8vIEFkZCBhbmQgcmVnaXN0ZXIgQ3VzdG9tIEVsZW1lbnRzXG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWlmLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtYWN0aW9uLXNoZWV0LmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtYWN0aW9uLXNoZWV0LWJ1dHRvbi5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWFsZXJ0LWRpYWxvZy5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWFsZXJ0LWRpYWxvZy1idXR0b24uanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1iYWNrLWJ1dHRvbi5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWJvdHRvbS10b29sYmFyLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtYnV0dG9uLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtY2FyZC5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWNhcm91c2VsLWl0ZW0uanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1jYXJvdXNlbC5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWNvbC5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWRpYWxvZy5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWZhYi5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWdlc3R1cmUtZGV0ZWN0b3IuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1pY29uLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtbGF6eS1yZXBlYXQuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1saXN0LWhlYWRlci5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLWxpc3QtdGl0bGUuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1saXN0LWl0ZW0uanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1saXN0LmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtaW5wdXQuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1jaGVja2JveC5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXJhZGlvLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtc2VhcmNoLWlucHV0LmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtbW9kYWwuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1uYXZpZ2F0b3IuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1wYWdlLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtcG9wb3Zlci5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXByb2dyZXNzLWJhci5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXByb2dyZXNzLWNpcmN1bGFyLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtcHVsbC1ob29rLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtcmFuZ2UuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1yaXBwbGUuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1yb3cuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1zZWdtZW50LmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtc2VsZWN0LmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtc3BlZWQtZGlhbC1pdGVtLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtc3BlZWQtZGlhbC5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXNwbGl0dGVyLWNvbnRlbnQuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy1zcGxpdHRlci1tYXNrLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtc3BsaXR0ZXItc2lkZS5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXNwbGl0dGVyLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtc3dpdGNoLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtdGFiLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtdGFiYmFyLmpzJztcbmltcG9ydCAnLi9lbGVtZW50cy9vbnMtdG9hc3QuanMnO1xuaW1wb3J0ICcuL2VsZW1lbnRzL29ucy10b29sYmFyLWJ1dHRvbi5qcyc7XG5pbXBvcnQgJy4vZWxlbWVudHMvb25zLXRvb2xiYXIuanMnO1xuXG5zZXR1cChvbnMpOyAvLyBTZXR1cCBpbml0aWFsIGxpc3RlbmVyc1xud2luZG93Ll9zdXBlclNlY3JldE9ucyA9IG9ucztcblxuZXhwb3J0IGRlZmF1bHQgb25zO1xuIl0sIm5hbWVzIjpbIk5hdGl2ZUhUTUxFbGVtZW50Iiwid2luZG93IiwiSFRNTEVsZW1lbnQiLCJQbGF0Zm9ybSIsIl9zZWxlY3RlZFBsYXRmb3JtIiwiX2lnbm9yZVBsYXRmb3JtU2VsZWN0IiwicGxhdGZvcm0iLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJmbiIsInJlc3VsdCIsImRvY3VtZW50IiwicmVhZHlTdGF0ZSIsIkVycm9yIiwiY29yZG92YSIsInBob25lZ2FwIiwiUGhvbmVHYXAiLCJ0ZXN0IiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwiaXNJUGhvbmUiLCJzY3JlZW4iLCJ3aWR0aCIsImhlaWdodCIsImlzSVBhZE9TIiwiZm9yY2VBY3R1YWxQbGF0Zm9ybSIsIl9nZXRTZWxlY3RlZFBsYXRmb3JtIiwiZGV2aWNlIiwicGFyc2VJbnQiLCJ2ZXJzaW9uIiwic3BsaXQiLCJ2ZXIiLCJtYXRjaCIsInJlcGxhY2UiLCJtYXhUb3VjaFBvaW50cyIsInVhIiwiaXNJT1MiLCJpbmRleE9mIiwic3RhbmRhbG9uZSIsImx0ZTkiLCJ3ZWJraXQiLCJtZXNzYWdlSGFuZGxlcnMiLCJpbmRleGVkREIiLCJvcGVyYSIsIkluc3RhbGxUcmlnZ2VyIiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwicCIsInNhZmFyaSIsInB1c2hOb3RpZmljYXRpb24iLCJjaHJvbWUiLCJkb2N1bWVudE1vZGUiLCJpc0FuZHJvaWQiLCJpc1dQIiwiaXNJUGFkIiwiaXNJUG9kIiwiY3VzdG9tRWxlbWVudHMiLCJmb3JjZVBvbHlmaWxsIiwiQWxyZWFkeUNvbnN0cnVjdGVkTWFya2VyIiwiJGpzY29tcERlZmF1bHRFeHBvcnQiLCJnbG9iYWwiLCJKc011dGF0aW9uT2JzZXJ2ZXIiLCJyZWdpc3RyYXRpb25zVGFibGUiLCJXZWFrTWFwIiwic2V0SW1tZWRpYXRlIiwic2V0VGltZW91dCIsInNldEltbWVkaWF0ZVF1ZXVlIiwic2VudGluZWwiLCJTdHJpbmciLCJNYXRoIiwicmFuZG9tIiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJkYXRhIiwicXVldWUiLCJmb3JFYWNoIiwiZnVuYyIsInB1c2giLCJwb3N0TWVzc2FnZSIsImlzU2NoZWR1bGVkIiwic2NoZWR1bGVkT2JzZXJ2ZXJzIiwic2NoZWR1bGVDYWxsYmFjayIsIm9ic2VydmVyIiwiZGlzcGF0Y2hDYWxsYmFja3MiLCJ3cmFwSWZOZWVkZWQiLCJub2RlIiwiU2hhZG93RE9NUG9seWZpbGwiLCJvYnNlcnZlcnMiLCJzb3J0IiwibzEiLCJvMiIsInVpZF8iLCJhbnlOb25FbXB0eSIsInRha2VSZWNvcmRzIiwicmVtb3ZlVHJhbnNpZW50T2JzZXJ2ZXJzRm9yIiwibGVuZ3RoIiwiY2FsbGJhY2tfIiwibm9kZXNfIiwicmVnaXN0cmF0aW9ucyIsImdldCIsInJlZ2lzdHJhdGlvbiIsInJlbW92ZVRyYW5zaWVudE9ic2VydmVycyIsImZvckVhY2hBbmNlc3RvckFuZE9ic2VydmVyRW5xdWV1ZVJlY29yZCIsInRhcmdldCIsImNhbGxiYWNrIiwicGFyZW50Tm9kZSIsImoiLCJvcHRpb25zIiwic3VidHJlZSIsInJlY29yZCIsImVucXVldWUiLCJ1aWRDb3VudGVyIiwicmVjb3Jkc18iLCJvYnNlcnZlIiwiY2hpbGRMaXN0IiwiYXR0cmlidXRlcyIsImNoYXJhY3RlckRhdGEiLCJhdHRyaWJ1dGVPbGRWYWx1ZSIsImF0dHJpYnV0ZUZpbHRlciIsImNoYXJhY3RlckRhdGFPbGRWYWx1ZSIsIlN5bnRheEVycm9yIiwic2V0IiwiaSIsInJlbW92ZUxpc3RlbmVycyIsIlJlZ2lzdHJhdGlvbiIsImFkZExpc3RlbmVycyIsImRpc2Nvbm5lY3QiLCJzcGxpY2UiLCJjb3B5T2ZSZWNvcmRzIiwiTXV0YXRpb25SZWNvcmQiLCJ0eXBlIiwiYWRkZWROb2RlcyIsInJlbW92ZWROb2RlcyIsInByZXZpb3VzU2libGluZyIsIm5leHRTaWJsaW5nIiwiYXR0cmlidXRlTmFtZSIsImF0dHJpYnV0ZU5hbWVzcGFjZSIsIm9sZFZhbHVlIiwiY29weU11dGF0aW9uUmVjb3JkIiwib3JpZ2luYWwiLCJzbGljZSIsImN1cnJlbnRSZWNvcmQiLCJyZWNvcmRXaXRoT2xkVmFsdWUiLCJnZXRSZWNvcmQiLCJnZXRSZWNvcmRXaXRoT2xkVmFsdWUiLCJjbGVhclJlY29yZHMiLCJ1bmRlZmluZWQiLCJyZWNvcmRSZXByZXNlbnRzQ3VycmVudE11dGF0aW9uIiwic2VsZWN0UmVjb3JkIiwibGFzdFJlY29yZCIsIm5ld1JlY29yZCIsInRyYW5zaWVudE9ic2VydmVkTm9kZXMiLCJyZWNvcmRzIiwicmVjb3JkVG9SZXBsYWNlTGFzdCIsImFkZExpc3RlbmVyc18iLCJyZW1vdmVMaXN0ZW5lcnNfIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImFkZFRyYW5zaWVudE9ic2VydmVyIiwiaGFuZGxlRXZlbnQiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJuYW1lIiwiYXR0ck5hbWUiLCJuYW1lc3BhY2UiLCJyZWxhdGVkTm9kZSIsIm5hbWVzcGFjZVVSSSIsImF0dHJDaGFuZ2UiLCJNdXRhdGlvbkV2ZW50IiwiQURESVRJT04iLCJwcmV2VmFsdWUiLCJjaGFuZ2VkTm9kZSIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJfaXNQb2x5ZmlsbGVkIiwic2VsZiIsIm5leHRIYW5kbGUiLCJ0YXNrc0J5SGFuZGxlIiwiY3VycmVudGx5UnVubmluZ0FUYXNrIiwiZG9jIiwiYWRkRnJvbVNldEltbWVkaWF0ZUFyZ3VtZW50cyIsImFyZ3MiLCJwYXJ0aWFsbHlBcHBsaWVkIiwiYXBwbHkiLCJoYW5kbGVyIiwiYXJndW1lbnRzIiwiRnVuY3Rpb24iLCJydW5JZlByZXNlbnQiLCJoYW5kbGUiLCJ0YXNrIiwiY2xlYXJJbW1lZGlhdGUiLCJpbnN0YWxsTmV4dFRpY2tJbXBsZW1lbnRhdGlvbiIsInByb2Nlc3MiLCJuZXh0VGljayIsImNhblVzZVBvc3RNZXNzYWdlIiwiaW1wb3J0U2NyaXB0cyIsInBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMiLCJvbGRPbk1lc3NhZ2UiLCJvbm1lc3NhZ2UiLCJpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbiIsIm1lc3NhZ2VQcmVmaXgiLCJvbkdsb2JhbE1lc3NhZ2UiLCJldmVudCIsInNvdXJjZSIsImF0dGFjaEV2ZW50IiwiaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24iLCJjaGFubmVsIiwiTWVzc2FnZUNoYW5uZWwiLCJwb3J0MSIsInBvcnQyIiwiaW5zdGFsbFJlYWR5U3RhdGVDaGFuZ2VJbXBsZW1lbnRhdGlvbiIsImh0bWwiLCJkb2N1bWVudEVsZW1lbnQiLCJzY3JpcHQiLCJjcmVhdGVFbGVtZW50Iiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVtb3ZlQ2hpbGQiLCJhcHBlbmRDaGlsZCIsImluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24iLCJhdHRhY2hUbyIsImdldFByb3RvdHlwZU9mIiwiREVGQVVMVF9WSUVXUE9SVCIsIlZpZXdwb3J0IiwiZW5zdXJlVmlld3BvcnRFbGVtZW50Iiwidmlld3BvcnRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsImhlYWQiLCJzZXR1cCIsImhhc0F0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsIk1pY3JvRXZlbnQiLCJvbiIsImZjdCIsIl9ldmVudHMiLCJvbmNlIiwid3JhcHBlciIsIm9mZiIsImZpbHRlciIsIl9mY3QiLCJlbWl0IiwiQXJyYXkiLCJtaXhpbiIsImRlc3RPYmplY3QiLCJwcm9wcyIsInByZWZpeCIsInN0eWxlcyIsImdldENvbXB1dGVkU3R5bGUiLCJqb2luIiwiT0xpbmsiLCJ1dGlsIiwiaHlwaGVuYXRlIiwic3R5bGVyIiwiZWxlbWVudCIsInN0eWxlIiwia2V5cyIsImtleSIsIndhcm4iLCJjbGVhciIsImNsZWFybGlzdCIsInJlZHVjZSIsInIiLCJzIiwiY29uY2F0Iiwic29tZSIsImdldEF0dHJpYnV0ZSIsInJlbW92ZUF0dHJpYnV0ZSIsImF1dG9TdHlsZUVuYWJsZWQiLCJtb2RpZmllcnNNYXAiLCJwbGF0Zm9ybXMiLCJhbmRyb2lkIiwiZWxlbWVudE5hbWUiLCJ0YWdOYW1lIiwiaGFzTW9kaWZpZXIiLCJvbGRNb2RpZmllciIsIm5ld01vZGlmaWVyIiwibWFwIiwiaGFzT3duUHJvcGVydHkiLCJ1bnNoaWZ0IiwiZWxlbWVudHMiLCJpb3MiLCJyZW1vdmVNb2RpZmllciIsImFkZE1vZGlmaWVyIiwidW5sb2NrZWQiLCJnZXRQbGF0Zm9ybSIsImZvcmNlIiwibW9iaWxlT1MiLCJvbnNQbGF0Zm9ybSIsImdldE1vYmlsZU9TIiwicHJlcGFyZSIsIm1hcE1vZGlmaWVyIiwibW9kaWZpZXIiLCJtIiwicmVzdG9yZU1vZGlmaWVyIiwiaXNFbmFibGVkIiwiZW5hYmxlIiwiZGlzYWJsZSIsIk1vZGlmaWVyVXRpbCIsImxhc3QiLCJjdXJyZW50IiwibWFrZURpY3QiLCJyZW1vdmVkIiwidG9rZW4iLCJhZGRlZCIsImRpY3QiLCJkaWZmIiwiY2xhc3NMaXN0IiwidGVtcGxhdGUiLCJrbGFzcyIsImsiLCJhZGQiLCJyZW1vdmUiLCJzY2hlbWUiLCJzZWxlY3RvciIsInRhcmdldEVsZW1lbnRzIiwicXVlcnlTZWxlY3RvckFsbCIsInRhcmdldEVsZW1lbnQiLCJmaW5kUGFyZW50IiwicGFyZW50IiwiYXBwbHlEaWZmVG9DbGFzc0xpc3QiLCJhcHBseURpZmZUb0VsZW1lbnQiLCJhdXRvU3R5bGUiLCJtb2RpZmllclRva2VuIiwidG9rZW5zIiwiaW5kZXgiLCJzdGFydHNXaXRoIiwiYyIsInN1YnN0ciIsImVuZHNXaXRoIiwidW53cmFwIiwiaXNPYmplY3RTdHJpbmciLCJpc0FycmF5U3RyaW5nIiwiaXNRdW90ZWRTdHJpbmciLCJlcnJvciIsInN0cmluZyIsIm9yaWdpbmFsU3RyaW5nIiwicHJvY2Vzc1Rva2VuIiwiaXNOYU4iLCJwYXJzZU9iamVjdCIsInBhcnNlQXJyYXkiLCJuZXh0VG9rZW4iLCJsaW1pdCIsImNoYXJDb2RlQXQiLCJuZXN0ZWRPYmplY3QiLCJpc1ZhbGlkS2V5Iiwib2JqZWN0IiwicmVhZGluZ0tleSIsInByZXZpb3VzVG9rZW4iLCJhcnJheSIsInBhcnNlIiwiZXJyb3JQcmVmaXgiLCJnbG9iYWxzIiwiZmFiT2Zmc2V0Iiwic3VwcG9ydHNQYXNzaXZlIiwiX3J1bk9uQWN0dWFsUGxhdGZvcm0iLCJhY3R1YWxNb2JpbGVPUyIsImlzV0tXZWJWaWV3Iiwib3B0cyIsImRlZmluZVByb3BlcnR5IiwiZWwiLCJvcHQiLCJpc0dEIiwiY2FwdHVyZSIsInByZXBhcmVRdWVyeSIsInF1ZXJ5IiwibWF0Y2hlcyIsIndlYmtpdE1hdGNoZXNTZWxlY3RvciIsIm1vek1hdGNoZXNTZWxlY3RvciIsIm1zTWF0Y2hlc1NlbGVjdG9yIiwiZmluZENoaWxkIiwiY2hpbGROb2RlcyIsIm5vZGVUeXBlIiwiTm9kZSIsIkVMRU1FTlRfTk9ERSIsInVudGlsIiwiRG9jdW1lbnRGcmFnbWVudCIsImlzQXR0YWNoZWQiLCJib2R5IiwiY29udGFpbnMiLCJoYXNBbnlDb21wb25lbnRBc1BhcmVudCIsIm5vZGVOYW1lIiwiZ2V0QWxsQ2hpbGROb2RlcyIsImZyb20iLCJjaGlsZHJlbiIsImNoaWxkRWwiLCJpc1BhZ2VDb250cm9sIiwicHJvcGFnYXRlQWN0aW9uIiwiYWN0aW9uIiwiY2hpbGQiLCJjYW1lbGl6ZSIsImwiLCJ0b1VwcGVyQ2FzZSIsImNyZWF0ZSIsInNoaWZ0IiwiY2xhc3NOYW1lIiwiaW1wb3J0Tm9kZSIsImlubmVySFRNTCIsInRocm93IiwiY3JlYXRlRnJhZ21lbnQiLCJjb250ZW50IiwiZXh0ZW5kIiwiZHN0IiwiYXJyYXlGcm9tIiwiYXJyYXlMaWtlIiwicGFyc2VKU09OT2JqZWN0U2FmZWx5IiwianNvblN0cmluZyIsImZhaWxTYWZlIiwiSlNPTiIsImZpbmRGcm9tUGF0aCIsInBhdGgiLCJnZXRUb3BQYWdlIiwiY29udGFpbmVyIiwidG9wUGFnZSIsImZpbmRUb29sYmFyUGFnZSIsInBhZ2UiLCJfY2FuQW5pbWF0ZVRvb2xiYXIiLCJfY29udGVudEVsZW1lbnQiLCJuZXh0UGFnZSIsInRyaWdnZXJFbGVtZW50RXZlbnQiLCJldmVudE5hbWUiLCJkZXRhaWwiLCJDdXN0b21FdmVudCIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwiZGlzcGF0Y2hFdmVudCIsIm1vZGlmaWVyTmFtZSIsIlJlZ0V4cCIsImZvcmNlQXV0b1N0eWxlIiwibmV3TW9kaWZpZXJzIiwidG9nZ2xlTW9kaWZpZXIiLCJ0b2dnbGUiLCJyZXN0b3JlQ2xhc3MiLCJkZWZhdWx0Q2xhc3MiLCJyZWZyZXNoIiwidXBkYXRlUGFyZW50UG9zaXRpb24iLCJfcGFyZW50VXBkYXRlZCIsInBhcmVudEVsZW1lbnQiLCJnZXRQcm9wZXJ0eVZhbHVlIiwicG9zaXRpb24iLCJ0b2dnbGVBdHRyaWJ1dGUiLCJ2YWx1ZSIsImJpbmRMaXN0ZW5lcnMiLCJsaXN0ZW5lck5hbWVzIiwiYm91bmROYW1lIiwiYmluZCIsImVhY2giLCJvYmoiLCJmIiwidXBkYXRlUmlwcGxlIiwiaGFzUmlwcGxlIiwiYXR0cnMiLCJyaXBwbGVFbGVtZW50IiwiaW5zZXJ0QmVmb3JlIiwiZmlyc3RDaGlsZCIsImFuaW1hdGlvbk9wdGlvbnNQYXJzZSIsImlzSW50ZWdlciIsImlzRmluaXRlIiwiZmxvb3IiLCJkZWZlciIsImRlZmVycmVkIiwicHJvbWlzZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiaW50ZXJuYWwiLCJjb25maWciLCJ3YXJuaW5nc0Rpc2FibGVkIiwiY29uc29sZSIsIm1lc3NhZ2UiLCJ0aHJvd0Fic3RyYWN0IiwidGhyb3dNZW1iZXIiLCJ0aHJvd1BhZ2VMb2FkZXIiLCJ0aHJvd0FuaW1hdG9yIiwicHJldmVudCIsInByZXZlbnREZWZhdWx0IiwiaW9zUHJldmVudFNjcm9sbCIsImdkIiwiY2xlYW4iLCJpb3NQYWdlU2Nyb2xsRml4IiwiaXNWYWxpZEdlc3R1cmUiLCJnZXN0dXJlIiwiZGlzdGFuY2UiLCJkZWx0YVRpbWUiLCJjaGVja01pc3NpbmdJbXBvcnQiLCJlbGVtZW50TmFtZXMiLCJvbnNFbGVtZW50cyIsImRlZmluZUJvb2xlYW5Qcm9wZXJ0aWVzIiwiYXR0cmlidXRlTGlzdCIsInByb3BlcnR5TmFtZSIsImNvbmZpZ3VyYWJsZSIsImRlZmluZVN0cmluZ1Byb3BlcnRpZXMiLCJkZWZpbmVMaXN0ZW5lclByb3BlcnR5IiwiY2FtZWxpemVkIiwiY2hhckF0IiwibmV3SGFuZGxlciIsImlzQ29ubmVjdGVkIiwib25Db25uZWN0ZWQiLCJvbkRpc2Nvbm5lY3RlZCIsInBhZ2VBdHRyaWJ1dGVFeHByZXNzaW9uIiwiX3ZhcmlhYmxlcyIsImRlZmluZVZhcmlhYmxlIiwib3ZlcndyaXRlIiwiZ2V0VmFyaWFibGUiLCJyZW1vdmVWYXJpYWJsZSIsImdldEFsbFZhcmlhYmxlcyIsIl9wYXJzZVBhcnQiLCJwYXJ0IiwiaW5JbnRlcnBvbGF0aW9uIiwiY3VycmVudEluZGV4Iiwic3Vic3RyaW5nIiwiX3JlcGxhY2VUb2tlbiIsInJlIiwidmFyaWFibGUiLCJydiIsIl9yZXBsYWNlVG9rZW5zIiwiX3BhcnNlRXhwcmVzc2lvbiIsImV4cHJlc3Npb24iLCJldmFsdWF0ZSIsImdldElPU0RldmljZSIsImlzV2ViVmlldyIsImF1dG9TdGF0dXNCYXJGaWxsIiwiYW5pbWF0aW9uc0Rpc2FibGVkIiwibnVsbEVsZW1lbnQiLCJpc0VuYWJsZWRBdXRvU3RhdHVzQmFyRmlsbCIsIm5vcm1hbGl6ZVBhZ2VIVE1MIiwid2FpdERPTUNvbnRlbnRMb2FkZWQiLCJ3cmFwcGVkQ2FsbGJhY2siLCJvblJlYWR5Iiwic2hvdWxkRmlsbFN0YXR1c0JhciIsImlzSU9TN2Fib3ZlIiwiaXNJUGhvbmVYIiwidGVtcGxhdGVTdG9yZSIsIl9zdG9yYWdlIiwiZ2V0VGVtcGxhdGVIVE1MQXN5bmMiLCJjYWNoZSIsImxvY2FsIiwiZ2V0RWxlbWVudEJ5SWQiLCJ0ZXh0Q29udGVudCIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsIm9ubG9hZCIsInJlc3BvbnNlVGV4dCIsInN0YXR1cyIsImZyYWdtZW50IiwiY3JlYXRlVGV4dE5vZGUiLCJ0ZXh0IiwicmVwbGFjZUNoaWxkIiwib25lcnJvciIsInNlbmQiLCJnZXRQYWdlSFRNTEFzeW5jIiwicGFnZXMiLCJnZXRQYWdlIiwiY2F0Y2giLCJBbmltYXRvckZhY3RvcnkiLCJfYW5pbWF0b3JzIiwiYW5pbWF0b3JzIiwiX2Jhc2VDbGFzcyIsImJhc2VDbGFzcyIsIl9iYXNlQ2xhc3NOYW1lIiwiYmFzZUNsYXNzTmFtZSIsIl9hbmltYXRpb24iLCJkZWZhdWx0QW5pbWF0aW9uIiwiX2FuaW1hdGlvbk9wdGlvbnMiLCJkZWZhdWx0QW5pbWF0aW9uT3B0aW9ucyIsImRlZmF1bHRBbmltYXRvciIsImFuaW1hdG9yIiwiYW5pbWF0aW9uIiwiQW5pbWF0b3IiLCJhbmltYXRpb25PcHRzIiwiYW5pbWF0aW9uT3B0aW9ucyIsImR1cmF0aW9uIiwiZGVsYXkiLCJfcmVhZHkiLCJfZG9tQ29udGVudExvYWRlZCIsIl9vbkRPTUNvbnRlbnRMb2FkZWQiLCJhZGRCYWNrQnV0dG9uTGlzdGVuZXIiLCJyZW1vdmVCYWNrQnV0dG9uTGlzdGVuZXIiLCJIYW5kbGVyUmVwb3NpdG9yeSIsIl9zdG9yZSIsIl9nZW5JZCIsImRhdGFzZXQiLCJkZXZpY2VCYWNrQnV0dG9uSGFuZGxlcklkIiwiaWQiLCJoYXMiLCJEZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlciIsIl9pc0VuYWJsZWQiLCJfYm91bmRDYWxsYmFjayIsIl9jYWxsYmFjayIsImNyZWF0ZUV2ZW50IiwiaW5pdEV2ZW50IiwiX2Rpc3BhdGNoRGV2aWNlQmFja0J1dHRvbkV2ZW50IiwiX2VsZW1lbnQiLCJzZXRMaXN0ZW5lciIsImRlc3Ryb3kiLCJ0cmVlIiwiX2NhcHR1cmVUcmVlIiwiX2ZpbmRIYW5kbGVyTGVhZkVsZW1lbnQiLCJjYWxsUGFyZW50SGFuZGxlciIsImNyZWF0ZVRyZWUiLCJhcnJheU9mIiwiY2hpbGRFbGVtZW50IiwiZGlzcGxheSIsIl9pc1Nob3duIiwic3ViVHJlZSIsImZpbmQiLCJjaGlsZE5vZGUiLCJsZWZ0IiwicmlnaHQiLCJsZWZ0WiIsInpJbmRleCIsInJpZ2h0WiIsImRiYkRpc3BhdGNoZXIiLCJkZXZpY2VCYWNrQnV0dG9uRGlzcGF0Y2hlciIsIm9ucyIsInJlZ2lzdGVyIiwidGVtcGxhdGVzIiwiX29uc0xvYWRlZCIsIl91dGlsIiwicmVhZHkiLCJlbmFibGVEZXZpY2VCYWNrQnV0dG9uSGFuZGxlciIsIl9kZWZhdWx0RGV2aWNlQmFja0J1dHRvbkhhbmRsZXIiLCJfaW50ZXJuYWwiLCJjcmVhdGVIYW5kbGVyIiwiYXBwIiwiZXhpdEFwcCIsIl9nZXN0dXJlRGV0ZWN0b3IiLCJHZXN0dXJlRGV0ZWN0b3IiLCJwYXNzaXZlIiwia2V5Q29kZSIsImZpcmVEZXZpY2VCYWNrQnV0dG9uRXZlbnQiLCJfc2V0dXBMb2FkaW5nUGxhY2VIb2xkZXJzIiwiVElNRU9VVF9SQVRJTyIsImNhcGl0YWxpemUiLCJzdHIiLCJidWlsZFRyYW5zaXRpb25WYWx1ZSIsInBhcmFtcyIsInByb3BlcnR5IiwidGltaW5nIiwicHJvcCIsIm9uY2VPblRyYW5zaXRpb25FbmQiLCJfdHJhbnNpdGlvbkVuZEV2ZW50cyIsInN0b3BQcm9wYWdhdGlvbiIsInZlbmRvclByZWZpeCIsIl9jc3NQcm9wZXJ0eURpY3QiLCJhIiwieiIsInVwcGVyIiwiaGFzQ3NzUHJvcGVydHkiLCJwcmUiLCJmb3JjZUxheW91dEF0T25jZSIsImJhdGNoSW1tZWRpYXRlIiwib2Zmc2V0SGVpZ2h0IiwiY2FsbGJhY2tzIiwiY29uY3JlYXRlQ2FsbGJhY2tzIiwiYmF0Y2hBbmltYXRpb25GcmFtZSIsInJhZiIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsIndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSIsIm1velJlcXVlc3RBbmltYXRpb25GcmFtZSIsIm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJtc1JlcXVlc3RBbmltYXRpb25GcmFtZSIsInRyYW5zaXRpb25Qcm9wZXJ0eU5hbWUiLCJBbmltaXQiLCJkZWZhdWx0cyIsInRyYW5zaXRpb25RdWV1ZSIsImxhc3RTdHlsZUF0dHJpYnV0ZURpY3QiLCJwbGF5IiwiZG9uZSIsInN0YXJ0QW5pbWF0aW9uIiwiZGVmYXVsdCIsInRvIiwic3RlcCIsImNzcyIsInNhdmVTdHlsZSIsIndhaXQiLCJyZXN0b3JlU3R5bGUiLCJ0cmFuc2l0aW9uIiwiVHJhbnNpdGlvbiIsImJ1aWxkIiwic2Vjb25kcyIsInRyYW5zaXRpb25OYW1lIiwidHJhbnNpdGlvblZhbHVlIiwidGltZW91dElkIiwiY2xlYXJUcmFuc2l0aW9uIiwiY2xlYXJUaW1lb3V0IiwibGVuIiwicmVzZXQiLCJfZGVxdWV1ZVRyYW5zaXRpb24iLCJfY3VycmVudFRyYW5zaXRpb24iLCJjYWxsZWQiLCJydW5BbGwiLCJjcmVhdGVBY3R1YWxDc3NQcm9wcyIsInRpbWVvdXQiLCJwcmVmaXhlZCIsIkV2ZW50IiwiVXRpbHMiLCJEZXRlY3Rpb24iLCJQb2ludGVyRXZlbnQiLCJJbnN0YW5jZSIsImJlaGF2aW9yIiwidG91Y2hBY3Rpb24iLCJ0b3VjaENhbGxvdXQiLCJjb250ZW50Wm9vbWluZyIsInVzZXJEcmFnIiwidGFwSGlnaGxpZ2h0Q29sb3IiLCJET0NVTUVOVCIsIkhBU19QT0lOVEVSRVZFTlRTIiwicG9pbnRlckVuYWJsZWQiLCJtc1BvaW50ZXJFbmFibGVkIiwiSEFTX1RPVUNIRVZFTlRTIiwiSVNfTU9CSUxFIiwiTk9fTU9VU0VFVkVOVFMiLCJDQUxDVUxBVEVfSU5URVJWQUwiLCJFVkVOVF9UWVBFUyIsIkRJUkVDVElPTl9ET1dOIiwiRElSRUNUSU9OX0xFRlQiLCJESVJFQ1RJT05fVVAiLCJESVJFQ1RJT05fUklHSFQiLCJQT0lOVEVSX01PVVNFIiwiUE9JTlRFUl9UT1VDSCIsIlBPSU5URVJfUEVOIiwiRVZFTlRfU1RBUlQiLCJFVkVOVF9NT1ZFIiwiRVZFTlRfRU5EIiwiRVZFTlRfUkVMRUFTRSIsIkVWRU5UX1RPVUNIIiwiUkVBRFkiLCJwbHVnaW5zIiwiZ2VzdHVyZXMiLCJkZXRlcm1pbmVFdmVudFR5cGVzIiwib25Ub3VjaCIsImRldGVjdCIsInV0aWxzIiwiZGVzdCIsInNyYyIsIm1lcmdlIiwiaXRlcmF0b3IiLCJjb250ZXh0IiwiaW5TdHIiLCJpbkFycmF5IiwiZGVlcCIsImV2ZXJ5IiwidG9BcnJheSIsImhhc1BhcmVudCIsImdldENlbnRlciIsInRvdWNoZXMiLCJwYWdlWCIsInBhZ2VZIiwiY2xpZW50WCIsImNsaWVudFkiLCJtaW4iLCJtYXgiLCJ0b3VjaCIsImdldFZlbG9jaXR5IiwiZGVsdGFYIiwiZGVsdGFZIiwieCIsImFicyIsInkiLCJnZXRBbmdsZSIsInRvdWNoMSIsInRvdWNoMiIsImF0YW4yIiwiUEkiLCJnZXREaXJlY3Rpb24iLCJnZXREaXN0YW5jZSIsInNxcnQiLCJnZXRTY2FsZSIsInN0YXJ0IiwiZW5kIiwiZ2V0Um90YXRpb24iLCJpc1ZlcnRpY2FsIiwiZGlyZWN0aW9uIiwic2V0UHJlZml4ZWRDc3MiLCJwcmVmaXhlcyIsInRvQ2FtZWxDYXNlIiwidG9nZ2xlQmVoYXZpb3IiLCJmYWxzZUZuIiwidXNlclNlbGVjdCIsIm9uc2VsZWN0c3RhcnQiLCJvbmRyYWdzdGFydCIsInByZXZlbnRNb3VzZUV2ZW50cyIsInN0YXJ0ZWQiLCJzaG91bGREZXRlY3QiLCJob29rIiwidHlwZXMiLCJldmVudFR5cGUiLCJvblRvdWNoSGFuZGxlciIsImV2Iiwic3JjVHlwZSIsImlzUG9pbnRlciIsImlzTW91c2UiLCJ0cmlnZ2VyVHlwZSIsImJ1dHRvbiIsImJ1dHRvbnMiLCJtYXRjaFR5cGUiLCJ1cGRhdGVQb2ludGVyIiwiZG9EZXRlY3QiLCJ0b3VjaExpc3QiLCJnZXRUb3VjaExpc3QiLCJ0b3VjaExpc3RMZW5ndGgiLCJ0cmlnZ2VyQ2hhbmdlIiwidHJpZ2dlciIsImNoYW5nZWRMZW5ndGgiLCJjaGFuZ2VkVG91Y2hlcyIsImV2RGF0YSIsImNvbGxlY3RFdmVudERhdGEiLCJpZGVudGlmaWVycyIsImlkZW50aWZpZXIiLCJwb2ludGVyVHlwZSIsImNlbnRlciIsInRpbWVTdGFtcCIsIkRhdGUiLCJub3ciLCJzcmNFdmVudCIsInByZXZlbnRNYW5pcHVsYXRpb24iLCJzdG9wRGV0ZWN0IiwicG9pbnRlcnMiLCJ0b3VjaGxpc3QiLCJwb2ludGVyIiwicG9pbnRlckV2ZW50IiwicG9pbnRlcklkIiwicHQiLCJNU1BPSU5URVJfVFlQRV9NT1VTRSIsIk1TUE9JTlRFUl9UWVBFX1RPVUNIIiwiTVNQT0lOVEVSX1RZUEVfUEVOIiwicmVzZXRMaXN0IiwiZGV0ZWN0aW9uIiwicHJldmlvdXMiLCJzdG9wcGVkIiwic3RhcnREZXRlY3QiLCJpbnN0IiwiZXZlbnREYXRhIiwic3RhcnRFdmVudCIsImxhc3RFdmVudCIsImxhc3RDYWxjRXZlbnQiLCJmdXR1cmVDYWxjRXZlbnQiLCJsYXN0Q2FsY0RhdGEiLCJleHRlbmRFdmVudERhdGEiLCJpbnN0T3B0aW9ucyIsInRyaWdnZXJHZXN0dXJlIiwiZW5hYmxlZCIsImdldENhbGN1bGF0ZWREYXRhIiwiY3VyIiwicmVjYWxjIiwiY2FsY0V2IiwiY2FsY0RhdGEiLCJ2ZWxvY2l0eSIsImFuZ2xlIiwidmVsb2NpdHlYIiwidmVsb2NpdHlZIiwiaW50ZXJpbUFuZ2xlIiwiaW50ZXJpbURpcmVjdGlvbiIsInN0YXJ0RXYiLCJsYXN0RXYiLCJzY2FsZSIsInJvdGF0aW9uIiwiYiIsImxpc3RlbmVyT3B0aW9ucyIsImV2ZW50U3RhcnRIYW5kbGVyIiwiZXZlbnRIYW5kbGVycyIsIm9uRXZlbnQiLCJvZmZFdmVudCIsInRyaWdnZXJFdmVudCIsInN0YXRlIiwiZGlzcG9zZSIsImVoIiwidHJpZ2dlcmVkIiwiZHJhZ0dlc3R1cmUiLCJkcmFnTWF4VG91Y2hlcyIsImRyYWdNaW5EaXN0YW5jZSIsInN0YXJ0Q2VudGVyIiwiZHJhZ0Rpc3RhbmNlQ29ycmVjdGlvbiIsImZhY3RvciIsImRyYWdMb2NrVG9BeGlzIiwiZHJhZ0xvY2tNaW5EaXN0YW5jZSIsImxhc3REaXJlY3Rpb24iLCJkcmFnQmxvY2tWZXJ0aWNhbCIsImRyYWdCbG9ja0hvcml6b250YWwiLCJEcmFnIiwiR2VzdHVyZSIsInJlbGVhc2VHZXN0dXJlIiwidGltZXIiLCJob2xkR2VzdHVyZSIsImhvbGRUaW1lb3V0IiwiaG9sZFRocmVzaG9sZCIsIkhvbGQiLCJSZWxlYXNlIiwiSW5maW5pdHkiLCJTd2lwZSIsInN3aXBlTWluVG91Y2hlcyIsInN3aXBlTWF4VG91Y2hlcyIsInN3aXBlVmVsb2NpdHlYIiwic3dpcGVWZWxvY2l0eVkiLCJzd2lwZUdlc3R1cmUiLCJoYXNNb3ZlZCIsInRhcEdlc3R1cmUiLCJwcmV2Iiwic2luY2VQcmV2IiwiZGlkRG91YmxlVGFwIiwidGFwTWF4RGlzdGFuY2UiLCJ0YXBNYXhUaW1lIiwiZG91YmxlVGFwSW50ZXJ2YWwiLCJkb3VibGVUYXBEaXN0YW5jZSIsInRhcEFsd2F5cyIsIlRhcCIsIlRvdWNoIiwicHJldmVudE1vdXNlIiwidG91Y2hHZXN0dXJlIiwidHJhbnNmb3JtR2VzdHVyZSIsInNjYWxlVGhyZXNob2xkIiwicm90YXRpb25UaHJlc2hvbGQiLCJ0cmFuc2Zvcm1NaW5TY2FsZSIsInRyYW5zZm9ybU1pblJvdGF0aW9uIiwiVHJhbnNmb3JtIiwicmVhZHlNYXAiLCJxdWV1ZU1hcCIsImlzQ29udGVudFJlYWR5Iiwic2V0Q29udGVudFJlYWR5IiwiYWRkQ2FsbGJhY2siLCJjb25zdW1lUXVldWUiLCJkZWxldGUiLCJjb250ZW50UmVhZHkiLCJjaGFuZ2VzIiwiVG9hc3RRdWV1ZSIsInRoZW4iLCJfc2V0QXR0cmlidXRlcyIsIl9ub3JtYWxpemVBcmd1bWVudHMiLCJfb2JqZWN0U3ByZWFkIiwibWVzc2FnZUhUTUwiLCJidXR0b25MYWJlbHMiLCJidXR0b25MYWJlbCIsImlzQXJyYXkiLCJjb21waWxlIiwicGFyYW0iLCJwcmltYXJ5QnV0dG9uSW5kZXgiLCJub3RpZmljYXRpb24iLCJfY3JlYXRlQWxlcnREaWFsb2ciLCJpbnB1dFN0cmluZyIsImlzUHJvbXB0IiwiaW5wdXRUeXBlIiwicGxhY2Vob2xkZXIiLCJkZWZhdWx0VmFsdWUiLCJsYWJlbCIsIl9kZXN0cm95RGlhbG9nIiwiZGlhbG9nIiwib25EaWFsb2dDYW5jZWwiLCJtYXNrQ29sb3IiLCJ0aXRsZSIsImlucHV0Iiwic3VibWl0T25FbnRlciIsIm9ua2V5cHJlc3MiLCJoaWRlIiwicmVzb2x2ZVZhbHVlIiwiZm9vdGVyIiwiYnV0dG9uRWxlbWVudCIsIm9uY2xpY2siLCJzaG93IiwiYXV0b2ZvY3VzIiwic3RyTGVuZ3RoIiwiZm9jdXMiLCJpbmNsdWRlcyIsInNldFNlbGVjdGlvblJhbmdlIiwiYWxlcnQiLCJjb25maXJtIiwicHJvbXB0IiwidG9hc3QiLCJvcmlnaW5hbEhpZGUiLCJmaW5pc2giLCJfdG9hc3QiLCJjaGVja09wdGlvbnMiLCJlcnIiLCJpbnN0YW5jZU9mIiwiY2IiLCJkIiwiYWN0aW9uU2hlZXQiLCJjbGFzcyIsImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCJpdGVtIiwiYnV0dG9uT3B0aW9ucyIsImRlc3RydWN0aXZlIiwiaWNvbiIsIl9pc1BvcnRyYWl0IiwiaXNQb3J0cmFpdCIsImlzTGFuZHNjYXBlIiwiX2luaXQiLCJfb25PcmllbnRhdGlvbkNoYW5nZSIsIl9vblJlc2l6ZSIsImlubmVySGVpZ2h0IiwiaW5uZXJXaWR0aCIsIl9pbnN0YWxsSXNQb3J0cmFpdEltcGxlbWVudGF0aW9uIiwib3JpZW50YXRpb24iLCJuSXRlciIsImludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJ3IiwiaCIsImNsZWFySW50ZXJ2YWwiLCJtb2RpZmllcnMiLCJzb2Z0d2FyZUtleWJvYXJkIiwiX3Zpc2libGUiLCJvblNob3ciLCJvbkhpZGUiLCJiaW5kRXZlbnRzIiwiS2V5Ym9hcmQiLCJvbnNob3ciLCJvbmhpZGUiLCJ2aXNpYmxlIiwiaXNWaXNpYmxlIiwibm9QbHVnaW5FcnJvciIsImdlbmVyYXRlSWQiLCJEb29yTG9jayIsIl9sb2NrTGlzdCIsIl93YWl0TGlzdCIsIl9sb2ciLCJsb2ciLCJ1bmxvY2siLCJfdW5sb2NrIiwiX3RyeVRvRnJlZVdhaXRMaXN0IiwiaXNMb2NrZWQiLCJsb2FkUGFnZSIsInBhZ2VFbGVtZW50IiwidW5sb2FkUGFnZSIsIl9kZXN0cm95IiwiUGFnZUxvYWRlciIsImxvYWRlciIsInVubG9hZGVyIiwiX2xvYWRlciIsIl91bmxvYWRlciIsIkVsZW1lbnQiLCJkZWZhdWx0UGFnZUxvYWRlciIsImluc3RhbnRQYWdlTG9hZGVyIiwiYW5pbWl0IiwiX2F1dG9TdHlsZSIsIl9yZWFkeUxvY2siLCJzZWxlY3QiLCJsb2NhdGlvbiIsInNlYXJjaCIsIndhaXREZXZpY2VSZWFkeSIsInJlYWR5RXJyb3IiLCJhZnRlciIsImlzUmVhZHkiLCJ3YWl0VW5sb2NrIiwic2V0RGVmYXVsdERldmljZUJhY2tCdXR0b25MaXN0ZW5lciIsImxpc3RlbmVyIiwiZGlzYWJsZURldmljZUJhY2tCdXR0b25IYW5kbGVyIiwiZW5hYmxlQXV0b1N0YXR1c0JhckZpbGwiLCJkaXNhYmxlQXV0b1N0YXR1c0JhckZpbGwiLCJtb2NrU3RhdHVzQmFyIiwibW9jayIsImRpc2FibGVBbmltYXRpb25zIiwiZW5hYmxlQW5pbWF0aW9ucyIsIl9kaXNhYmxlV2FybmluZ3MiLCJfZW5hYmxlV2FybmluZ3MiLCJkaXNhYmxlQXV0b1N0eWxpbmciLCJlbmFibGVBdXRvU3R5bGluZyIsImRpc2FibGVJY29uQXV0b1ByZWZpeCIsIkljb24iLCJzZXRBdXRvUHJlZml4IiwiZm9yY2VQbGF0Zm9ybVN0eWxpbmciLCJuZXdQbGF0Zm9ybSIsIl9wbGF0Zm9ybVVwZGF0ZSIsIl91cGRhdGVQb3NpdGlvbiIsInByZWxvYWQiLCJhbGwiLCJhcHBlbmQiLCJsaW5rIiwiY3JlYXRlUG9wb3ZlciIsImNyZWF0ZURpYWxvZyIsImNyZWF0ZUFsZXJ0RGlhbG9nIiwib3BlbkFjdGlvblNoZWV0IiwicmVzb2x2ZUxvYWRpbmdQbGFjZWhvbGRlciIsIl9yZXNvbHZlTG9hZGluZ1BsYWNlaG9sZGVyIiwidW5sb2NrRGV2aWNlUmVhZHkiLCJsb2NrIiwiZ2V0Q1MiLCJjdXJyZW50U2NyaXB0Iiwic2NyaXB0cyIsImdldFNjcmlwdFBhZ2UiLCJnZXRFbGVtZW50Q2xhc3MiLCJCYXNlRWxlbWVudCIsIklmRWxlbWVudCIsIl9pc0FsbG93ZWRQbGF0Zm9ybSIsImNvbmRpdGlvbmFsT3JpZW50YXRpb24iLCJjdXJyZW50T3JpZW50YXRpb24iLCJJZiIsImRlZmluZSIsIkJhc2VBbmltYXRvciIsImRlZiIsInByb3BlcnRpZXMiLCJleHRlbmRlZEFuaW1hdG9yIiwibmV3QW5pbWF0b3IiLCJpUGhvbmVYUGF0Y2giLCJpc0lQaG9uZVhQb3J0cmFpdFBhdGNoQWN0aXZlIiwiaXNJUGhvbmVYTGFuZHNjYXBlUGF0Y2hBY3RpdmUiLCJnZXRTYWZlQXJlYUxlbmd0aHMiLCJzYWZlQXJlYUxlbmd0aHMiLCJ0b3AiLCJib3R0b20iLCJnZXRTYWZlQXJlYURPTVJlY3QiLCJzYWZlQXJlYVJlY3QiLCJBY3Rpb25TaGVldEFuaW1hdG9yIiwiTURBY3Rpb25TaGVldEFuaW1hdG9yIiwibWFza1RpbWluZyIsIm1hc2tEdXJhdGlvbiIsIl9tYXNrIiwib3BhY2l0eSIsIl9zaGVldCIsInRyYW5zZm9ybSIsIklPU0FjdGlvblNoZWV0QW5pbWF0b3IiLCJsaWZ0QW1vdW50IiwiY2xpZW50SGVpZ2h0IiwiQmFzZURpYWxvZ0VsZW1lbnQiLCJjb25zdHJ1Y3RvciIsIl9kb29yTG9jayIsIl9jYW5jZWwiLCJfc2VsZkNhbWVsTmFtZSIsIl9kZWZhdWx0REJCIiwiX2FuaW1hdG9yRmFjdG9yeSIsIl91cGRhdGVBbmltYXRvckZhY3RvcnkiLCJzaG91bGRTaG93IiwiX2JhY2tCdXR0b25IYW5kbGVyIiwiX2JhY2tCdXR0b25DYWxsYmFjayIsIl9ydW5uaW5nIiwiX3NldFZpc2libGUiLCJjYW5jZWxlZCIsIl90b2dnbGVTdHlsZSIsInBhcnNlQW5pbWF0aW9uT3B0aW9uc1N0cmluZyIsInN0cmluZ2lmeSIsImJhY2tncm91bmRDb2xvciIsIm9uRGV2aWNlQmFja0J1dHRvbiIsIm9uTW9kaWZpZXJDaGFuZ2VkIiwiX3NjaGVtZSIsIl91cGRhdGVBbmltYXRpb24iLCJfdXBkYXRlTWFzayIsIl9hbmltYXRvckRpY3QiLCJBY3Rpb25TaGVldEVsZW1lbnQiLCJfY29tcGlsZSIsInNoZWV0IiwiX3RpdGxlIiwiaGlkZGVuIiwibWFzayIsImluaXRNb2RpZmllciIsIl91cGRhdGVUaXRsZSIsIkFjdGlvblNoZWV0IiwiQW5pbWF0b3JDU1MiLCJfcXVldWUiLCJfaW5kZXgiLCJmaW5hbCIsImdldFRpbWUiLCJpbml0aWFsIiwibmV4dCIsInVwZGF0ZVN0eWxlcyIsInN0b3AiLCJ0cmFuc2l0aW9uRHVyYXRpb24iLCJzdG9wTmV4dCIsInNwZWVkIiwibmV3RHVyYXRpb24iLCJwYXNzZWQiLCJyZW1haW5pbmciLCJzcGVlZFVwVGltZSIsIm1pbGxpc2Vjb25kcyIsInYiLCJwYXJzZUZsb2F0IiwidHJhbnNpdGlvblByb3BlcnR5IiwiX29uU3RvcEFuaW1hdGlvbnMiLCJzdG9wQW5pbWF0aW9ucyIsImFuaW1hdGUiLCJkZWZhdWx0Q2xhc3NOYW1lIiwiUmlwcGxlRWxlbWVudCIsIl9vblRhcCIsIl9vbkhvbGQiLCJfb25EcmFnU3RhcnQiLCJfb25SZWxlYXNlIiwiX2FuaW1hdG9yIiwiYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrIiwiX3dhdmUiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiX2JhY2tncm91bmQiLCJzaXplcyIsInNpemUiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJfZ2V0RWZmZWN0U2l6ZSIsIl9jZW50ZXIiLCJyb3VuZCIsIl9taW5SIiwiX2NhbGN1bGF0ZUNvb3JkcyIsInN0b3BBbGwiLCJjb21wdXRlZFN0eWxlIiwiZGlzYWJsZWQiLCJyaXBwbGUiLCJfdXBkYXRlUGFyZW50IiwiX3JpcHBsZUFuaW1hdGlvbiIsImZhZGUiLCJfaG9sZGluZyIsIl9wYXJlbnROb2RlIiwicG4iLCJiYWNrZ3JvdW5kIiwiUmlwcGxlIiwiQmFzZUJ1dHRvbkVsZW1lbnQiLCJfZGVmYXVsdENsYXNzTmFtZSIsIl9pY29uIiwiX2hpZGRlbkJ1dHRvbiIsIl91cGRhdGVSaXBwbGUiLCJfcmlwcGxlT3B0IiwiX3VwZGF0ZUljb24iLCJBY3Rpb25TaGVldEJ1dHRvbkVsZW1lbnQiLCJBY3Rpb25TaGVldEJ1dHRvbiIsIkFsZXJ0RGlhbG9nQW5pbWF0b3IiLCJBbmRyb2lkQWxlcnREaWFsb2dBbmltYXRvciIsIl9kaWFsb2ciLCJJT1NBbGVydERpYWxvZ0FuaW1hdG9yIiwiQWxlcnREaWFsb2dFbGVtZW50IiwiQWxlcnREaWFsb2ciLCJBbGVydERpYWxvZ0J1dHRvbkVsZW1lbnQiLCJBbGVydERpYWxvZ0J1dHRvbiIsImlvc0JhY2tCdXR0b25JY29uIiwibWRCYWNrQnV0dG9uSWNvbiIsIkJhY2tCdXR0b25FbGVtZW50IiwiX29wdGlvbnMiLCJfYm91bmRPbkNsaWNrIiwiX29uQ2xpY2siLCJfY29ubmVjdE9uQ2xpY2siLCJfZGlzY29ubmVjdE9uQ2xpY2siLCJkZWZhdWx0UHJldmVudGVkIiwicG9wUGFnZSIsIm9uc0JhY2tCdXR0b24iLCJCYWNrQnV0dG9uIiwiQm90dG9tVG9vbGJhckVsZW1lbnQiLCJCb3R0b21Ub29sYmFyIiwiQnV0dG9uRWxlbWVudCIsIkJ1dHRvbiIsIkNhcmRFbGVtZW50IiwiQ2FyZCIsIkNhcm91c2VsSXRlbUVsZW1lbnQiLCJDYXJvdXNlbEl0ZW0iLCJkaXJlY3Rpb25NYXAiLCJ2ZXJ0aWNhbCIsImF4aXMiLCJkaXIiLCJ0M2QiLCJob3Jpem9udGFsIiwiU3dpcGVyIiwiRkFMU0UiLCJnZXRFbGVtZW50Iiwic2Nyb2xsSG9vayIsIml0ZW1TaXplIiwiZ2V0QXV0b1Njcm9sbFJhdGlvIiwicmF0aW8iLCJzaG91bGRCbG9jayIsIm9uRHJhZ1N0YXJ0Iiwib25EcmFnIiwib25EcmFnRW5kIiwib25SZXNpemUiLCJfc2hvdWxkRml4U2Nyb2xsIiwic3dpcGVhYmxlIiwiYXV0b1JlZnJlc2giLCJpbml0aWFsaXplZCIsImJsb2NrZXIiLCJfbXV0YXRpb25PYnNlcnZlciIsInVwZGF0ZVN3aXBlYWJsZSIsInVwZGF0ZUF1dG9SZWZyZXNoIiwiX3Njcm9sbCIsIl9vZmZzZXQiLCJfbGFzdEFjdGl2ZUluZGV4IiwiX3VwZGF0ZUxheW91dCIsIl9zZXR1cEluaXRpYWxJbmRleCIsInNldHVwUmVzaXplIiwiaXRlbU51bVNpemUiLCJfcmVzZXQiLCJzZXRBY3RpdmVJbmRleCIsIl9pdGVtTnVtU2l6ZSIsIl9jYWxjdWxhdGVJdGVtU2l6ZSIsIml0ZW1Db3VudCIsInRhcmdldFNpemUiLCJjZWlsIiwiTnVtYmVyIiwiZ2V0SW5pdGlhbEluZGV4IiwiX3Njcm9sbFRvIiwiX3NldFN3aXBpbmciLCJzY3JvbGwiLCJtYXhTY3JvbGwiLCJfY2hhbmdlVG8iLCJjb3VudCIsInNob3VsZFVwZGF0ZSIsInNob3VsZFdhdGNoIiwibmV3U2l6ZSIsImJsb2NrIiwicG9pbnRlckV2ZW50cyIsImlzRmlyc3QiLCJpc092ZXJTY3JvbGxhYmxlIiwiaXNMYXN0IiwiX2lnbm9yZURyYWciLCJjb25zdW1lZCIsImNvbnN1bWUiLCJfY2FuQ29uc3VtZUdlc3R1cmUiLCJzdGFydFgiLCJkaXN0RnJvbUVkZ2UiLCJnZXRCdWJibGVXaWR0aCIsIl9zdGFydGVkIiwidG9nZ2xlQmxvY2tlciIsIl9jb250aW51ZWQiLCJfZ2V0RGVsdGEiLCJ0aHJvdHRsZSIsIm5vcm1hbGl6ZWRTY3JvbGwiLCJfbm9ybWFsaXplU2Nyb2xsIiwiX3N0YXJ0TW9tZW50dW1TY3JvbGwiLCJfa2lsbE92ZXJTY3JvbGwiLCJfZ2V0VmVsb2NpdHkiLCJtYXRjaGVzRGlyZWN0aW9uIiwiZE0iLCJuZXh0U2Nyb2xsIiwiX2dldEF1dG9TY3JvbGwiLCJzd2lwZSIsImtpbGxPdmVyU2Nyb2xsIiwib3ZlclNjcm9sbEhvb2siLCJhY3RpdmVJbmRleCIsImdldEFjdGl2ZUluZGV4IiwibGFzdEFjdGl2ZUluZGV4IiwiY2hhbmdlIiwicHJlQ2hhbmdlSG9vayIsInBvc3RDaGFuZ2VIb29rIiwidG9GaXhlZCIsIl9nZXRUcmFuc2Zvcm0iLCJvZmZzZXQiLCJpc0F1dG9TY3JvbGxhYmxlIiwiYXJyIiwicG9zIiwibGFzdFNjcm9sbCIsInNjcm9sbFJhdGlvIiwiX3RhcmdldFNpemUiLCJyZWZyZXNoSG9vayIsIm5leHRFbGVtZW50U2libGluZyIsImlzQ2VudGVyZWQiLCJDYXJvdXNlbEVsZW1lbnQiLCJfY29ubmVjdE9uU3dpcGUiLCJfZGlzY29ubmVjdE9uU3dpcGUiLCJfc3dpcGVyIiwiYXV0b1Njcm9sbFJhdGlvIiwib3ZlcnNjcm9sbGFibGUiLCJjZW50ZXJlZCIsImF1dG9TY3JvbGwiLCJfb25PdmVyU2Nyb2xsIiwiX29uUHJlQ2hhbmdlIiwiX29uUG9zdENoYW5nZSIsIl9vblJlZnJlc2giLCJpbml0IiwidXBkYXRlSXRlbVNpemUiLCJ3YWl0Rm9yQWN0aW9uIiwiY2Fyb3VzZWwiLCJ3YWl0VG9SZXR1cm4iLCJpdGVtU2l6ZUF0dHIiLCJhdHRyIiwiQ2Fyb3VzZWwiLCJDb2xFbGVtZW50IiwiX3VwZGF0ZVdpZHRoIiwiZmxleCIsIm1heFdpZHRoIiwiQ29sIiwiRGlhbG9nQW5pbWF0b3IiLCJBbmRyb2lkRGlhbG9nQW5pbWF0b3IiLCJJT1NEaWFsb2dBbmltYXRvciIsImJvZHlIZWlnaHQiLCJTbGlkZURpYWxvZ0FuaW1hdG9yIiwiRGlhbG9nRWxlbWVudCIsIkRpYWxvZyIsIkZhYkVsZW1lbnQiLCJfaGlkZSIsIl9zaG93IiwiX21hbnVhbGx5SGlkZGVuIiwiX3RvZ2dsZSIsImlzQm90dG9tIiwidHJhbnNsYXRlIiwiRmFiIiwiR2VzdHVyZURldGVjdG9yRWxlbWVudCIsImF1dG9QcmVmaXgiLCJJY29uRWxlbWVudCIsIl9jbGVhbkNsYXNzQXR0cmlidXRlIiwiX3VwZGF0ZSIsIl9idWlsZENsYXNzQW5kU3R5bGUiLCJfcGFyc2VBdHRyIiwicGFydHMiLCJtZCIsImxhc3RJY29uIiwibGFzdE1vZGlmaWVyIiwiX3ByZWZpeEljb24iLCJjdXN0b21QcmVmaXhSRSIsImljb25OYW1lIiwicmVtb3ZlUHJvcGVydHkiLCJmb250U2l6ZSIsIkxhenlSZXBlYXREZWxlZ2F0ZSIsInVzZXJEZWxlZ2F0ZSIsInRlbXBsYXRlRWxlbWVudCIsIl91c2VyRGVsZWdhdGUiLCJfdGVtcGxhdGVFbGVtZW50IiwiaXRlbUhlaWdodCIsIl9yZW5kZXIiLCJsb2FkSXRlbUVsZW1lbnQiLCJjcmVhdGVJdGVtQ29udGVudCIsImNvdW50SXRlbXMiLCJ1cGRhdGVJdGVtQ29udGVudCIsImNhbGN1bGF0ZUl0ZW1IZWlnaHQiLCJkZXN0cm95SXRlbSIsIkxhenlSZXBlYXRQcm92aWRlciIsIndyYXBwZXJFbGVtZW50IiwiZGVsZWdhdGUiLCJfd3JhcHBlckVsZW1lbnQiLCJfZGVsZWdhdGUiLCJfaW5zZXJ0SW5kZXgiLCJfcGFnZUNvbnRlbnQiLCJfZmluZFBhZ2VDb250ZW50RWxlbWVudCIsImxhc3RTY3JvbGxUb3AiLCJzY3JvbGxUb3AiLCJwYWRkaW5nIiwiX3RvcFBvc2l0aW9ucyIsIl9yZW5kZXJlZEl0ZW1zIiwiX3Vua25vd25JdGVtSGVpZ2h0IiwiX2FkZEV2ZW50TGlzdGVuZXJzIiwiX29uQ2hhbmdlIiwicGFkZGluZ1RvcCIsIm5ld1ZhbHVlIiwicGFnZUNvbnRlbnQiLCJfaXRlbUhlaWdodCIsInZpc2liaWxpdHkiLCJzdGF0aWNJdGVtSGVpZ2h0IiwiX2dldEl0ZW1IZWlnaHQiLCJmb3JjZVJlbmRlciIsImZvcmNlU2Nyb2xsRG93biIsImZpcnN0SXRlbUluZGV4IiwiX2ZpcnN0SXRlbVJlbmRlcmVkIiwiX2NhbGN1bGF0ZVJlbmRlcmVkSGVpZ2h0IiwiZm9yY2VGaXJzdEluZGV4IiwiX3JlbW92ZUFsbEVsZW1lbnRzIiwiZm9yY2VMYXN0SW5kZXgiLCJfY2hlY2tJdGVtSGVpZ2h0IiwiaXNTY3JvbGxVcCIsImtlZXAiLCJfY291bnRJdGVtcyIsIl9jYWxjdWxhdGVTdGFydEluZGV4IiwiaGFzUmVuZGVyRnVuY3Rpb24iLCJfcmVuZGVyRWxlbWVudCIsImxhc3RJbmRleCIsIl9yZW1vdmVFbGVtZW50IiwidXBkYXRlSXRlbSIsImxhc3RJdGVtSW5kZXgiLCJfbGFzdEl0ZW1SZW5kZXJlZCIsIl9yZWNhbGN1bGF0ZVRvcFBvc2l0aW9ucyIsIm1pZGRsZSIsImltbWVkaWF0ZSIsImNhbGxOb3ciLCJfZGVib3VuY2UiLCJfYm91bmRPbkNoYW5nZSIsIl9ib3VuZERvdWJsZUZpcmVPblRvdWNoZW5kIiwiX3BhcmVudEVsZW1lbnQiLCJfcmVtb3ZlRXZlbnRMaXN0ZW5lcnMiLCJMYXp5UmVwZWF0RWxlbWVudCIsIl9sYXp5UmVwZWF0UHJvdmlkZXIiLCJMYXp5UmVwZWF0IiwiTGlzdEhlYWRlckVsZW1lbnQiLCJMaXN0SGVhZGVyIiwiTGlzdFRpdGxlRWxlbWVudCIsIkxpc3RUaXRsZSIsIkxpc3RJdGVtQW5pbWF0b3IiLCJsaXN0SXRlbSIsIlNsaWRlTGlzdEl0ZW1BbmltYXRvciIsIl9hbmltYXRlRXhwYW5zaW9uIiwic2hvdWxkT3BlbiIsIm9sZEhlaWdodCIsImV4cGFuZGFibGVDb250ZW50Iiwib2xkRGlzcGxheSIsImV4cGFuc2lvbk9wZW5UcmFuc2l0aW9uIiwicGFkZGluZ0JvdHRvbSIsImljb25PcGVuVHJhbnNpdGlvbiIsInJldmVyc2UiLCJleHBhbmRDaGV2cm9uIiwiTGlzdEl0ZW1FbGVtZW50IiwiX3Nob3VsZElnbm9yZVRhcCIsInNob3dFeHBhbnNpb24iLCJoaWRlRXhwYW5zaW9uIiwidG9wQ29udGVudCIsImNlbnRlckNvbnRlbnQiLCJfdG9wIiwiY2hldnJvbiIsImV4cGFuZGVkIiwiZXhwYW5kZWRBdFN0YXJ0dXAiLCJfZXhwYW5kaW5nIiwiZXhwYW5kZWRDYWxsYmFjayIsIl9zZXR1cExpc3RlbmVycyIsIl9vcmlnaW5hbEJhY2tncm91bmRDb2xvciIsInRhcHBlZCIsIl9vblRvdWNoIiwiX29uRHJhZyIsIl9vbkNsaWNrVG9wIiwidG9nZ2xlRXhwYW5zaW9uIiwidG91Y2hTdHlsZSIsImJveFNoYWRvdyIsIkxpc3RJdGVtIiwiTGlzdEVsZW1lbnQiLCJMaXN0IiwiSU5QVVRfQVRUUklCVVRFUyIsIkJhc2VJbnB1dEVsZW1lbnQiLCJfYm91bmREZWxlZ2F0ZUV2ZW50IiwiX2RlbGVnYXRlRXZlbnQiLCJfdGVtcGxhdGUiLCJfc2V0SW5wdXRJZCIsIl91cGRhdGVCb3VuZEF0dHJpYnV0ZXMiLCJfaW5wdXQiLCJ2YWwiLCJ0b0lTT1N0cmluZyIsImJsdXIiLCJJbnB1dEVsZW1lbnQiLCJfYm91bmRPbklucHV0IiwiX2JvdW5kT25Gb2N1c2luIiwiX3VwZGF0ZUxhYmVsIiwiX3VwZGF0ZUxhYmVsQ2xhc3MiLCJfaGVscGVyIiwiaW5uZXJUZXh0IiwiSW5wdXQiLCJCYXNlQ2hlY2tib3hFbGVtZW50IiwiY2hlY2tlZCIsIkNoZWNrYm94RWxlbWVudCIsIkNoZWNrYm94IiwiUmFkaW9FbGVtZW50IiwiUmFkaW8iLCJTZWFyY2hJbnB1dEVsZW1lbnQiLCJTZWFyY2hJbnB1dCIsIk1vZGFsQW5pbWF0b3IiLCJtb2RhbCIsIkZhZGVNb2RhbEFuaW1hdG9yIiwiTGlmdE1vZGFsQW5pbWF0b3IiLCJNb2RhbEVsZW1lbnQiLCJNb2RhbCIsIndpZHRoVG9QeCIsInB4Iiwib2Zmc2V0V2lkdGgiLCJTd2lwZVJldmVhbCIsImVsZW1lbnRIYW5kbGVyIiwiZ2V0VGhyZXNob2xkIiwiZ2V0U2lkZSIsImhhbmRsZUdlc3R1cmUiLCJnZXN0dXJlRGV0ZWN0b3IiLCJpZ25vcmVTd2lwZSIsIl93aWR0aCIsIl9zdGFydERpc3RhbmNlIiwiX2Rpc3RhbmNlIiwiaXNJbml0aWFsU3RhdGUiLCJkZWx0YSIsInN3aXBlTWlkIiwiaXNTd2lwZU1heCIsInN3aXBlTWF4Iiwic3dpcGVNaW4iLCJOYXZpZ2F0b3JBbmltYXRvciIsImVudGVyUGFnZSIsImxlYXZlUGFnZSIsIklPU1N3aXBlTmF2aWdhdG9yQW5pbWF0b3IiLCJkdXJhdGlvblJlc3RvcmUiLCJkdXJhdGlvblN3aXBlIiwidGltaW5nU3dpcGUiLCJyZXN0IiwiX2V4Y2x1ZGVkIiwib3B0U3dpcGUiLCJvcHRSZXN0b3JlIiwic3dpcGVTaGFkb3ciLCJpc0RyYWdTdGFydCIsInVuYmxvY2siLCJiYWNrZ3JvdW5kTWFzayIsImVudGVyIiwibGVhdmUiLCJkZWNvbXAiLCJfZGVjb21wb3NlIiwiX2NhbGN1bGF0ZURlbHRhIiwic2hvdWxkQW5pbWF0ZVRvb2xiYXIiLCJfc2hvdWxkQW5pbWF0ZVRvb2xiYXIiLCJ0b29sYmFyIiwiX3NhdmVTdHlsZSIsIm92ZXJmbG93RWxlbWVudCIsImlzU3dpcGluZyIsIl9kcmFnU3RhcnRTZXR1cCIsInN3aXBlUmF0aW8iLCJib3R0b21Ub29sYmFyIiwidG9vbGJhckNlbnRlciIsImJhY2tCdXR0b25MYWJlbCIsIm90aGVyIiwiX3NhdmVkU3R5bGUiLCJzYXZlIiwicmVzdG9yZSIsIl9yZXN0b3JlU3R5bGUiLCJ0cmFuc2xhdGUzZCIsIklPU1NsaWRlTmF2aWdhdG9yQW5pbWF0b3IiLCJfZ2V0VG9vbGJhckVsZW1lbnQiLCJfZ2V0VG9vbGJhckxlZnRJdGVtc0VsZW1lbnQiLCJfZ2V0VG9vbGJhclJpZ2h0SXRlbXNFbGVtZW50IiwiZXhjbHVkZUJhY2tCdXR0b24iLCJfZ2V0VG9vbGJhckNlbnRlckl0ZW1zRWxlbWVudCIsImJhY2tCdXR0b25JY29uIiwiX2dldFRvb2xiYXJCYWNrQnV0dG9uSWNvbkVsZW1lbnQiLCJfZ2V0VG9vbGJhckJhY2tCdXR0b25MYWJlbEVsZW1lbnQiLCJfZ2V0Q29udGVudEVsZW1lbnQiLCJfZ2V0QmFja2dyb3VuZEVsZW1lbnQiLCJfZ2V0Qm90dG9tVG9vbGJhckVsZW1lbnQiLCJ0b29sYmFycyIsImVudGVyVG9vbGJhciIsImxlYXZlVG9vbGJhciIsImlzU3RhdGljIiwiaXNNYXRlcmlhbCIsImlzVHJhbnNwYXJlbnQiLCJkZWNvbXBvc2l0aW9uIiwicGFnZVJlY3QiLCJsYWJlbFJlY3QiLCJlbnRlclBhZ2VUYXJnZXQiLCJsZWF2ZVBhZ2VUYXJnZXQiLCJlbnRlclBhZ2VEZWNvbXBvc2l0aW9uIiwibGVhdmVQYWdlRGVjb21wb3NpdGlvbiIsInBvcFN3aXBlIiwiSU9TTGlmdE5hdmlnYXRvckFuaW1hdG9yIiwiSU9TRmFkZU5hdmlnYXRvckFuaW1hdG9yIiwiTURTbGlkZU5hdmlnYXRvckFuaW1hdG9yIiwiYmxhY2tNYXNrT3BhY2l0eSIsIk1ETGlmdE5hdmlnYXRvckFuaW1hdG9yIiwibWFza0NsZWFyIiwiTURGYWRlTmF2aWdhdG9yQW5pbWF0b3IiLCJ0aW1pbmdQb3AiLCJOb25lTmF2aWdhdG9yQW5pbWF0b3IiLCJyZXdyaXRhYmxlcyIsIm5hdmlnYXRvckVsZW1lbnQiLCJ2ZXJpZnlQYWdlRWxlbWVudCIsIk5hdmlnYXRvckVsZW1lbnQiLCJfaXNSdW5uaW5nIiwiX2luaXRpYWxpemVkIiwiX3BhZ2VMb2FkZXIiLCJfcGFnZU1hcCIsInBhZ2VMb2FkZXIiLCJfcGFnZSIsIl9vbkRldmljZUJhY2tCdXR0b24iLCJzd2lwZUFuaW1hdG9yIiwiX3N3aXBlIiwiX29uU3dpcGUiLCJzd2lwZVRvUG9wIiwicHJldmlvdXNFbGVtZW50U2libGluZyIsImFyZWEiLCJpc0JCIiwicHVzaGVkT3B0aW9ucyIsImFuaW1hdG9yRmFjdG9yeSIsImxvYWRlZCIsIl9nZXRQYWdlVGFyZ2V0IiwicHVzaFBhZ2UiLCJfdXBkYXRlTGFzdFBhZ2VCYWNrQnV0dG9uIiwidXBkYXRlIiwiX3ByZXBhcmVQYWdlQW5kT3B0aW9ucyIsInRpbWVzIiwiX3JlbW92ZVBhZ2VzIiwicG9wVXBkYXRlIiwidW5sb2FkIiwiX3BvcFBhZ2UiLCJfZW1pdFByZVBvcEV2ZW50IiwidXBkYXRlQmFja0J1dHRvbiIsInBvcCIsInBhZ2VIVE1MIiwiX3B1c2hQYWdlIiwibG9hZCIsIl9lbWl0UHJlUHVzaEV2ZW50IiwicGFnZUxlbmd0aCIsIl9yZXBsYWNlUGFnZSIsInJlc29sdmVkVmFsdWUiLCJfbm9ybWFsaXplSW5kZXgiLCJpbnNlcnRQYWdlIiwibmV3UGFnZSIsIl9sYXN0SW5kZXhPZlBhZ2UiLCJwYWdlTmFtZSIsImlzQ2FuY2VsZWQiLCJjdXJyZW50UGFnZSIsImNhbmNlbCIsIl9lbWl0UHJlRXZlbnQiLCJ0ZW1wbGF0ZUhUTUwiLCJsYXN0RWxlbWVudENoaWxkIiwiTmF2aWdhdG9yIiwiVG9vbGJhckVsZW1lbnQiLCJzaWJsaW5nQmFja2dyb3VuZCIsInNpYmxpbmdDb250ZW50Iiwic2V0VmlzaWJpbGl0eSIsIl9lbnN1cmVUb29sYmFySXRlbUVsZW1lbnRzIiwiX2Vuc3VyZVRvb2xiYXJFbGVtZW50IiwiVG9vbGJhciIsIlBhZ2VFbGVtZW50IiwiX2Rlcml2ZUhvb2tzIiwiX2JhY2tncm91bmRFbGVtZW50IiwiX2VsZW1lbnRTaG91bGRCZU1vdmVkIiwiX3RyeVRvRmlsbFN0YXR1c0JhciIsImZpeGVkRWxlbWVudHMiLCJvbkluaXQiLCJiYWNrQnV0dG9uIiwiX29uSW5maW5pdGVTY3JvbGwiLCJfYm91bmRPblNjcm9sbCIsIl9pbmZpbml0ZVNjcm9sbExpbWl0IiwiX29uU2Nyb2xsIiwib3ZlckxpbWl0Iiwic2Nyb2xsSGVpZ2h0IiwiX2xvYWRpbmdDb250ZW50Iiwib25JbmZpbml0ZVNjcm9sbCIsIm9uRGVzdHJveSIsImV2ZW50cyIsImVudW1lcmFibGUiLCJQYWdlIiwiUG9wb3ZlckFuaW1hdG9yIiwicG9wb3ZlciIsImFuaW1hdGlvbnMiLCJfYW5pbWF0ZSIsIm91dCIsImluIiwiTURGYWRlUG9wb3ZlckFuaW1hdG9yIiwiX2FuaW1hdGVBbGwiLCJfcG9wb3ZlciIsIklPU0ZhZGVQb3BvdmVyQW5pbWF0b3IiLCJwb3NpdGlvbnMiLCJ1cCIsImRvd24iLCJQb3BvdmVyRWxlbWVudCIsIl9jdXJyZW50VGFyZ2V0IiwiX3Bvc2l0aW9uUG9wb3ZlciIsIl9jbGVhclN0eWxlcyIsInJhZGl1cyIsIl9yYWRpdXMiLCJjb250ZW50RWxlbWVudCIsIl9jb250ZW50IiwibWFyZ2luIiwiX21hcmdpbiIsInRhcmdldFJlY3QiLCJpc01EIiwiY292ZXIiLCJwYXJlbnREaW1lbnNpb25zIiwibWF4UG9zaXRpb25zIiwidGFyZ2V0RGlzdGFuY2UiLCJ0YXJnZXRDZW50ZXJEaXN0YW5jZUZyb20iLCJfY2FsY3VsYXRlRGlyZWN0aW9ucyIsInByaW1hcnlEaXJlY3Rpb24iLCJwcmltYXJ5Iiwic2Vjb25kYXJ5RGlyZWN0aW9uIiwic2Vjb25kYXJ5IiwiX2N1cnJlbnREaXJlY3Rpb24iLCJzaXplTmFtZSIsImNvbnRlbnRTaXplIiwidGFyZ2V0QW5kQXJyb3dMZW5ndGgiLCJwcmltYXJ5T2Zmc2V0Iiwic2Vjb25kYXJ5T2Zmc2V0IiwiX2Fycm93IiwiaGFzRGVmYXVsdENvbnRhaW5lciIsImFycm93IiwiUG9wb3ZlciIsIklOREVUIiwiUHJvZ3Jlc3NCYXJFbGVtZW50IiwiX2lzQ29tcGlsZWQiLCJjbG9uZU5vZGUiLCJfcHJpbWFyeSIsIl9zZWNvbmRhcnkiLCJfdXBkYXRlRGV0ZXJtaW5hdGUiLCJfdXBkYXRlVmFsdWUiLCJiYXJFbGVtZW50IiwiUHJvZ3Jlc3NCYXIiLCJQcm9ncmVzc0NpcmN1bGFyRWxlbWVudCIsInBlciIsInN2ZyIsIlByb2dyZXNzQ2lyY3VsYXIiLCJTVEFURV9JTklUSUFMIiwiU1RBVEVfUFJFQUNUSU9OIiwiU1RBVEVfQUNUSU9OIiwidGhyb3dUeXBlIiwiUHVsbEhvb2tFbGVtZW50IiwiX29uRHJhZ0VuZCIsIl9zZXRTdGF0ZSIsIl9jb25uZWN0T25QdWxsIiwiX2Rpc2Nvbm5lY3RPblB1bGwiLCJsaW5lSGVpZ2h0IiwiX3BhZ2VFbGVtZW50IiwidGFwWSIsIm1heFkiLCJkcmFnZ2FibGVBcmVhUmF0aW8iLCJfc3RhcnRTY3JvbGwiLCJfY3VycmVudFRyYW5zbGF0aW9uIiwidGgiLCJ0aHJlc2hvbGRIZWlnaHQiLCJfZmluaXNoIiwiX3RyYW5zbGF0ZVRvIiwiX29uQWN0aW9uIiwib25BY3Rpb24iLCJub0V2ZW50IiwibGFzdFN0YXRlIiwicHVsbEhvb2siLCJtYXJnaW5Ub3AiLCJzY3JvbGxFbGVtZW50IiwiX2RyYWdMb2NrRGlzYWJsZWQiLCJzY3JvbGxUb2dnbGUiLCJnZFRvZ2dsZSIsIl9zZXRTdHlsZSIsIlB1bGxIb29rIiwiYWN0aXZlQ2xhc3NUb2tlbiIsIlJhbmdlRWxlbWVudCIsIl9vbk1vdXNlRG93biIsIl9vbk1vdXNlVXAiLCJfb25Ub3VjaFN0YXJ0IiwiX29uVG91Y2hFbmQiLCJfb25JbnB1dCIsIl9vbkRyYWdzdGFydCIsIl9vbkRyYWdlbmQiLCJfdXBkYXRlRGlzYWJsZWQiLCJmb2N1c1JpbmciLCJfZm9jdXNSaW5nIiwiYmFja2dyb3VuZFNpemUiLCJfcmF0aW8iLCJvYnNlcnZlZEF0dHJpYnV0ZXMiLCJSYW5nZSIsIlJvd0VsZW1lbnQiLCJSb3ciLCJTZWdtZW50RWxlbWVudCIsIl9zZWdtZW50SWQiLCJfdGFiYmFyIiwiX29uVGFiYmFyUHJlQ2hhbmdlIiwiZ2V0QWN0aXZlVGFiSW5kZXgiLCJnZXRBY3RpdmVCdXR0b25JbmRleCIsIl9zZXRDaGVja2VkIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJzZXRBY3RpdmVUYWIiLCJfcG9zdENoYW5nZSIsInNlZ21lbnRJdGVtIiwic2V0QWN0aXZlQnV0dG9uIiwiU2VnbWVudCIsIlNlbGVjdEVsZW1lbnQiLCJfZGVyaXZlR2V0dGVycyIsIl9zZWxlY3QiLCJzZWwiLCJvcHRpb24iLCJTZWxlY3QiLCJTcGVlZERpYWxJdGVtRWxlbWVudCIsIlNwZWVkRGlhbEl0ZW0iLCJTcGVlZERpYWxFbGVtZW50IiwiX3VwZGF0ZURpcmVjdGlvbiIsIl9pZ25vcmVPcGVuU2lkZUVmZmVjdCIsIl91cGRhdGVPcGVuIiwidG9nZ2xlSXRlbXMiLCJpbmxpbmUiLCJfZmFiIiwiaXRlbXMiLCJ0cmFuc2l0aW9uRGVsYXkiLCJfZ2V0VHJhbnNsYXRlIiwiaGlkZUl0ZW1zIiwidG90YWxEZWxheSIsInNob3dJdGVtcyIsIlNwZWVkRGlhbCIsIlNwbGl0dGVyQ29udGVudEVsZW1lbnQiLCJvbGRDb250ZW50IiwiU3BsaXR0ZXJDb250ZW50IiwiU3BsaXR0ZXJNYXNrRWxlbWVudCIsIl9zaWRlcyIsInNpZGUiLCJtb2RlIiwib25DbGljayIsImNsb3NlIiwiU3BsaXR0ZXJNYXNrIiwiU3BsaXR0ZXJBbmltYXRvciIsInNpZGVFbGVtZW50Iiwic3BsaXR0ZXIiLCJfc2lkZSIsIl9vcHBvc2l0ZVNpZGUiLCJjbGVhck1hc2siLCJpc09wZW4iLCJPdmVybGF5U3BsaXR0ZXJBbmltYXRvciIsIm1pbnVzIiwiUHVzaFNwbGl0dGVyQW5pbWF0b3IiLCJzbGlkaW5nRWxlbWVudHMiLCJfc2xpZGluZ0VsZW1lbnRzIiwiX2dldFNsaWRpbmdFbGVtZW50cyIsIlJldmVhbFNwbGl0dGVyQW5pbWF0b3IiLCJfc2V0U3R5bGVzIiwiX3Vuc2V0U3R5bGVzIiwiX2dlbmVyYXRlQmVoaW5kUGFnZVN0eWxlIiwiYmVoaW5kRGlzdGFuY2UiLCJiZWhpbmRUcmFuc2Zvcm0iLCJfZ2V0TWF4V2lkdGgiLCJtZW51U3R5bGUiLCJvdmVybGF5IiwicmV2ZWFsIiwiU3BsaXR0ZXJFbGVtZW50IiwiX29uTW9kZUNoYW5nZSIsIl9sYXlvdXQiLCJfZ2V0U2lkZSIsIlNwbGl0dGVyIiwiU1BMSVRfTU9ERSIsIkNPTExBUFNFX01PREUiLCJDTE9TRURfU1RBVEUiLCJPUEVOX1NUQVRFIiwiQ0hBTkdJTkdfU1RBVEUiLCJzcGxpdHRlclNpZGVFbGVtZW50IiwiQ29sbGFwc2VEZXRlY3Rpb24iLCJjaGFuZ2VUYXJnZXQiLCJfdGFyZ2V0IiwiX29yaWVudGF0aW9uIiwiYWN0aXZhdGUiLCJfdXBkYXRlTW9kZSIsIl9tYXRjaCIsIl9xdWVyeVJlc3VsdCIsIm1hdGNoTWVkaWEiLCJhZGRMaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwiU3BsaXR0ZXJTaWRlRWxlbWVudCIsIl9zdGF0ZSIsIl9sb2NrIiwiX2NvbGxhcHNlRGV0ZWN0aW9uIiwiX2FuaW1hdGlvbk9wdCIsImNsb3NlZCIsInZhbGlkRHJhZyIsIl9tb2RlIiwiX2lzT3RoZXJTaWRlT3BlbiIsInRpaHMiLCJkZWFjdGl2YXRlIiwidXBkYXRlT3B0aW9ucyIsIkZJTkFMX1NUQVRFIiwiX2VtaXRFdmVudCIsIlNwbGl0dGVyU2lkZSIsImxvY2F0aW9ucyIsIm1hdGVyaWFsIiwiU3dpdGNoRWxlbWVudCIsIl9sYXN0VGltZVN0YW1wIiwiX2xvY2F0aW9ucyIsIl9zdGFydFgiLCJzd2l0Y2giLCJpc0ludGVyYWN0aXZlIiwiX2VtaXRDaGFuZ2VFdmVudCIsImRlZmF1bHRFbGVtZW50Q2xhc3MiLCJfaGFuZGxlIiwiX2dldFBvc2l0aW9uIiwicHJldmlvdXNWYWx1ZSIsImNsaWNrIiwiU3dpdGNoIiwidGFiYmFyRWxlbWVudCIsImxlcnAiLCJ4MCIsIngxIiwidCIsIlRhYmJhckVsZW1lbnQiLCJfbG9hZEluYWN0aXZlIiwiX2dldEF1dG9TY3JvbGxSYXRpbyIsIl90YWJiYXJCb3JkZXIiLCJfdGFiYmFyRWxlbWVudCIsIl91cGRhdGVWaXNpYmlsaXR5IiwiX3RhYnNSZWN0IiwidGFiSXRlbSIsInRhYnMiLCJfbm9ybWFsaXplRXZlbnQiLCJzZXRBY3RpdmUiLCJwcmV2VGFiIiwiX2F1dG9ncm93IiwidGFiIiwidGFiYmFyIiwiY3MiLCJmaWxsZWQiLCJfdGFyZ2V0RWxlbWVudCIsIm5leHRJbmRleCIsInByZXZpb3VzSW5kZXgiLCJfYWN0aXZlSW5kZXhTa2lwRWZmZWN0IiwiX3VwZGF0ZUFjdGl2ZUluZGV4IiwicHJldkluZGV4IiwibmV4dFRhYiIsImhpZGVUYWJzIiwiaXNBY3RpdmUiLCJpc1RvcCIsIlRhYmJhciIsIlRhYkVsZW1lbnQiLCJfYnV0dG9uIiwiX3VwZGF0ZUJ1dHRvbkNvbnRlbnQiLCJpY29uV3JhcHBlciIsImZpeCIsImFjdGl2ZSIsIl9oYXNMb2FkZWQiLCJfbG9hZGVkUGFnZSIsInBhZ2VUYXJnZXQiLCJwYXJlbnRUYXJnZXQiLCJkdW1teVBhZ2UiLCJfbG9hZFBhZ2VFbGVtZW50IiwiVGFiIiwiVG9hc3RBbmltYXRvciIsIkZhZGVUb2FzdEFuaW1hdG9yIiwiQXNjZW5kVG9hc3RBbmltYXRvciIsIm1lc3NhZ2VEZWxheSIsImFzY2Vuc2lvbiIsIl9nZXRGYWJzIiwiZmFiIiwiTGlmdFRvYXN0QW5pbWF0b3IiLCJGYWxsVG9hc3RBbmltYXRvciIsImZhbGxBbW91bnQiLCJjbGVhblVwIiwiY29ycmVjdFRvcCIsIlRvYXN0RWxlbWVudCIsIm1lc3NhZ2VDbGFzc05hbWUiLCJidXR0b25DbGFzc05hbWUiLCJUb2FzdCIsIlRvb2xiYXJCdXR0b25FbGVtZW50IiwiVG9vbGJhckJ1dHRvbiIsIl9zdXBlclNlY3JldE9ucyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFBQTtFQUNBO0FBQ0E7RUFDQTtFQUNBO0VBQ0E7QUFDQTtFQUNBO0FBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0FBQ0E7RUFDQTtFQUVBO0VBQ0EsSUFBTUEsaUJBQWlCLEdBQUdDLE1BQU0sQ0FBQ0MsV0FBakMsQ0FBQTtFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztNQUNNQztFQUVKO0VBQ0Y7RUFDQTtFQUNBO0lBQ0UsU0FBYyxRQUFBLEdBQUE7RUFBQSxJQUFBLGVBQUEsQ0FBQSxJQUFBLEVBQUEsUUFBQSxDQUFBLENBQUE7O01BQ1osSUFBS0MsQ0FBQUEsaUJBQUwsR0FBeUIsSUFBekIsQ0FBQTtNQUNBLElB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QUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtF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RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7TUFDcUJhOzs7OztFQUVuQjtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7SUFFRSxTQUFjLGVBQUEsR0FBQTtFQUFBLElBQUEsSUFBQSxLQUFBLENBQUE7O0VBQUEsSUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLGVBQUEsQ0FBQSxDQUFBOztFQUNaLElBQUEsS0FBQSxHQUFBLE1BQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLENBQUE7RUFFQSxJQUFBLEtBQUEsQ0FBS3JXLGdCQUFMLEdBQXdCLEtBQUEsQ0FB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O0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O01BQ3FCSTs7Ozs7RUFFbkI7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFRTtFQUNGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVFO0VBQ0Y7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUU7RUFDRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VB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
|