@quadrel-enterprise-ui/browser-check 1.0.0 → 18.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +19 -6
- package/scripts/browser-check.js +3175 -0
- package/scripts/browser-check.min.js +1 -0
- package/src/browser-check.js +133 -0
- package/src/error-page.html +426 -0
|
@@ -0,0 +1,3175 @@
|
|
|
1
|
+
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.browserCheck = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
|
|
2
|
+
(function (Buffer){(function (){
|
|
3
|
+
const UserAgentParser = require('ua-parser-js');
|
|
4
|
+
|
|
5
|
+
const DEFAULTS = {
|
|
6
|
+
HeadlessChrome: 57,
|
|
7
|
+
'Chrome Headless': 57,
|
|
8
|
+
Chrome: 57,
|
|
9
|
+
Edge: 80,
|
|
10
|
+
Safari: 10,
|
|
11
|
+
'Mobile Safari': 10,
|
|
12
|
+
Firefox: 50,
|
|
13
|
+
IE: false
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
module.exports = function (options) {
|
|
17
|
+
// Load main when DOM ready.
|
|
18
|
+
const oldOnload = window.onload;
|
|
19
|
+
|
|
20
|
+
if (typeof window.onload !== 'function') {
|
|
21
|
+
window.onload = main;
|
|
22
|
+
} else {
|
|
23
|
+
window.onload = function () {
|
|
24
|
+
if (oldOnload) {
|
|
25
|
+
oldOnload();
|
|
26
|
+
}
|
|
27
|
+
main(options);
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
function main(options) {
|
|
33
|
+
const ErrorPageHtml = Buffer("PHN0eWxlPgogIEBpbXBvcnQgdXJsKCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PVJvYm90bzp3Z2h0QDQwMDs3MDAmZGlzcGxheT1zd2FwIik7CgogIC5xZC1mdWxsc2NyZWVuLWluZm8gewogICAgYmFja2dyb3VuZDogcmdiKDIzNywgMjM3LCAyMzcpOwogICAgaGVpZ2h0OiAxMDAlOwogICAgbGVmdDogMDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDA7CiAgICB3aWR0aDogMTAwJTsKICAgIHotaW5kZXg6IDEwMDAwOwogIH0KCiAgI3FkLWVycm9yLXBhZ2Utd3JhcHBlciB7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJTsKICB9CgogICNxZC1lcnJvci1wYWdlLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2IoMjU1LCAyNTUsIDI1NSk7CiAgICBib3JkZXItYm90dG9tOiA1cHggc29saWQgcmdiKDIyMCwgMCwgMjQpOwogICAgaGVpZ2h0OiAxMDVweDsKICAgIGxlZnQ6IDBweDsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMHB4OwogICAgd2lkdGg6IDEwMCU7CiAgfQoKICAjcWQtZXJyb3ItcGFnZS1sb2dvIHsKICAgIGhlaWdodDogMTA1cHg7CiAgICB3aWR0aDogYXV0bzsKICAgIHBhZGRpbmc6IDIwcHg7CiAgfQoKICAjcWQtZXJyb3ItcGFnZS1jb250ZW50LXdyYXBwZXIgewogICAgZGlzcGxheTogdGFibGU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtYXJnaW46IDAgYXV0bzsKICAgIHBhZGRpbmc6IDEwNXB4IDAgNDBweCAwOwogICAgd2lkdGg6IDUwJTsKICB9CgogICNxZC1lcnJvci1wYWdlLWNvbnRlbnQgewogICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgfQoKICAjcWQtZXJyb3ItcGFnZS1mb290ZXIgewogICAgYmFja2dyb3VuZDogcmdiKDI1NSwgMjU1LCAyNTUpOwogICAgYm90dG9tOiAwcHg7CiAgICBoZWlnaHQ6IDQwcHg7CiAgICBsZWZ0OiAwcHg7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB3aWR0aDogMTAwJTsKICB9CgogICNxZC1lcnJvci1wYWdlLWZvb3RlciBzcGFuIHsKICAgIGxpbmUtaGVpZ2h0OiA0MHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbWFyZ2luLWxlZnQ6IDIwcHg7CiAgICBmb250LWZhbWlseTogIlJvYm90byIsIHNhbnMtc2VyaWY7CiAgfQoKICAjcWQtZXJyb3ItcGFnZS1mb290ZXIgdWwgewogICAgY29sb3I6IHJnYigwLCAxMDIsIDE1Myk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogNDBweDsKICAgIG1hcmdpbi10b3A6IDA7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICByaWdodDogMDsKICAgIHRvcDogMDsKICB9CgogICNxZC1lcnJvci1wYWdlLWZvb3RlciBsaSB7CiAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICBtYXJnaW4tcmlnaHQ6IDMwcHg7CiAgfQoKICAjcWQtZXJyb3ItcGFnZS1mb290ZXIgYSB7CiAgICBjb2xvcjogcmdiKDAsIDEwMiwgMTUzKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGZvbnQtZmFtaWx5OiAiUm9ib3RvIiwgc2Fucy1zZXJpZjsKICB9CgogICNxZC1lcnJvci1wYWdlLWZvb3RlciBhOmhvdmVyLAogICNxZC1lcnJvci1wYWdlLWZvb3RlciBhOmFjdGl2ZSwKICAjcWQtZXJyb3ItcGFnZS1mb290ZXIgYTpmb2N1cywKICAjcWQtZXJyb3ItcGFnZS1mb290ZXIgYTp2aXNpdGVkIHsKICAgIGNvbG9yOiByZ2IoMCwgMTAyLCAxNTMpOwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgfQoKICAjcWQtZXJyb3ItcGFnZS1pY29uIHsKICAgIGhlaWdodDogMTAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA2MHB4OwogICAgd2lkdGg6IDExNXB4OwogIH0KCiAgI3FkLWVycm9yLXBhZ2UtY29udGVudCBoMSwKICAjcWQtZXJyb3ItcGFnZS1jb250ZW50IGgzIHsKICAgIGNvbG9yOiByZ2IoMjMsIDIzLCAyMyk7CiAgICBmb250LWZhbWlseTogIlJvYm90byIsIHNhbnMtc2VyaWY7CiAgfQoKICAjcWQtZXJyb3ItcGFnZS1jb250ZW50IGgxIHsKICAgIGZvbnQtc2l6ZTogNTZweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBtYXJnaW46IDM4cHggMDsKICB9CgogICNxZC1lcnJvci1wYWdlLWNvbnRlbnQgaDMgewogICAgZm9udC1zaXplOiAyOHB4OwogICAgZm9udC13ZWlnaHQ6IDMwMDsKICAgIHBhZGRpbmctYm90dG9tOiAzMHB4OwogICAgbWFyZ2luOiAyOHB4IDA7CiAgfQo8L3N0eWxlPgo8ZGl2IGlkPSJxZC1lcnJvci1wYWdlLXdyYXBwZXIiPgogIDxkaXYgaWQ9InFkLWVycm9yLXBhZ2UtaGVhZGVyIj4KICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmFkbWluLmNoL2dvdi9kZS9zdGFydC5odG1sIj4KICAgICAgPHN2ZwogICAgICAgIGlkPSJxZC1lcnJvci1wYWdlLWxvZ28iCiAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICAgICAgIHZlcnNpb249IjEuMSIKICAgICAgICB4PSIwcHgiCiAgICAgICAgeT0iMHB4IgogICAgICAgIHZpZXdCb3g9IjguNTEyIDAgMTU1Ljk5IDM4LjM0NyIKICAgICAgICBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDguNTEyIDAgMTU1Ljk5IDM4LjM0NyIKICAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICA+CiAgICAgICAgPGc+CiAgICAgICAgICA8Zz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMzguNDI2LDYuNTM4YzAuMzA5LDAuMTk1LDAuNjY3LDAuMzA4LDEuMTU1LDAuMzA4YzAuNjQ2LDAsMS4xNzgtMC4zMywxLjE3OC0xLjA3M2MwLTEuMDI4LTIuNC0xLjE1Ni0yLjQtMi41MjkgICAgYzAtMC44NCwwLjczNC0xLjM2NiwxLjY1OS0xLjM2NmMwLjI1NSwwLDAuNjY3LDAuMDM4LDEuMDI3LDAuMTcybC0wLjA4MywwLjQ3M2MtMC4yMzEtMC4xMjgtMC42MDEtMC4xOTUtMC45NTMtMC4xOTUgICAgYy0wLjU0LDAtMS4xMzMsMC4yMjUtMS4xMzMsMC45YzAsMS4wNTEsMi40MDEsMS4wNTgsMi40MDEsMi41ODljMCwxLjA1OC0wLjkwOCwxLjQ3OC0xLjcxOCwxLjQ3OCAgICBjLTAuNTExLDAtMC45MDgtMC4xMDUtMS4xODctMC4yMjVMMzguNDI2LDYuNTM4eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNDUuMzQ0LDMuODg4Yy0wLjI1NS0wLjExMi0wLjU2My0wLjE5NS0wLjgxNy0wLjE5NWMtMC45MjMsMC0xLjQ0MSwwLjY2OC0xLjQ0MSwxLjU5OGMwLDAuODcxLDAuNTI1LDEuNTk5LDEuMzg4LDEuNTk5ICAgIGMwLjMwMSwwLDAuNTc4LTAuMDY4LDAuODYzLTAuMTczbDAuMDQ1LDAuNDQzYy0wLjMyMiwwLjExMi0wLjYyMywwLjEzNS0wLjk4MiwwLjEzNWMtMS4yMzEsMC0xLjgzMS0wLjkzOC0xLjgzMS0yLjAwMyAgICBjMC0xLjE3OCwwLjc1OC0yLjAwMywxLjg5MS0yLjAwM2MwLjQ1OCwwLDAuNzg4LDAuMTA1LDAuOTIzLDAuMTVMNDUuMzQ0LDMuODg4eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNDYuNzcsMS41NzdoMC40NzN2Mi40NDZoMC4wMTVjMC4yMDMtMC40MiwwLjYzLTAuNzM1LDEuMTkzLTAuNzM1YzEuMDI4LDAsMS4zMDYsMC42ODMsMS4zMDYsMS42Mjh2Mi4yODloLTAuNDczVjQuOTI0ICAgIGMwLTAuNjYtMC4xMjctMS4yMy0wLjkwOC0xLjIzYy0wLjg0LDAtMS4xMzMsMC43OTUtMS4xMzMsMS40NjN2Mi4wNDhINDYuNzdWMS41Nzd6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik01NS40Niw3LjIwNmgtMC41N2wtMS4wNDMtMy4zMDloLTAuMDE1bC0xLjA0MywzLjMwOWgtMC41N2wtMS4yMjktMy44MjdoMC41MThsMS4wMDUsMy4zMWgwLjAxNmwxLjA2NC0zLjMxaDAuNTcgICAgbDEuMDEzLDMuMzFoMC4wMTZsMS4wNTgtMy4zMWgwLjQ3M0w1NS40Niw3LjIwNnoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTYwLjUxNyw3LjA4NWMtMC4zMywwLjEzNS0wLjc1OSwwLjIxLTEuMTExLDAuMjFjLTEuMjY5LDAtMS43NDEtMC44NTUtMS43NDEtMi4wMDNjMC0xLjE3LDAuNjQ2LTIuMDAzLDEuNjEzLTIuMDAzICAgIGMxLjA4MSwwLDEuNTIyLDAuODcxLDEuNTIyLDEuODk4djAuMjRoLTIuNjE4YzAsMC44MTEsMC40MzYsMS40NjMsMS4yNjEsMS40NjNjMC4zNDUsMCwwLjg0OC0wLjE0MywxLjA3My0wLjI4NUw2MC41MTcsNy4wODUgICAgTDYwLjUxNyw3LjA4NXogTTYwLjI4NCw1LjAyMmMwLTAuNjY4LTAuMjcxLTEuMzI4LTAuOTc1LTEuMzI4Yy0wLjY5OCwwLTEuMTI2LDAuNjk4LTEuMTI2LDEuMzI4SDYwLjI4NHoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik02Mi43NiwyLjM1OGgtMC40NzN2LTAuNjNoMC40NzNWMi4zNTh6IE02Mi4yODgsMy4zNzhoMC40NzN2My44MjdoLTAuNDczVjMuMzc4eiIgLz4KICAgICAgICAgICAgPHBhdGggZD0iTTY0LjE4Nyw2LjgwOGwyLjMwNC0zLjAyNGgtMi4yMTRWMy4zNzloMi43NjF2MC40MDVsLTIuMzAzLDMuMDE3aDIuMzAzdjAuNDA1aC0yLjg1MVY2LjgwOHoiIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTcxLjAyMiw3LjA4NWMtMC4zMywwLjEzNS0wLjc1OSwwLjIxLTEuMTExLDAuMjFjLTEuMjY4LDAtMS43NDEtMC44NTUtMS43NDEtMi4wMDNjMC0xLjE3LDAuNjQ2LTIuMDAzLDEuNjEzLTIuMDAzICAgIGMxLjA4MSwwLDEuNTIyLDAuODcxLDEuNTIyLDEuODk4djAuMjRoLTIuNjE4YzAsMC44MTEsMC40MzYsMS40NjMsMS4yNjEsMS40NjNjMC4zNDUsMCwwLjg0OC0wLjE0MywxLjA3My0wLjI4NUw3MS4wMjIsNy4wODUgICAgTDcxLjAyMiw3LjA4NXogTTcwLjc4OSw1LjAyMmMwLTAuNjY4LTAuMjctMS4zMjgtMC45NzUtMS4zMjhjLTAuNjk4LDAtMS4xMjYsMC42OTgtMS4xMjYsMS4zMjhINzAuNzg5eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNzIuNzkzLDQuMjM0YzAtMC40MiwwLTAuNTc4LTAuMDMtMC44NTVoMC40NzR2MC43MzVoMC4wMTVjMC4xNzMtMC40MjcsMC40OTYtMC44MjUsMC45ODMtMC44MjUgICAgYzAuMTExLDAsMC4yNDgsMC4wMjIsMC4zMywwLjA0NXYwLjQ5NmMtMC4wOTktMC4wMy0wLjIyNi0wLjA0NS0wLjM0Ni0wLjA0NWMtMC43NSwwLTAuOTUyLDAuODQxLTAuOTUyLDEuNTMxdjEuODkxaC0wLjQ3NFY0LjIzNHogICAgIgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aCBkPSJNNzYuMzUsMi4zNThoLTAuNDc0di0wLjYzaDAuNDc0VjIuMzU4eiBNNzUuODc3LDMuMzc4aDAuNDc0djMuODI3aC0wLjQ3NFYzLjM3OHoiIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTc3LjgzNiw2LjY1YzAuMjg1LDAuMTQzLDAuNjMsMC4yNCwwLjk5OCwwLjI0YzAuNDUsMCwwLjg0OS0wLjI0OCwwLjg0OS0wLjY4M2MwLTAuOTA4LTEuODM5LTAuNzY1LTEuODM5LTEuODc2ICAgIGMwLTAuNzU4LDAuNjE1LTEuMDQzLDEuMjQ2LTEuMDQzYzAuMjAzLDAsMC42MDgsMC4wNDUsMC45NDUsMC4xNzNMNzkuOTksMy44NzVjLTAuMjQ4LTAuMTEzLTAuNTg1LTAuMTgtMC44NDgtMC4xOCAgICBjLTAuNDg4LDAtMC44MjYsMC4xNS0wLjgyNiwwLjYzOGMwLDAuNzEzLDEuODgzLDAuNjIzLDEuODgzLDEuODc2YzAsMC44MTEtMC43NTgsMS4wODgtMS4zMzUsMS4wODggICAgYy0wLjM2OCwwLTAuNzM1LTAuMDQ1LTEuMDczLTAuMThMNzcuODM2LDYuNjV6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik04NC4xMjMsMy44ODhjLTAuMjU1LTAuMTEyLTAuNTYzLTAuMTk1LTAuODE4LTAuMTk1Yy0wLjkyMywwLTEuNDQsMC42NjgtMS40NCwxLjU5OGMwLDAuODcxLDAuNTI0LDEuNTk5LDEuMzg4LDEuNTk5ICAgIGMwLjMsMCwwLjU3OC0wLjA2OCwwLjg2My0wLjE3M0w4NC4xNiw3LjE2Yy0wLjMyMywwLjExMi0wLjYyMywwLjEzNS0wLjk4MywwLjEzNWMtMS4yMywwLTEuODMxLTAuOTM4LTEuODMxLTIuMDAzICAgIGMwLTEuMTc4LDAuNzU5LTIuMDAzLDEuODkyLTIuMDAzYzAuNDU4LDAsMC43ODgsMC4xMDUsMC45MjMsMC4xNUw4NC4xMjMsMy44ODh6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik04NS41NDksMS41NzdoMC40NzR2Mi40NDZoMC4wMTVjMC4yMDMtMC40MiwwLjYzLTAuNzM1LDEuMTkzLTAuNzM1YzEuMDI3LDAsMS4zMDYsMC42ODMsMS4zMDYsMS42Mjh2Mi4yODloLTAuNDczVjQuOTI0ICAgIGMwLTAuNjYtMC4xMjctMS4yMy0wLjkwOC0xLjIzYy0wLjgzOSwwLTEuMTMyLDAuNzk1LTEuMTMyLDEuNDYzdjIuMDQ4aC0wLjQ3NFYxLjU3N3oiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTkyLjg3Miw3LjA4NWMtMC4zMywwLjEzNS0wLjc1OCwwLjIxLTEuMTExLDAuMjFjLTEuMjY4LDAtMS43NC0wLjg1NS0xLjc0LTIuMDAzYzAtMS4xNywwLjY0Ni0yLjAwMywxLjYxMi0yLjAwMyAgICBjMS4wODEsMCwxLjUyMywwLjg3MSwxLjUyMywxLjg5OHYwLjI0aC0yLjYxOWMwLDAuODExLDAuNDM3LDEuNDYzLDEuMjYxLDEuNDYzYzAuMzQ2LDAsMC44NDktMC4xNDMsMS4wNzMtMC4yODVMOTIuODcyLDcuMDg1ICAgIEw5Mi44NzIsNy4wODV6IE05Mi42MzksNS4wMjJjMC0wLjY2OC0wLjI3LTEuMzI4LTAuOTc1LTEuMzI4Yy0wLjY5OCwwLTEuMTI2LDAuNjk4LTEuMTI2LDEuMzI4SDkyLjYzOXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik05Ny4xNDIsMS45NjdoMi41NjV2MC40NWgtMi4wNDh2MS44NjloMS45NDN2MC40NWgtMS45NDN2Mi4wMTloMi4xMzl2MC40NWgtMi42NTZWMS45Njd6IiAvPgogICAgICAgICAgICA8cGF0aCBkPSJNMTAxLjksMi4zNThoLTAuNDc0di0wLjYzaDAuNDc0VjIuMzU4eiBNMTAxLjQyNiwzLjM3OGgwLjQ3NHYzLjgyN2gtMC40NzRWMy4zNzh6IiAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xMDYuNzA5LDcuMjA2aC0wLjQ3M1Y2LjU5N2gtMC4wMTZjLTAuMjU1LDAuNDg4LTAuNjQ2LDAuNjk4LTEuMTkyLDAuNjk4Yy0xLjA1LDAtMS41NzYtMC44Ny0xLjU3Ni0yLjAwMyAgICBjMC0xLjE2MywwLjQ1LTIuMDAzLDEuNTc2LTIuMDAzYzAuNzUsMCwxLjEyNSwwLjU0OCwxLjE5MiwwLjczNWgwLjAxNlYxLjU3OWgwLjQ3M1Y3LjIwNnogTTEwNS4xMDQsNi44OSAgICBjMC44NCwwLDEuMTMzLTAuOTAxLDEuMTMzLTEuNTk5YzAtMC42OTgtMC4yOTItMS41OTgtMS4xMzMtMS41OThjLTAuOSwwLTEuMTM0LDAuODU1LTEuMTM0LDEuNTk4ICAgIEMxMDMuOTY5LDYuMDM1LDEwNC4yMDIsNi44OSwxMDUuMTA0LDYuODl6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xMTEuNDY2LDYuODljMCwxLjA2NS0wLjQ3OSwxLjkzNi0xLjc5MywxLjkzNmMtMC41MDMsMC0wLjk2LTAuMTQzLTEuMTU1LTAuMjAzbDAuMDM3LTAuNDczICAgIGMwLjI5MiwwLjE1LDAuNzE0LDAuMjcxLDEuMTI1LDAuMjcxYzEuMjE3LDAsMS4zMjEtMC44ODYsMS4zMjEtMS45NjZoLTAuMDE1Yy0wLjI1NSwwLjU1NS0wLjY3NSwwLjc1LTEuMTYzLDAuNzUgICAgYy0xLjIyMywwLTEuNjEzLTEuMDY1LTEuNjEzLTEuOTE0YzAtMS4xNjMsMC40NS0yLjAwMywxLjU3Ni0yLjAwM2MwLjUxLDAsMC44NCwwLjA2NywxLjE5MywwLjUyNWgwLjAxNVYzLjM3N2gwLjQ3M0wxMTEuNDY2LDYuODkgICAgTDExMS40NjYsNi44OXogTTEwOS44Myw2LjhjMC44NTUsMCwxLjE2My0wLjgxMSwxLjE2My0xLjUwOGMwLTAuOTIzLTAuMjctMS41OTgtMS4xMzMtMS41OThjLTAuOSwwLTEuMTMzLDAuODU1LTEuMTMzLDEuNTk4ICAgIEMxMDguNzI4LDYuMDQyLDEwOS4wMjgsNi44LDEwOS44Myw2Ljh6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xMTUuNzU4LDcuMDg1Yy0wLjMzLDAuMTM1LTAuNzU4LDAuMjEtMS4xMSwwLjIxYy0xLjI2OSwwLTEuNzQxLTAuODU1LTEuNzQxLTIuMDAzYzAtMS4xNywwLjY0Ni0yLjAwMywxLjYxMy0yLjAwMyAgICBjMS4wODEsMCwxLjUyMiwwLjg3MSwxLjUyMiwxLjg5OHYwLjI0aC0yLjYxOWMwLDAuODExLDAuNDM3LDEuNDYzLDEuMjYyLDEuNDYzYzAuMzQ1LDAsMC44NDgtMC4xNDMsMS4wNzItMC4yODVMMTE1Ljc1OCw3LjA4NSAgICBMMTE1Ljc1OCw3LjA4NXogTTExNS41MjYsNS4wMjJjMC0wLjY2OC0wLjI3MS0xLjMyOC0wLjk3Ni0xLjMyOGMtMC42OTcsMC0xLjEyNiwwLjY5OC0xLjEyNiwxLjMyOEgxMTUuNTI2eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTE3LjUzLDQuMjc5YzAtMC4yOTMsMC0wLjU5My0wLjAzLTAuOTAxaDAuNDU4djAuNjgzaDAuMDE1YzAuMTU3LTAuMzQ1LDAuNDQyLTAuNzczLDEuMjM4LTAuNzczICAgIGMwLjk0NiwwLDEuMzA3LDAuNjMsMS4zMDcsMS40NzF2Mi40NDZoLTAuNDc0VjQuODc5YzAtMC43Mi0wLjI1NS0xLjE4Ni0wLjkwOC0xLjE4NmMtMC44NjIsMC0xLjEzMywwLjc1OC0xLjEzMywxLjM5NnYyLjExNiAgICBoLTAuNDczVjQuMjc5eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTIzLjc4LDMuMjg5YzEuMjM4LDAsMS43ODYsMC45NiwxLjc4NiwyLjAwM3MtMC41NDgsMi4wMDMtMS43ODYsMi4wMDNzLTEuNzg2LTAuOTYtMS43ODYtMi4wMDMgICAgUzEyMi41NDIsMy4yODksMTIzLjc4LDMuMjg5eiBNMTIzLjc4LDYuODljMC44MjYsMCwxLjI2OC0wLjcxMywxLjI2OC0xLjU5OWMwLTAuODg1LTAuNDQxLTEuNTk4LTEuMjY4LTEuNTk4ICAgIGMtMC44MjUsMC0xLjI2OSwwLjcxMy0xLjI2OSwxLjU5OEMxMjIuNTExLDYuMTc3LDEyMi45NTQsNi44OSwxMjMuNzgsNi44OXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTEyNi43NTEsNi42NWMwLjI4NSwwLjE0MywwLjYzLDAuMjQsMC45OTgsMC4yNGMwLjQ1LDAsMC44NDgtMC4yNDgsMC44NDgtMC42ODNjMC0wLjkwOC0xLjgzOC0wLjc2NS0xLjgzOC0xLjg3NiAgICBjMC0wLjc1OCwwLjYxNS0xLjA0MywxLjI0Ni0xLjA0M2MwLjIwMywwLDAuNjA4LDAuMDQ1LDAuOTQ1LDAuMTczbC0wLjA0NSwwLjQxM2MtMC4yNDgtMC4xMTMtMC41ODUtMC4xOC0wLjg0OC0wLjE4ICAgIGMtMC40ODgsMC0wLjgyNiwwLjE1LTAuODI2LDAuNjM4YzAsMC43MTMsMS44ODQsMC42MjMsMS44ODQsMS44NzZjMCwwLjgxMS0wLjc1OCwxLjA4OC0xLjMzNiwxLjA4OCAgICBjLTAuMzY4LDAtMC43MzUtMC4wNDUtMS4wNzMtMC4xOEwxMjYuNzUxLDYuNjV6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xMzAuMjU1LDYuNjVjMC4yODUsMC4xNDMsMC42MywwLjI0LDAuOTk4LDAuMjRjMC40NSwwLDAuODQ5LTAuMjQ4LDAuODQ5LTAuNjgzYzAtMC45MDgtMS44MzktMC43NjUtMS44MzktMS44NzYgICAgYzAtMC43NTgsMC42MTUtMS4wNDMsMS4yNDYtMS4wNDNjMC4yMDMsMCwwLjYwOCwwLjA0NSwwLjk0NSwwLjE3M2wtMC4wNDUsMC40MTNjLTAuMjQ4LTAuMTEzLTAuNTg1LTAuMTgtMC44NDgtMC4xOCAgICBjLTAuNDg4LDAtMC44MjYsMC4xNS0wLjgyNiwwLjYzOGMwLDAuNzEzLDEuODg0LDAuNjIzLDEuODg0LDEuODc2YzAsMC44MTEtMC43NTgsMS4wODgtMS4zMzYsMS4wODggICAgYy0wLjM2OCwwLTAuNzM1LTAuMDQ1LTEuMDczLTAuMThMMTMwLjI1NSw2LjY1eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTM2LjYxOCw3LjA4NWMtMC4zMywwLjEzNS0wLjc1OCwwLjIxLTEuMTExLDAuMjFjLTEuMjY4LDAtMS43NC0wLjg1NS0xLjc0LTIuMDAzYzAtMS4xNywwLjY0Ni0yLjAwMywxLjYxMi0yLjAwMyAgICBjMS4wODEsMCwxLjUyMywwLjg3MSwxLjUyMywxLjg5OHYwLjI0aC0yLjYxOWMwLDAuODExLDAuNDM2LDEuNDYzLDEuMjYxLDEuNDYzYzAuMzQ2LDAsMC44NDktMC4xNDMsMS4wNzMtMC4yODVMMTM2LjYxOCw3LjA4NSAgICBMMTM2LjYxOCw3LjA4NXogTTEzNi4zODUsNS4wMjJjMC0wLjY2OC0wLjI3LTEuMzI4LTAuOTc1LTEuMzI4Yy0wLjY5OCwwLTEuMTI2LDAuNjk4LTEuMTI2LDEuMzI4SDEzNi4zODV6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xMzguMzg5LDQuMjc5YzAtMC4yOTMsMC0wLjU5My0wLjAyOS0wLjkwMWgwLjQ1OHYwLjY4M2gwLjAxNWMwLjE1Ny0wLjM0NSwwLjQ0Mi0wLjc3MywxLjIzOC0wLjc3MyAgICBjMC45NDYsMCwxLjMwNiwwLjYzLDEuMzA2LDEuNDcxdjIuNDQ2aC0wLjQ3M1Y0Ljg3OWMwLTAuNzItMC4yNTUtMS4xODYtMC45MDgtMS4xODZjLTAuODYzLDAtMS4xMzMsMC43NTgtMS4xMzMsMS4zOTZ2Mi4xMTYgICAgaC0wLjQ3NFY0LjI3OUwxMzguMzg5LDQuMjc5eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTQyLjg1NSw2LjY1YzAuMjg0LDAuMTQzLDAuNjMsMC4yNCwwLjk5OCwwLjI0YzAuNDQ5LDAsMC44NDgtMC4yNDgsMC44NDgtMC42ODNjMC0wLjkwOC0xLjgzOC0wLjc2NS0xLjgzOC0xLjg3NiAgICBjMC0wLjc1OCwwLjYxNS0xLjA0MywxLjI0Ni0xLjA0M2MwLjIwMywwLDAuNjA3LDAuMDQ1LDAuOTQ0LDAuMTczbC0wLjA0NSwwLjQxM2MtMC4yNDgtMC4xMTMtMC41ODUtMC4xOC0wLjg0OC0wLjE4ICAgIGMtMC40ODgsMC0wLjgyNiwwLjE1LTAuODI2LDAuNjM4YzAsMC43MTMsMS44ODQsMC42MjMsMS44ODQsMS44NzZjMCwwLjgxMS0wLjc1OCwxLjA4OC0xLjMzNiwxLjA4OCAgICBjLTAuMzY3LDAtMC43MzQtMC4wNDUtMS4wNzItMC4xOEwxNDIuODU1LDYuNjV6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xNDkuMTQzLDMuODg4Yy0wLjI1Ni0wLjExMi0wLjU2My0wLjE5NS0wLjgxOC0wLjE5NWMtMC45MjMsMC0xLjQ0MSwwLjY2OC0xLjQ0MSwxLjU5OGMwLDAuODcxLDAuNTI1LDEuNTk5LDEuMzg5LDEuNTk5ICAgIGMwLjMsMCwwLjU3OC0wLjA2OCwwLjg2Mi0wLjE3M2wwLjA0NSwwLjQ0M2MtMC4zMjIsMC4xMTItMC42MjIsMC4xMzUtMC45ODIsMC4xMzVjLTEuMjMxLDAtMS44MzEtMC45MzgtMS44MzEtMi4wMDMgICAgYzAtMS4xNzgsMC43NTgtMi4wMDMsMS44OTEtMi4wMDNjMC40NTgsMCwwLjc4OCwwLjEwNSwwLjkyMywwLjE1TDE0OS4xNDMsMy44ODh6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xNTAuNTY4LDEuNTc3aDAuNDczdjIuNDQ2aDAuMDE1YzAuMjAzLTAuNDIsMC42MzEtMC43MzUsMS4xOTMtMC43MzVjMS4wMjgsMCwxLjMwNiwwLjY4MywxLjMwNiwxLjYyOHYyLjI4OWgtMC40NzMgICAgVjQuOTI0YzAtMC42Ni0wLjEyOC0xLjIzLTAuOTA4LTEuMjNjLTAuODQsMC0xLjEzMywwLjc5NS0xLjEzMywxLjQ2M3YyLjA0OGgtMC40NzNWMS41NzdMMTUwLjU2OCwxLjU3N3oiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTE1Ny41MjQsNi41OWgtMC4wMTZjLTAuMjEsMC40NTgtMC43NDIsMC43MDUtMS4yMTYsMC43MDVjLTEuMDg4LDAtMS4yNjEtMC43MzUtMS4yNjEtMS4wODEgICAgYzAtMS4yODMsMS4zNjYtMS4zNDMsMi4zNTUtMS4zNDNoMC4wOTFWNC42NzZjMC0wLjY1My0wLjIzMi0wLjk4My0wLjg3LTAuOTgzYy0wLjM5NywwLTAuNzcyLDAuMDktMS4xMjYsMC4zMTVWMy41NSAgICBjMC4yOTMtMC4xNDMsMC43ODgtMC4yNjMsMS4xMjYtMC4yNjNjMC45NDQsMCwxLjM0MywwLjQyOCwxLjM0MywxLjQyNnYxLjY4OWMwLDAuMzA4LDAsMC41NCwwLjAzOCwwLjgwM2gtMC40NjZMMTU3LjUyNCw2LjU5ICAgIEwxNTcuNTI0LDYuNTl6IE0xNTcuNDc5LDUuMjc3aC0wLjEzNmMtMC44MTcsMC0xLjc5MywwLjA4My0xLjc5MywwLjkyM2MwLDAuNTAyLDAuMzU5LDAuNjksMC43OTUsMC42OSAgICBjMS4xMSwwLDEuMTM0LTAuOTY4LDEuMTM0LTEuMzgxVjUuMjc3eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTU5Ljk4NSwzLjc4M2gtMC43NzJWMy4zNzhoMC43NzJWMy4xMDFjMC0wLjgwMywwLjAyOS0xLjYxMywxLjAxNC0xLjYxM2MwLjE0OSwwLDAuMzU0LDAuMDIyLDAuNDQyLDAuMDc1bC0wLjAzLDAuNDEzICAgIGMtMC4wOTgtMC4wNTMtMC4yNC0wLjA4My0wLjM3NS0wLjA4M2MtMC42NDYsMC0wLjU3OCwwLjY5OC0wLjU3OCwxLjE1NXYwLjMzaDAuODYzdjAuNDA1aC0wLjg2M3YzLjQyMmgtMC40NzNWMy43ODN6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xNjQuMzk3LDMuNzgzaC0wLjg3VjYuMjZjMCwwLjM0NSwwLjEyOCwwLjYzLDAuNTExLDAuNjNjMC4xOCwwLDAuMy0wLjAzOCwwLjQzNS0wLjA5bDAuMDMsMC4zOSAgICBjLTAuMTExLDAuMDQ1LTAuMzQ1LDAuMTA1LTAuNTc4LDAuMTA1Yy0wLjg0LDAtMC44Ny0wLjU3OC0wLjg3LTEuMjc1VjMuNzg0aC0wLjc1VjMuMzc5aDAuNzVWMi40NTdsMC40NzQtMC4xNjV2MS4wODhoMC44NyAgICBMMTY0LjM5NywzLjc4M0wxNjQuMzk3LDMuNzgzeiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNDIuMTAzLDEyLjkwM2MtMC4zMy0wLjE3Mi0wLjgwNC0wLjIyNS0xLjE3MS0wLjIyNWMtMS4zNTgsMC0yLjEyNCwwLjk2LTIuMTI0LDIuMjU5YzAsMS4zMiwwLjc0MiwyLjI1OCwyLjEyNCwyLjI1OCAgICBjMC4zNDUsMCwwLjg3LTAuMDQ1LDEuMTcxLTAuMjI1bDAuMDI5LDAuNDVjLTAuMjg1LDAuMTczLTAuODcsMC4yMjUtMS4yLDAuMjI1Yy0xLjY1MSwwLTIuNjQyLTEuMDg4LTIuNjQyLTIuNzA4ICAgIGMwLTEuNTkxLDEuMDIxLTIuNzA5LDIuNjQyLTIuNzA5YzAuMzA4LDAsMC45MzEsMC4wNTMsMS4yLDAuMTk1TDQyLjEwMywxMi45MDN6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik00NS4zNTIsMTMuNjM4YzEuMjM3LDAsMS43ODUsMC45NiwxLjc4NSwyLjAwM3MtMC41NDgsMi4wMDMtMS43ODUsMi4wMDNjLTEuMjM4LDAtMS43ODYtMC45Ni0xLjc4Ni0yLjAwMyAgICBTNDQuMTE0LDEzLjYzOCw0NS4zNTIsMTMuNjM4eiBNNDUuMzUyLDE3LjI0YzAuODI1LDAsMS4yNjgtMC43MTMsMS4yNjgtMS41OTljMC0wLjg4NS0wLjQ0Mi0xLjU5OC0xLjI2OC0xLjU5OCAgICBzLTEuMjY5LDAuNzEzLTEuMjY5LDEuNTk4QzQ0LjA4NCwxNi41MjcsNDQuNTI3LDE3LjI0LDQ1LjM1MiwxNy4yNHoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTQ4LjYxNiwxNC42MjljMC0wLjI5MywwLTAuNTkzLTAuMDMtMC45MDFoMC40NTh2MC42ODNoMC4wMTZjMC4xNTYtMC4zNDUsMC40NDEtMC43NzMsMS4yMzctMC43NzMgICAgYzAuOTQ2LDAsMS4zMDcsMC42MywxLjMwNywxLjQ3MXYyLjQ0Nkg1MS4xM3YtMi4zMjZjMC0wLjcyLTAuMjU1LTEuMTg2LTAuOTA4LTEuMTg2Yy0wLjg2MiwwLTEuMTMzLDAuNzU4LTEuMTMzLDEuMzk2djIuMTE2ICAgIGgtMC40NzNWMTQuNjI5eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNTMuNjk2LDE0LjEzM2gtMC43NzN2LTAuNDA1aDAuNzczdi0wLjI3N2MwLTAuODAzLDAuMDMtMS42MTMsMS4wMTMtMS42MTNjMC4xNSwwLDAuMzU0LDAuMDIyLDAuNDQzLDAuMDc1bC0wLjAzLDAuNDEzICAgIGMtMC4wOTgtMC4wNTMtMC4yNC0wLjA4My0wLjM3NS0wLjA4M2MtMC42NDUsMC0wLjU3OCwwLjY5OC0wLjU3OCwxLjE1NXYwLjMzaDAuODYzdjAuNDA1aC0wLjg2M3YzLjQyMmgtMC40NzNWMTQuMTMzeiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNTkuMDI0LDE3LjQzNmMtMC4zMywwLjEzNS0wLjc1OCwwLjIxLTEuMTExLDAuMjFjLTEuMjY4LDAtMS43NDEtMC44NTUtMS43NDEtMi4wMDNjMC0xLjE3LDAuNjQ2LTIuMDAzLDEuNjEzLTIuMDAzICAgIGMxLjA4MSwwLDEuNTIzLDAuODcxLDEuNTIzLDEuODk4djAuMjRoLTIuNjE5YzAsMC44MTEsMC40MzYsMS40NjMsMS4yNjEsMS40NjNjMC4zNDUsMCwwLjg0OC0wLjE0MywxLjA3My0wLjI4NUw1OS4wMjQsMTcuNDM2ICAgIEw1OS4wMjQsMTcuNDM2eiBNNTguNzkxLDE1LjM3M2MwLTAuNjY4LTAuMjctMS4zMjgtMC45NzUtMS4zMjhjLTAuNjk4LDAtMS4xMjYsMC42OTgtMS4xMjYsMS4zMjhINTguNzkxeiBNNTguMDA0LDEyLjI1aDAuNTkzICAgIGwtMC45NDQsMS4wODFoLTAuMzQ1TDU4LjAwNCwxMi4yNXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTYzLjgyNiwxNy41NTVoLTAuNDczdi0wLjYwOGgtMC4wMTZjLTAuMjU1LDAuNDg4LTAuNjQ2LDAuNjk4LTEuMTkyLDAuNjk4Yy0xLjA1MSwwLTEuNTc2LTAuODctMS41NzYtMi4wMDMgICAgYzAtMS4xNjMsMC40NS0yLjAwMywxLjU3Ni0yLjAwM2MwLjc1LDAsMS4xMjUsMC41NDgsMS4xOTIsMC43MzVoMC4wMTZ2LTIuNDQ2aDAuNDczVjE3LjU1NXogTTYyLjIxOSwxNy4yNCAgICBjMC44NDEsMCwxLjEzNC0wLjkwMSwxLjEzNC0xLjU5OWMwLTAuNjk4LTAuMjkyLTEuNTk4LTEuMTM0LTEuNTk4Yy0wLjg5OSwwLTEuMTMzLDAuODU1LTEuMTMzLDEuNTk4ICAgIEM2MS4wODcsMTYuMzg1LDYxLjMyLDE3LjI0LDYyLjIxOSwxNy4yNHoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTY4LjExOCwxNy40MzZjLTAuMzMsMC4xMzUtMC43NTgsMC4yMS0xLjExMSwwLjIxYy0xLjI2OCwwLTEuNzQtMC44NTUtMS43NC0yLjAwM2MwLTEuMTcsMC42NDYtMi4wMDMsMS42MTItMi4wMDMgICAgYzEuMDgxLDAsMS41MjMsMC44NzEsMS41MjMsMS44OTh2MC4yNGgtMi42MTljMCwwLjgxMSwwLjQzNiwxLjQ2MywxLjI2MSwxLjQ2M2MwLjM0NSwwLDAuODQ5LTAuMTQzLDEuMDczLTAuMjg1TDY4LjExOCwxNy40MzYgICAgTDY4LjExOCwxNy40MzZ6IE02Ny44ODUsMTUuMzczYzAtMC42NjgtMC4yNy0xLjMyOC0wLjk3NS0xLjMyOGMtMC42OTgsMC0xLjEyNiwwLjY5OC0xLjEyNiwxLjMyOEg2Ny44ODV6IE02Ny4wOTcsMTIuMjVoMC41OTQgICAgbC0wLjk0NiwxLjA4MUg2Ni40TDY3LjA5NywxMi4yNXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTY5Ljg4OCwxNC41ODRjMC0wLjQyLDAtMC41NzgtMC4wMjktMC44NTVoMC40NzN2MC43MzZoMC4wMTVjMC4xNzQtMC40MjgsMC40OTYtMC44MjYsMC45ODMtMC44MjYgICAgYzAuMTEyLDAsMC4yNDgsMC4wMjIsMC4zMywwLjA0NXYwLjQ5NmMtMC4wOTgtMC4wMy0wLjIyNS0wLjA0NS0wLjM0NS0wLjA0NWMtMC43NSwwLTAuOTUzLDAuODQtMC45NTMsMS41MzF2MS44OTFoLTAuNDc0VjE0LjU4NHogICAgIgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik03NS4xNzIsMTYuOTRoLTAuMDE1Yy0wLjIxLDAuNDU4LTAuNzQzLDAuNzA1LTEuMjE2LDAuNzA1Yy0xLjA4OCwwLTEuMjYxLTAuNzM1LTEuMjYxLTEuMDgxICAgIGMwLTEuMjgzLDEuMzY2LTEuMzQzLDIuMzU2LTEuMzQzaDAuMDl2LTAuMTk1YzAtMC42NTMtMC4yMzItMC45ODMtMC44NzEtMC45ODNjLTAuMzk3LDAtMC43NzIsMC4wOS0xLjEyNSwwLjMxNVYxMy45ICAgIGMwLjI5Mi0wLjE0MywwLjc4OC0wLjI2MywxLjEyNS0wLjI2M2MwLjk0NSwwLDEuMzQ0LDAuNDI4LDEuMzQ0LDEuNDI2djEuNjg4YzAsMC4zMDgsMCwwLjU0LDAuMDM3LDAuODAzaC0wLjQ2NVYxNi45NHogICAgIE03NS4xMjcsMTUuNjI3aC0wLjEzNWMtMC44MTgsMC0xLjc5MywwLjA4My0xLjc5MywwLjkyM2MwLDAuNTAyLDAuMzYsMC42OSwwLjc5NSwwLjY5YzEuMTEsMCwxLjEzMy0wLjk2OCwxLjEzMy0xLjM4MVYxNS42Mjd6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik03OC45NjEsMTQuMTMzSDc4LjA5djIuNDc3YzAsMC4zNDUsMC4xMjgsMC42MywwLjUxMSwwLjYzYzAuMTgsMCwwLjMtMC4wMzgsMC40MzYtMC4wOWwwLjAzLDAuMzkgICAgYy0wLjExMiwwLjA0NS0wLjM0NiwwLjEwNS0wLjU3OCwwLjEwNWMtMC44NCwwLTAuODcxLTAuNTc4LTAuODcxLTEuMjc1di0yLjIzNmgtMC43NXYtMC40MDVoMC43NXYtMC45MjNsMC40NzMtMC4xNjV2MS4wODhoMC44NzEgICAgVjE0LjEzM3oiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik04MC44NjcsMTIuNzA4aC0wLjQ3M3YtMC42M2gwLjQ3M1YxMi43MDh6IE04MC4zOTQsMTMuNzI5aDAuNDczdjMuODI3aC0wLjQ3M1YxMy43Mjl6IiAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik04NC4xMzcsMTMuNjM4YzEuMjM4LDAsMS43ODYsMC45NiwxLjc4NiwyLjAwM3MtMC41NDgsMi4wMDMtMS43ODYsMi4wMDNjLTEuMjM3LDAtMS43ODUtMC45Ni0xLjc4NS0yLjAwMyAgICBTODIuOSwxMy42MzgsODQuMTM3LDEzLjYzOHogTTg0LjEzNywxNy4yNGMwLjgyNiwwLDEuMjY5LTAuNzEzLDEuMjY5LTEuNTk5YzAtMC44ODUtMC40NDItMS41OTgtMS4yNjktMS41OTggICAgYy0wLjgyNCwwLTEuMjY4LDAuNzEzLTEuMjY4LDEuNTk4QzgyLjg3LDE2LjUyNyw4My4zMTMsMTcuMjQsODQuMTM3LDE3LjI0eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNODcuNDAyLDE0LjYyOWMwLTAuMjkzLDAtMC41OTMtMC4wMy0wLjkwMWgwLjQ1OHYwLjY4M2gwLjAxNWMwLjE1Ny0wLjM0NSwwLjQ0Mi0wLjc3MywxLjIzOC0wLjc3MyAgICBjMC45NDYsMCwxLjMwNiwwLjYzLDEuMzA2LDEuNDcxdjIuNDQ2aC0wLjQ3M3YtMi4zMjZjMC0wLjcyLTAuMjU1LTEuMTg2LTAuOTA4LTEuMTg2Yy0wLjg2MiwwLTEuMTMzLDAuNzU4LTEuMTMzLDEuMzk2djIuMTE2ICAgIGgtMC40NzNWMTQuNjI5eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNOTQuNDYzLDE3YzAuMjg1LDAuMTQzLDAuNjMsMC4yNCwwLjk5OCwwLjI0YzAuNDUsMCwwLjg0OS0wLjI0OCwwLjg0OS0wLjY4M2MwLTAuOTA4LTEuODM5LTAuNzY1LTEuODM5LTEuODc2ICAgIGMwLTAuNzU4LDAuNjE1LTEuMDQzLDEuMjQ2LTEuMDQzYzAuMjAzLDAsMC42MDgsMC4wNDUsMC45NDUsMC4xNzJsLTAuMDQ1LDAuNDEzYy0wLjI0OC0wLjExMy0wLjU4NS0wLjE4LTAuODQ4LTAuMTggICAgYy0wLjQ4OCwwLTAuODI2LDAuMTUtMC44MjYsMC42MzhjMCwwLjcxMywxLjg4NCwwLjYyMywxLjg4NCwxLjg3NmMwLDAuODExLTAuNzU4LDEuMDg4LTEuMzM2LDEuMDg4ICAgIGMtMC4zNjgsMC0wLjczNS0wLjA0NS0xLjA3My0wLjE4TDk0LjQ2MywxN3oiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTEwMS4yNDYsMTYuNjU1YzAsMC4yOTIsMCwwLjU5MywwLjAzLDAuOWgtMC40NTh2LTAuNjgzaC0wLjAxNmMtMC4xNTcsMC4zNDUtMC40NDIsMC43NzItMS4yMzcsMC43NzIgICAgYy0wLjk0NSwwLTEuMzA3LTAuNjMtMS4zMDctMS40NzF2LTIuNDQ2aDAuNDc0djIuMzI2YzAsMC43MjEsMC4yNTUsMS4xODYsMC45MDgsMS4xODZjMC44NjIsMCwxLjEzMy0wLjc1OCwxLjEzMy0xLjM5NnYtMi4xMTYgICAgaDAuNDczVjE2LjY1NXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDMuNDksMTIuNzA4aC0wLjQ3M3YtMC42M2gwLjQ3M1YxMi43MDh6IE0xMDMuMDE4LDEzLjcyOWgwLjQ3M3YzLjgyN2gtMC40NzNWMTMuNzI5eiIgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTA0Ljk3NiwxN2MwLjI4NCwwLjE0MywwLjYzLDAuMjQsMC45OTgsMC4yNGMwLjQ0OSwwLDAuODQ4LTAuMjQ4LDAuODQ4LTAuNjgzYzAtMC45MDgtMS44MzgtMC43NjUtMS44MzgtMS44NzYgICAgYzAtMC43NTgsMC42MTUtMS4wNDMsMS4yNDYtMS4wNDNjMC4yMDMsMCwwLjYwNywwLjA0NSwwLjk0NCwwLjE3MmwtMC4wNDUsMC40MTNjLTAuMjQ4LTAuMTEzLTAuNTg1LTAuMTgtMC44NDgtMC4xOCAgICBjLTAuNDg4LDAtMC44MjYsMC4xNS0wLjgyNiwwLjYzOGMwLDAuNzEzLDEuODgzLDAuNjIzLDEuODgzLDEuODc2YzAsMC44MTEtMC43NTgsMS4wODgtMS4zMzUsMS4wODggICAgYy0wLjM2OCwwLTAuNzM0LTAuMDQ1LTEuMDczLTAuMThMMTA0Ljk3NiwxN3oiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTEwOC40ODEsMTdjMC4yODUsMC4xNDMsMC42MywwLjI0LDAuOTk4LDAuMjRjMC40NDksMCwwLjg0OC0wLjI0OCwwLjg0OC0wLjY4M2MwLTAuOTA4LTEuODM4LTAuNzY1LTEuODM4LTEuODc2ICAgIGMwLTAuNzU4LDAuNjE1LTEuMDQzLDEuMjQ2LTEuMDQzYzAuMjAzLDAsMC42MDcsMC4wNDUsMC45NDQsMC4xNzJsLTAuMDQ1LDAuNDEzYy0wLjI0OC0wLjExMy0wLjU4NS0wLjE4LTAuODQ4LTAuMTggICAgYy0wLjQ4OCwwLTAuODI2LDAuMTUtMC44MjYsMC42MzhjMCwwLjcxMywxLjg4NCwwLjYyMywxLjg4NCwxLjg3NmMwLDAuODExLTAuNzU4LDEuMDg4LTEuMzM2LDEuMDg4ICAgIGMtMC4zNjcsMC0wLjczNC0wLjA0NS0xLjA3Mi0wLjE4TDEwOC40ODEsMTd6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xMTQuODQyLDE3LjQzNmMtMC4zMywwLjEzNS0wLjc1OCwwLjIxLTEuMTEsMC4yMWMtMS4yNjksMC0xLjc0MS0wLjg1NS0xLjc0MS0yLjAwM2MwLTEuMTcsMC42NDYtMi4wMDMsMS42MTMtMi4wMDMgICAgYzEuMDgxLDAsMS41MjIsMC44NzEsMS41MjIsMS44OTh2MC4yNGgtMi42MTljMCwwLjgxMSwwLjQzNywxLjQ2MywxLjI2MiwxLjQ2M2MwLjM0NSwwLDAuODQ4LTAuMTQzLDEuMDcyLTAuMjg1TDExNC44NDIsMTcuNDM2ICAgIEwxMTQuODQyLDE3LjQzNnogTTExNC42MSwxNS4zNzNjMC0wLjY2OC0wLjI3MS0xLjMyOC0wLjk3Ni0xLjMyOGMtMC42OTcsMC0xLjEyNiwwLjY5OC0xLjEyNiwxLjMyOEgxMTQuNjF6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik00Mi4xMDMsMjMuMjUzYy0wLjMzLTAuMTcyLTAuODA0LTAuMjI1LTEuMTcxLTAuMjI1Yy0xLjM1OCwwLTIuMTI0LDAuOTYtMi4xMjQsMi4yNmMwLDEuMzE5LDAuNzQyLDIuMjU4LDIuMTI0LDIuMjU4ICAgIGMwLjM0NSwwLDAuODctMC4wNDUsMS4xNzEtMC4yMjZsMC4wMjksMC40NWMtMC4yODUsMC4xNzMtMC44NywwLjIyNS0xLjIsMC4yMjVjLTEuNjUxLDAtMi42NDItMS4wODgtMi42NDItMi43MDcgICAgYzAtMS41OTIsMS4wMjEtMi43MDksMi42NDItMi43MDljMC4zMDgsMCwwLjkzMSwwLjA1MSwxLjIsMC4xOTRMNDIuMTAzLDIzLjI1M3oiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTQ1LjM1MiwyMy45ODhjMS4yMzcsMCwxLjc4NSwwLjk2LDEuNzg1LDIuMDAzcy0wLjU0OCwyLjAwMy0xLjc4NSwyLjAwM2MtMS4yMzgsMC0xLjc4Ni0wLjk2LTEuNzg2LTIuMDAzICAgIFM0NC4xMTQsMjMuOTg4LDQ1LjM1MiwyMy45ODh6IE00NS4zNTIsMjcuNTkxYzAuODI1LDAsMS4yNjgtMC43MTMsMS4yNjgtMS42YzAtMC44ODUtMC40NDItMS41OTgtMS4yNjgtMS41OTggICAgcy0xLjI2OSwwLjcxMy0xLjI2OSwxLjU5OEM0NC4wODQsMjYuODc4LDQ0LjUyNywyNy41OTEsNDUuMzUyLDI3LjU5MXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTQ4LjYxNiwyNC45NzljMC0wLjI5MywwLTAuNTk0LTAuMDMtMC45aDAuNDU4djAuNjgyaDAuMDE2YzAuMTU2LTAuMzQ0LDAuNDQxLTAuNzcyLDEuMjM3LTAuNzcyICAgIGMwLjk0NiwwLDEuMzA3LDAuNjMsMS4zMDcsMS40NzJ2Mi40NDVINTEuMTN2LTIuMzI2YzAtMC43Mi0wLjI1NS0xLjE4Ni0wLjkwOC0xLjE4NmMtMC44NjIsMC0xLjEzMywwLjc1OC0xLjEzMywxLjM5NnYyLjExNSAgICBoLTAuNDczVjI0Ljk3OXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTUzLjY5NiwyNC40ODRoLTAuNzczdi0wLjQwNWgwLjc3M3YtMC4yNzdjMC0wLjgwMywwLjAzLTEuNjEyLDEuMDEzLTEuNjEyYzAuMTUsMCwwLjM1NCwwLjAyMiwwLjQ0MywwLjA3NWwtMC4wMywwLjQxMiAgICBjLTAuMDk4LTAuMDUzLTAuMjQtMC4wODItMC4zNzUtMC4wODJjLTAuNjQ1LDAtMC41NzgsMC42OTctMC41NzgsMS4xNTR2MC4zM2gwLjg2M3YwLjQwNWgtMC44NjN2My40MjJoLTAuNDczVjI0LjQ4NHoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTU5LjAyNCwyNy43ODVjLTAuMzMsMC4xMzYtMC43NTgsMC4yMS0xLjExMSwwLjIxYy0xLjI2OCwwLTEuNzQxLTAuODU1LTEuNzQxLTIuMDAzYzAtMS4xNywwLjY0Ni0yLjAwMywxLjYxMy0yLjAwMyAgICBjMS4wODEsMCwxLjUyMywwLjg3MSwxLjUyMywxLjg5OHYwLjI0aC0yLjYxOWMwLDAuODExLDAuNDM2LDEuNDYzLDEuMjYxLDEuNDYzYzAuMzQ1LDAsMC44NDgtMC4xNDQsMS4wNzMtMC4yODVMNTkuMDI0LDI3Ljc4NSAgICBMNTkuMDI0LDI3Ljc4NXogTTU4Ljc5MSwyNS43MjJjMC0wLjY2OC0wLjI3LTEuMzI3LTAuOTc1LTEuMzI3Yy0wLjY5OCwwLTEuMTI2LDAuNjk4LTEuMTI2LDEuMzI3SDU4Ljc5MXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTYzLjgyNiwyNy45MDVoLTAuNDczdi0wLjYwN2gtMC4wMTZjLTAuMjU1LDAuNDg3LTAuNjQ2LDAuNjk3LTEuMTkyLDAuNjk3Yy0xLjA1MSwwLTEuNTc2LTAuODY5LTEuNTc2LTIuMDAzICAgIGMwLTEuMTYzLDAuNDUtMi4wMDMsMS41NzYtMi4wMDNjMC43NSwwLDEuMTI1LDAuNTQ5LDEuMTkyLDAuNzM0aDAuMDE2di0yLjQ0NWgwLjQ3M1YyNy45MDV6IE02Mi4yMTksMjcuNTkxICAgIGMwLjg0MSwwLDEuMTM0LTAuOTAxLDEuMTM0LTEuNmMwLTAuNjk3LTAuMjkyLTEuNTk4LTEuMTM0LTEuNTk4Yy0wLjg5OSwwLTEuMTMzLDAuODU1LTEuMTMzLDEuNTk4ICAgIEM2MS4wODcsMjYuNzM1LDYxLjMyLDI3LjU5MSw2Mi4yMTksMjcuNTkxeiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNjguMTE4LDI3Ljc4NWMtMC4zMywwLjEzNi0wLjc1OCwwLjIxLTEuMTExLDAuMjFjLTEuMjY4LDAtMS43NC0wLjg1NS0xLjc0LTIuMDAzYzAtMS4xNywwLjY0Ni0yLjAwMywxLjYxMi0yLjAwMyAgICBjMS4wODEsMCwxLjUyMywwLjg3MSwxLjUyMywxLjg5OHYwLjI0aC0yLjYxOWMwLDAuODExLDAuNDM2LDEuNDYzLDEuMjYxLDEuNDYzYzAuMzQ1LDAsMC44NDktMC4xNDQsMS4wNzMtMC4yODVMNjguMTE4LDI3Ljc4NSAgICBMNjguMTE4LDI3Ljc4NXogTTY3Ljg4NSwyNS43MjJjMC0wLjY2OC0wLjI3LTEuMzI3LTAuOTc1LTEuMzI3Yy0wLjY5OCwwLTEuMTI2LDAuNjk4LTEuMTI2LDEuMzI3SDY3Ljg4NXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTY5Ljg4OCwyNC45MzVjMC0wLjQyLDAtMC41NzgtMC4wMjktMC44NTVoMC40NzN2MC43MzVoMC4wMTVjMC4xNzQtMC40MjcsMC40OTYtMC44MjUsMC45ODMtMC44MjUgICAgYzAuMTEyLDAsMC4yNDgsMC4wMjEsMC4zMywwLjA0NXYwLjQ5NmMtMC4wOTgtMC4wMjktMC4yMjUtMC4wNDUtMC4zNDUtMC4wNDVjLTAuNzUsMC0wLjk1MywwLjg0MS0wLjk1MywxLjUzMXYxLjg5MWgtMC40NzQgICAgVjI0LjkzNXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTc1LjE3MiwyNy4yOWgtMC4wMTVjLTAuMjEsMC40NTktMC43NDMsMC43MDUtMS4yMTYsMC43MDVjLTEuMDg4LDAtMS4yNjEtMC43MzQtMS4yNjEtMS4wOCAgICBjMC0xLjI4MywxLjM2Ni0xLjM0NCwyLjM1Ni0xLjM0NGgwLjA5di0wLjE5NWMwLTAuNjUyLTAuMjMyLTAuOTgyLTAuODcxLTAuOTgyYy0wLjM5NywwLTAuNzcyLDAuMDktMS4xMjUsMC4zMTR2LTAuNDU3ICAgIGMwLjI5Mi0wLjE0NCwwLjc4OC0wLjI2NCwxLjEyNS0wLjI2NGMwLjk0NSwwLDEuMzQ0LDAuNDI4LDEuMzQ0LDEuNDI2djEuNjg4YzAsMC4zMDksMCwwLjU0MSwwLjAzNywwLjgwNGgtMC40NjVWMjcuMjl6ICAgICBNNzUuMTI3LDI1Ljk3OGgtMC4xMzVjLTAuODE4LDAtMS43OTMsMC4wODMtMS43OTMsMC45MjNjMCwwLjUwMiwwLjM2LDAuNjksMC43OTUsMC42OWMxLjExLDAsMS4xMzMtMC45NjksMS4xMzMtMS4zODFWMjUuOTc4eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGggZD0iTTc2Ljk1OCwyNy41MDlsMi4zMDQtMy4wMjRoLTIuMjE0di0wLjQwNWgyLjc2MnYwLjQwNWwtMi4zMDQsMy4wMTdoMi4zMDR2MC40MDVoLTIuODUyVjI3LjUwOXoiIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik04MS43LDIzLjA1OGgtMC40NzN2LTAuNjI5SDgxLjdWMjMuMDU4eiBNODEuMjI3LDI0LjA3OUg4MS43djMuODI2aC0wLjQ3M1YyNC4wNzl6IiAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik04NC45NywyMy45ODhjMS4yMzgsMCwxLjc4NiwwLjk2LDEuNzg2LDIuMDAzcy0wLjU0OCwyLjAwMy0xLjc4NiwyLjAwM2MtMS4yMzcsMC0xLjc4NS0wLjk2LTEuNzg1LTIuMDAzICAgIFM4My43MzQsMjMuOTg4LDg0Ljk3LDIzLjk4OHogTTg0Ljk3LDI3LjU5MWMwLjgyNiwwLDEuMjY5LTAuNzEzLDEuMjY5LTEuNmMwLTAuODg1LTAuNDQyLTEuNTk4LTEuMjY5LTEuNTk4ICAgIGMtMC44MjQsMC0xLjI2OCwwLjcxMy0xLjI2OCwxLjU5OEM4My43MDMsMjYuODc4LDg0LjE0NiwyNy41OTEsODQuOTcsMjcuNTkxeiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNODguMjM1LDI0Ljk3OWMwLTAuMjkzLDAtMC41OTQtMC4wMy0wLjloMC40NTh2MC42ODJoMC4wMTVjMC4xNTctMC4zNDQsMC40NDItMC43NzIsMS4yMzgtMC43NzIgICAgYzAuOTQ2LDAsMS4zMDYsMC42MywxLjMwNiwxLjQ3MnYyLjQ0NWgtMC40NzN2LTIuMzI2YzAtMC43Mi0wLjI1NS0xLjE4Ni0wLjkwOC0xLjE4NmMtMC44NjIsMC0xLjEzMywwLjc1OC0xLjEzMywxLjM5NnYyLjExNSAgICBoLTAuNDczVjI0Ljk3OXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTk1LjU1OSwyNy43ODVjLTAuMzMsMC4xMzYtMC43NTksMC4yMS0xLjExMSwwLjIxYy0xLjI2OSwwLTEuNzQxLTAuODU1LTEuNzQxLTIuMDAzYzAtMS4xNywwLjY0Ni0yLjAwMywxLjYxMy0yLjAwMyAgICBjMS4wODEsMCwxLjUyMiwwLjg3MSwxLjUyMiwxLjg5OHYwLjI0aC0yLjYxOGMwLDAuODExLDAuNDM2LDEuNDYzLDEuMjYxLDEuNDYzYzAuMzQ1LDAsMC44NDgtMC4xNDQsMS4wNzMtMC4yODVMOTUuNTU5LDI3Ljc4NSAgICBMOTUuNTU5LDI3Ljc4NXogTTk1LjMyNSwyNS43MjJjMC0wLjY2OC0wLjI3MS0xLjMyNy0wLjk3NS0xLjMyN2MtMC42OTgsMC0xLjEyNiwwLjY5OC0xLjEyNiwxLjMyN0g5NS4zMjV6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik05OS44MzYsMjcuMjM3YzAuMzA5LDAuMTk1LDAuNjY3LDAuMzA5LDEuMTU1LDAuMzA5YzAuNjQ2LDAsMS4xNzgtMC4zMywxLjE3OC0xLjA3NGMwLTEuMDI3LTIuNC0xLjE1NS0yLjQtMi41MjggICAgYzAtMC44NCwwLjczNC0xLjM2NiwxLjY1OC0xLjM2NmMwLjI1NiwwLDAuNjY3LDAuMDM4LDEuMDI4LDAuMTcybC0wLjA4MywwLjQ3M2MtMC4yMzEtMC4xMjctMC42MDEtMC4xOTQtMC45NTMtMC4xOTQgICAgYy0wLjU0LDAtMS4xMzMsMC4yMjYtMS4xMzMsMC44OTljMCwxLjA1MiwyLjQwMSwxLjA1OSwyLjQwMSwyLjU5YzAsMS4wNTgtMC45MDgsMS40NzgtMS43MTksMS40NzggICAgYy0wLjUxLDAtMC45MDctMC4xMDQtMS4xODYtMC4yMjVMOTkuODM2LDI3LjIzN3oiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDUuNTksMjcuOTA1aC0wLjU1NWwtMS4yOTgtMy44MjZoMC41MThsMS4wNTksMy4zMDloMC4wMTVsMS4xMTEtMy4zMDloMC40OTVMMTA1LjU5LDI3LjkwNXoiIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDguNjUzLDIzLjA1OGgtMC40NzR2LTAuNjI5aDAuNDc0VjIzLjA1OHogTTEwOC4xNzksMjQuMDc5aDAuNDc0djMuODI2aC0wLjQ3NFYyNC4wNzl6IiAvPgogICAgICAgICAgICA8cGF0aCBkPSJNMTEwLjA3OCwyNy41MDlsMi4zMDQtMy4wMjRoLTIuMjE0di0wLjQwNWgyLjc2MXYwLjQwNWwtMi4zMDMsMy4wMTdoMi4zMDN2MC40MDVoLTIuODUxVjI3LjUwOXoiIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMTMuOTk1LDI3LjUwOWwyLjMwNC0zLjAyNGgtMi4yMTR2LTAuNDA1aDIuNzYxdjAuNDA1bC0yLjMwMywzLjAxN2gyLjMwM3YwLjQwNWgtMi44NTFWMjcuNTA5eiIgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTIwLjgzLDI3Ljc4NWMtMC4zMywwLjEzNi0wLjc1OCwwLjIxLTEuMTExLDAuMjFjLTEuMjY4LDAtMS43NC0wLjg1NS0xLjc0LTIuMDAzYzAtMS4xNywwLjY0Ni0yLjAwMywxLjYxMi0yLjAwMyAgICBjMS4wODEsMCwxLjUyMywwLjg3MSwxLjUyMywxLjg5OHYwLjI0aC0yLjYxOWMwLDAuODExLDAuNDM3LDEuNDYzLDEuMjYxLDEuNDYzYzAuMzQ2LDAsMC44NDktMC4xNDQsMS4wNzMtMC4yODVMMTIwLjgzLDI3Ljc4NSAgICBMMTIwLjgzLDI3Ljc4NXogTTEyMC41OTcsMjUuNzIyYzAtMC42NjgtMC4yNy0xLjMyNy0wLjk3NS0xLjMyN2MtMC42OTgsMC0xLjEyNiwwLjY5OC0xLjEyNiwxLjMyN0gxMjAuNTk3eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTIyLjYwMiwyNC45MzVjMC0wLjQyLDAtMC41NzgtMC4wMy0wLjg1NWgwLjQ3M3YwLjczNWgwLjAxNmMwLjE3My0wLjQyNywwLjQ5NS0wLjgyNSwwLjk4Mi0wLjgyNSAgICBjMC4xMTIsMCwwLjI0OCwwLjAyMSwwLjMzLDAuMDQ1djAuNDk2Yy0wLjA5OC0wLjAyOS0wLjIyNS0wLjA0NS0wLjM0NS0wLjA0NWMtMC43NSwwLTAuOTUzLDAuODQxLTAuOTUzLDEuNTMxdjEuODkxaC0wLjQ3MyAgICBWMjQuOTM1eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTI3Ljg4NCwyNy4yOWgtMC4wMTVjLTAuMjEsMC40NTktMC43NDMsMC43MDUtMS4yMTYsMC43MDVjLTEuMDg4LDAtMS4yNi0wLjczNC0xLjI2LTEuMDggICAgYzAtMS4yODMsMS4zNjUtMS4zNDQsMi4zNTUtMS4zNDRoMC4wOXYtMC4xOTVjMC0wLjY1Mi0wLjIzMi0wLjk4Mi0wLjg3MS0wLjk4MmMtMC4zOTcsMC0wLjc3MiwwLjA5LTEuMTI1LDAuMzE0di0wLjQ1NyAgICBjMC4yOTItMC4xNDQsMC43ODgtMC4yNjQsMS4xMjUtMC4yNjRjMC45NDUsMCwxLjM0NCwwLjQyOCwxLjM0NCwxLjQyNnYxLjY4OGMwLDAuMzA5LDAsMC41NDEsMC4wMzgsMC44MDRoLTAuNDY2VjI3LjI5eiAgICAgTTEyNy44MzksMjUuOTc4aC0wLjEzNWMtMC44MTgsMC0xLjc5MywwLjA4My0xLjc5MywwLjkyM2MwLDAuNTAyLDAuMzYsMC42OSwwLjc5NSwwLjY5YzEuMTEsMCwxLjEzMy0wLjk2OSwxLjEzMy0xLjM4MVYyNS45Nzh6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik00Mi4xMDMsMzMuNjA0Yy0wLjMzLTAuMTczLTAuODA0LTAuMjI2LTEuMTcxLTAuMjI2Yy0xLjM1OCwwLTIuMTI0LDAuOTYxLTIuMTI0LDIuMjZjMCwxLjMyLDAuNzQyLDIuMjU4LDIuMTI0LDIuMjU4ICAgIGMwLjM0NSwwLDAuODctMC4wNDUsMS4xNzEtMC4yMjVsMC4wMjksMC40NDljLTAuMjg1LDAuMTc0LTAuODcsMC4yMjUtMS4yLDAuMjI1Yy0xLjY1MSwwLTIuNjQyLTEuMDg4LTIuNjQyLTIuNzA3ICAgIGMwLTEuNTkyLDEuMDIxLTIuNzA5LDIuNjQyLTIuNzA5YzAuMzA4LDAsMC45MzEsMC4wNTIsMS4yLDAuMTk1TDQyLjEwMywzMy42MDR6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik00NS4zNTIsMzQuMzM5YzEuMjM3LDAsMS43ODUsMC45NTksMS43ODUsMi4wMDJzLTAuNTQ4LDIuMDA0LTEuNzg1LDIuMDA0Yy0xLjIzOCwwLTEuNzg2LTAuOTYxLTEuNzg2LTIuMDA0ICAgIFM0NC4xMTQsMzQuMzM5LDQ1LjM1MiwzNC4zMzl6IE00NS4zNTIsMzcuOTRjMC44MjUsMCwxLjI2OC0wLjcxMywxLjI2OC0xLjZjMC0wLjg4NS0wLjQ0Mi0xLjU5OC0xLjI2OC0xLjU5OCAgICBzLTEuMjY5LDAuNzEzLTEuMjY5LDEuNTk4QzQ0LjA4NCwzNy4yMjgsNDQuNTI3LDM3Ljk0LDQ1LjM1MiwzNy45NHoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTQ4LjYxNiwzNS4zMjljMC0wLjI5MywwLTAuNTkzLTAuMDMtMC45aDAuNDU4djAuNjgzaDAuMDE2YzAuMTU2LTAuMzQ1LDAuNDQxLTAuNzcyLDEuMjM3LTAuNzcyICAgIGMwLjk0NiwwLDEuMzA3LDAuNjI5LDEuMzA3LDEuNDcxdjIuNDQ1SDUxLjEzdi0yLjMyNmMwLTAuNzE5LTAuMjU1LTEuMTg2LTAuOTA4LTEuMTg2Yy0wLjg2MiwwLTEuMTMzLDAuNzU4LTEuMTMzLDEuMzk2djIuMTE1ICAgIGgtMC40NzNWMzUuMzI5eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNTMuNjk2LDM0LjgzM2gtMC43NzN2LTAuNDA0aDAuNzczdi0wLjI3N2MwLTAuODAzLDAuMDMtMS42MTMsMS4wMTMtMS42MTNjMC4xNSwwLDAuMzU0LDAuMDIyLDAuNDQzLDAuMDc1bC0wLjAzLDAuNDEzICAgIGMtMC4wOTgtMC4wNTMtMC4yNC0wLjA4My0wLjM3NS0wLjA4M2MtMC42NDUsMC0wLjU3OCwwLjY5OC0wLjU3OCwxLjE1NXYwLjMzaDAuODYzdjAuNDA0aC0wLjg2M3YzLjQyMmgtMC40NzNWMzQuODMzeiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNTkuMDI0LDM4LjEzNmMtMC4zMywwLjEzNS0wLjc1OCwwLjIwOS0xLjExMSwwLjIwOWMtMS4yNjgsMC0xLjc0MS0wLjg1NC0xLjc0MS0yLjAwMmMwLTEuMTcsMC42NDYtMi4wMDQsMS42MTMtMi4wMDQgICAgYzEuMDgxLDAsMS41MjMsMC44NzEsMS41MjMsMS44OTh2MC4yNGgtMi42MTljMCwwLjgxMSwwLjQzNiwxLjQ2MywxLjI2MSwxLjQ2M2MwLjM0NSwwLDAuODQ4LTAuMTQzLDEuMDczLTAuMjg1TDU5LjAyNCwzOC4xMzYgICAgTDU5LjAyNCwzOC4xMzZ6IE01OC43OTEsMzYuMDcxYzAtMC42NjgtMC4yNy0xLjMyOC0wLjk3NS0xLjMyOGMtMC42OTgsMC0xLjEyNiwwLjY5OC0xLjEyNiwxLjMyOEg1OC43OTF6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik02My44MjYsMzguMjU1aC0wLjQ3M3YtMC42MDdoLTAuMDE2Yy0wLjI1NSwwLjQ4OC0wLjY0NiwwLjY5Ny0xLjE5MiwwLjY5N2MtMS4wNTEsMC0xLjU3Ni0wLjg2OS0xLjU3Ni0yLjAwMiAgICBjMC0xLjE2NCwwLjQ1LTIuMDA0LDEuNTc2LTIuMDA0YzAuNzUsMCwxLjEyNSwwLjU0OSwxLjE5MiwwLjczNWgwLjAxNnYtMi40NDZoMC40NzNWMzguMjU1eiBNNjIuMjE5LDM3Ljk0ICAgIGMwLjg0MSwwLDEuMTM0LTAuOSwxLjEzNC0xLjZjMC0wLjY5Ny0wLjI5Mi0xLjU5OC0xLjEzNC0xLjU5OGMtMC44OTksMC0xLjEzMywwLjg1NS0xLjEzMywxLjU5OCAgICBDNjEuMDg3LDM3LjA4NSw2MS4zMiwzNy45NCw2Mi4yMTksMzcuOTR6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik02OC4xMTgsMzguMTM2Yy0wLjMzLDAuMTM1LTAuNzU4LDAuMjA5LTEuMTExLDAuMjA5Yy0xLjI2OCwwLTEuNzQtMC44NTQtMS43NC0yLjAwMmMwLTEuMTcsMC42NDYtMi4wMDQsMS42MTItMi4wMDQgICAgYzEuMDgxLDAsMS41MjMsMC44NzEsMS41MjMsMS44OTh2MC4yNGgtMi42MTljMCwwLjgxMSwwLjQzNiwxLjQ2MywxLjI2MSwxLjQ2M2MwLjM0NSwwLDAuODQ5LTAuMTQzLDEuMDczLTAuMjg1TDY4LjExOCwzOC4xMzYgICAgTDY4LjExOCwzOC4xMzZ6IE02Ny44ODUsMzYuMDcxYzAtMC42NjgtMC4yNy0xLjMyOC0wLjk3NS0xLjMyOGMtMC42OTgsMC0xLjEyNiwwLjY5OC0xLjEyNiwxLjMyOEg2Ny44ODV6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik02OS44ODgsMzUuMjgzYzAtMC40MiwwLTAuNTc3LTAuMDI5LTAuODU0aDAuNDczdjAuNzM0aDAuMDE1YzAuMTc0LTAuNDI3LDAuNDk2LTAuODI0LDAuOTgzLTAuODI0ICAgIGMwLjExMiwwLDAuMjQ4LDAuMDIxLDAuMzMsMC4wNDV2MC40OTZjLTAuMDk4LTAuMDMxLTAuMjI1LTAuMDQ1LTAuMzQ1LTAuMDQ1Yy0wLjc1LDAtMC45NTMsMC44NC0wLjk1MywxLjUzdjEuODkyaC0wLjQ3NFYzNS4yODN6ICAgICIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNzUuMTcyLDM3LjY0aC0wLjAxNWMtMC4yMSwwLjQ1OS0wLjc0MywwLjcwNS0xLjIxNiwwLjcwNWMtMS4wODgsMC0xLjI2MS0wLjczNC0xLjI2MS0xLjA4ICAgIGMwLTEuMjgzLDEuMzY2LTEuMzQ0LDIuMzU2LTEuMzQ0aDAuMDl2LTAuMTk1YzAtMC42NTItMC4yMzItMC45ODItMC44NzEtMC45ODJjLTAuMzk3LDAtMC43NzIsMC4wOS0xLjEyNSwwLjMxNHYtMC40NTcgICAgYzAuMjkyLTAuMTQzLDAuNzg4LTAuMjY0LDEuMTI1LTAuMjY0YzAuOTQ1LDAsMS4zNDQsMC40MjgsMS4zNDQsMS40MjZ2MS42ODhjMCwwLjMwOCwwLDAuNTQsMC4wMzcsMC44MDRoLTAuNDY1VjM3LjY0eiAgICAgTTc1LjEyNywzNi4zMjZoLTAuMTM1Yy0wLjgxOCwwLTEuNzkzLDAuMDgzLTEuNzkzLDAuOTIzYzAsMC41MDIsMC4zNiwwLjY5LDAuNzk1LDAuNjljMS4xMSwwLDEuMTMzLTAuOTY4LDEuMTMzLTEuMzgyVjM2LjMyNnoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik03Ni45NTgsMzcuODU4bDIuMzA0LTMuMDIzaC0yLjIxNHYtMC40MDZoMi43NjJ2MC40MDZsLTIuMzA0LDMuMDE2aDIuMzA0djAuNDA2aC0yLjg1MlYzNy44NTh6IiAvPgogICAgICAgICAgICA8cGF0aCBkPSJNODEuNywzMy40MDdoLTAuNDczdi0wLjYzSDgxLjdWMzMuNDA3eiBNODEuMjI3LDM0LjQyOUg4MS43djMuODI2aC0wLjQ3M1YzNC40Mjl6IiAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik04Ni40NjQsMzcuMzU1YzAsMC4yOTIsMCwwLjU5MywwLjAzLDAuODk5aC0wLjQ1OHYtMC42ODNoLTAuMDE0Yy0wLjE1OCwwLjM0NS0wLjQ0MywwLjc3Mi0xLjIzOCwwLjc3MiAgICBjLTAuOTQ1LDAtMS4zMDYtMC42MzEtMS4zMDYtMS40NzF2LTIuNDQ3aDAuNDczdjIuMzI2YzAsMC43MjEsMC4yNTUsMS4xODcsMC45MDgsMS4xODdjMC44NjIsMCwxLjEzMy0wLjc1OSwxLjEzMy0xLjM5NnYtMi4xMTcgICAgaDAuNDczTDg2LjQ2NCwzNy4zNTVMODYuNDY0LDM3LjM1NXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTg4LjIzNSwzNS4zMjljMC0wLjI5MywwLTAuNTkzLTAuMDMtMC45aDAuNDU4djAuNjgzaDAuMDE1YzAuMTU3LTAuMzQ1LDAuNDQyLTAuNzcyLDEuMjM4LTAuNzcyICAgIGMwLjk0NiwwLDEuMzA2LDAuNjI5LDEuMzA2LDEuNDcxdjIuNDQ1aC0wLjQ3M3YtMi4zMjZjMC0wLjcxOS0wLjI1NS0xLjE4Ni0wLjkwOC0xLjE4NmMtMC44NjIsMC0xLjEzMywwLjc1OC0xLjEzMywxLjM5NnYyLjExNSAgICBoLTAuNDczVjM1LjMyOXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTk1LjI5NSwzNy43YzAuMjg1LDAuMTQzLDAuNjMsMC4yNCwwLjk5OCwwLjI0YzAuNDUsMCwwLjg0OS0wLjI0OCwwLjg0OS0wLjY4NGMwLTAuOTA4LTEuODM5LTAuNzY1LTEuODM5LTEuODc1ICAgIGMwLTAuNzU4LDAuNjE1LTEuMDQzLDEuMjQ2LTEuMDQzYzAuMjAzLDAsMC42MDgsMC4wNDUsMC45NDUsMC4xNzJsLTAuMDQ1LDAuNDE0Yy0wLjI0OC0wLjExMy0wLjU4NS0wLjE4MS0wLjg0OC0wLjE4MSAgICBjLTAuNDg4LDAtMC44MjYsMC4xNS0wLjgyNiwwLjYzOGMwLDAuNzEzLDEuODgzLDAuNjIzLDEuODgzLDEuODc3YzAsMC44MTEtMC43NTgsMS4wODgtMS4zMzUsMS4wODggICAgYy0wLjM2OCwwLTAuNzM1LTAuMDQ1LTEuMDczLTAuMThMOTUuMjk1LDM3Ljd6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aCBkPSJNMTAwLjQyLDM4LjI1NWgtMC41NTVsLTEuMjk4LTMuODI2aDAuNTE4bDEuMDU5LDMuMzFoMC4wMTVsMS4xMTEtMy4zMWgwLjQ5NEwxMDAuNDIsMzguMjU1eiIgLz4KICAgICAgICAgICAgPHBhdGggZD0iTTEwMy40ODMsMzMuNDA3aC0wLjQ3NHYtMC42M2gwLjQ3NFYzMy40MDd6IE0xMDMuMDA5LDM0LjQyOWgwLjQ3NHYzLjgyNmgtMC40NzRWMzQuNDI5eiIgLz4KICAgICAgICAgICAgPHBhdGggZD0iTTEwNC45MDgsMzcuODU4bDIuMzA0LTMuMDIzaC0yLjIxNHYtMC40MDZoMi43NjF2MC40MDZsLTIuMzAzLDMuMDE2aDIuMzAzdjAuNDA2aC0yLjg1MVYzNy44NTh6IiAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xMDkuMTc3LDM1LjI4M2MwLTAuNDIsMC0wLjU3Ny0wLjAyOS0wLjg1NGgwLjQ3M3YwLjczNGgwLjAxNWMwLjE3NC0wLjQyNywwLjQ5Ni0wLjgyNCwwLjk4My0wLjgyNCAgICBjMC4xMTIsMCwwLjI0OCwwLjAyMSwwLjMzLDAuMDQ1djAuNDk2Yy0wLjA5OC0wLjAzMS0wLjIyNS0wLjA0NS0wLjM0NS0wLjA0NWMtMC43NSwwLTAuOTUzLDAuODQtMC45NTMsMS41M3YxLjg5MmgtMC40NzRWMzUuMjgzeiAgICAiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTExNC40NiwzNy42NGgtMC4wMTVjLTAuMjEsMC40NTktMC43NDMsMC43MDUtMS4yMTYsMC43MDVjLTEuMDg4LDAtMS4yNjEtMC43MzQtMS4yNjEtMS4wOCAgICBjMC0xLjI4MywxLjM2Ni0xLjM0NCwyLjM1Ni0xLjM0NGgwLjA5di0wLjE5NWMwLTAuNjUyLTAuMjMyLTAuOTgyLTAuODcxLTAuOTgyYy0wLjM5NywwLTAuNzcyLDAuMDktMS4xMjUsMC4zMTR2LTAuNDU3ICAgIGMwLjI5Mi0wLjE0MywwLjc4OC0wLjI2NCwxLjEyNS0wLjI2NGMwLjk0NSwwLDEuMzQzLDAuNDI4LDEuMzQzLDEuNDI2djEuNjg4YzAsMC4zMDgsMCwwLjU0LDAuMDM4LDAuODA0aC0wLjQ2NVYzNy42NHogICAgIE0xMTQuNDE1LDM2LjMyNmgtMC4xMzVjLTAuODE4LDAtMS43OTMsMC4wODMtMS43OTMsMC45MjNjMCwwLjUwMiwwLjM1OSwwLjY5LDAuNzk1LDAuNjljMS4xMSwwLDEuMTMzLTAuOTY4LDEuMTMzLTEuMzgyVjM2LjMyNnogICAgIgogICAgICAgICAgICAvPgogICAgICAgICAgPC9nPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgZmlsbD0iI0UzMDYxMyIKICAgICAgICAgICAgZD0iTTI5Ljc3OCwxLjczN2MwLDAtMy45NjktMS43MzgtMTAuNjEzLTEuNzM4aC0wLjAwMkMxMi41MTgsMCw4LjU0OSwxLjczNyw4LjU0OSwxLjczNyAgIFM4LjE5NCw5LjQzMyw5LjcsMTMuNzg1YzIuNjYxLDcuNjUxLDkuNDYyLDkuODAyLDkuNDYyLDkuODAyaDAuMDAyaDAuMDAyYzAsMCw2LjgtMi4xNDksOS40NjItOS44MDIgICBDMzAuMTM0LDkuNDM0LDI5Ljc3OCwxLjczNywyOS43NzgsMS43Mzd6IgogICAgICAgICAgLz4KICAgICAgICAgIDxwb2x5Z29uCiAgICAgICAgICAgIGZpbGw9IiNGRkZGRkYiCiAgICAgICAgICAgIHBvaW50cz0iMjYuMjE3LDguMzczIDI2LjIxNywxMi42MTIgMjEuMjcsMTIuNjEyIDIxLjI3LDE3LjU2MSAxNy4wMywxNy41NjEgMTcuMDMsMTIuNjEyIDEyLjA4MywxMi42MTIgICAgMTIuMDgzLDguMzczIDE3LjAzLDguMzczIDE3LjAzLDMuNDI2IDIxLjI2OSwzLjQyNiAyMS4yNyw4LjM3MyAgIgogICAgICAgICAgLz4KICAgICAgICA8L2c+CiAgICAgIDwvc3ZnPgogICAgPC9hPgogIDwvZGl2PgogIDxkaXYgaWQ9InFkLWVycm9yLXBhZ2UtY29udGVudC13cmFwcGVyIj4KICAgIDxkaXYgaWQ9InFkLWVycm9yLXBhZ2UtY29udGVudCI+CiAgICAgIDxzdmcKICAgICAgICBpZD0icWQtZXJyb3ItcGFnZS1pY29uIgogICAgICAgIHZlcnNpb249IjEuMSIKICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICAgICAgeD0iMHB4IgogICAgICAgIHk9IjBweCIKICAgICAgICB3aWR0aD0iNTc2cHgiCiAgICAgICAgaGVpZ2h0PSI1MTJweCIKICAgICAgICB2aWV3Qm94PSIwIDAgNTc2IDUxMiIKICAgICAgICBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IGVuYWJsZS1iYWNrZ3JvdW5kOiBuZXcgMCAwIDU3NiA1MTIiCiAgICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgICAgPgogICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgICAgICAuc3QwIHsKICAgICAgICAgICAgZmlsbDogIzk3OTc5NzsKICAgICAgICAgIH0KICAgICAgICA8L3N0eWxlPgogICAgICAgIDxkZWZzPjwvZGVmcz4KICAgICAgICA8Zz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgIGNsYXNzPSJzdDAiCiAgICAgICAgICAgIGQ9Ik01NjkuNSw0NDBMMzI5LjYsMjRjLTE4LjQtMzItNjQuNy0zMi04My4yLDBMNi41LDQ0MGMtMTguNCwzMS45LDQuNiw3Miw0MS42LDcySDUyOAogICAgICAgICAgICAgICAgQzU2NC44LDUxMiw1ODgsNDcyLDU2OS41LDQ0MHogTTI3MC4yLDE2MGgzNS41YzMuNCwwLDYuMSwyLjgsNiw2LjJsLTcuNSwxOTZjLTAuMSwzLjItMi44LDUuOC02LDUuOGgtMjAuNWMtMy4yLDAtNS45LTIuNS02LTUuOAogICAgICAgICAgICAgICAgbC03LjUtMTk2QzI2NC4xLDE2Mi44LDI2Ni44LDE2MCwyNzAuMiwxNjB6IE0yODgsNDQ0Yy0xNS41LDAtMjgtMTIuNS0yOC0yOHMxMi41LTI4LDI4LTI4czI4LDEyLjUsMjgsMjhTMzAzLjUsNDQ0LDI4OCw0NDR6IgogICAgICAgICAgLz4KICAgICAgICA8L2c+CiAgICAgIDwvc3ZnPgogICAgPC9kaXY+CiAgPC9kaXY+CiAgPGRpdiBpZD0icWQtZXJyb3ItcGFnZS1mb290ZXIiPgogICAgPHNwYW4+RWlkZ2Vuw7Zzc2lzY2hlIFpvbGx2ZXJ3YWx0dW5nPC9zcGFuPgogICAgPHVsPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuYWRtaW4uY2gvZ292L2RlL3N0YXJ0L2Rva3VtZW50YXRpb24vaW1wcmVzc3VtLmh0bWwiPkltcHJlc3N1bTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuYWRtaW4uY2gvZ292L2RlL3N0YXJ0L3JlY2h0bGljaGVzLmh0bWwiPlJlY2h0bGljaGVzPC9hPjwvbGk+CiAgICA8L3VsPgogIDwvZGl2Pgo8L2Rpdj4K","base64");
|
|
34
|
+
|
|
35
|
+
const errorContainer = document.createElement('div');
|
|
36
|
+
errorContainer.id = 'outdated';
|
|
37
|
+
document.body.appendChild(errorContainer);
|
|
38
|
+
|
|
39
|
+
// Despite the docs, UA needs to be provided to constructor explicitly:
|
|
40
|
+
// https://github.com/faisalman/ua-parser-js/issues/90
|
|
41
|
+
const parsedUserAgent = new UserAgentParser(window.navigator.userAgent).getResult();
|
|
42
|
+
|
|
43
|
+
// Set default options
|
|
44
|
+
const browserSupport = options ? updateDefaults(DEFAULTS, options) : DEFAULTS;
|
|
45
|
+
|
|
46
|
+
// Check if browser is supported
|
|
47
|
+
if (isBrowserOutOfDate(parsedUserAgent, browserSupport)) {
|
|
48
|
+
const errorText = {
|
|
49
|
+
en: {
|
|
50
|
+
headline: 'Your browser is not supported.',
|
|
51
|
+
subline:
|
|
52
|
+
'We recommend using the latest version of Chrome (Google), Firefox (Mozilla), ' +
|
|
53
|
+
'Edge (Microsoft) or Safari (Apple).'
|
|
54
|
+
},
|
|
55
|
+
de: {
|
|
56
|
+
headline: 'Ihr Browser wird nicht unterstützt.',
|
|
57
|
+
subline:
|
|
58
|
+
'Wir empfehlen, die neuste Version von Chrome (Google), Firefox (Mozilla), ' +
|
|
59
|
+
'Edge (Microsoft) oder Safari (Apple) zu verwenden.'
|
|
60
|
+
},
|
|
61
|
+
fr: {
|
|
62
|
+
headline: "Votre navigateur n'est pas pris en charge.",
|
|
63
|
+
subline:
|
|
64
|
+
"Nous vous recommandons d'utiliser la dernière version de Chrome (Google), " +
|
|
65
|
+
'Firefox (Mozilla), Edge (Microsoft) ou Safari (Apple).'
|
|
66
|
+
},
|
|
67
|
+
it: {
|
|
68
|
+
headline: 'Il tuo browser non è supportato.',
|
|
69
|
+
subline:
|
|
70
|
+
"Si consiglia di utilizzare l'ultima versione di Chrome (Google), " +
|
|
71
|
+
'Firefox (Mozilla), Edge (Microsoft) o Safari (Apple).'
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const insertContentHere = document.getElementById('outdated');
|
|
76
|
+
insertContentHere.classList.add('qd-fullscreen-info');
|
|
77
|
+
insertContentHere.innerHTML = ErrorPageHtml;
|
|
78
|
+
|
|
79
|
+
const browserLanguageCode = (navigator.language || navigator.userLanguage).substring(0, 2).toLowerCase();
|
|
80
|
+
|
|
81
|
+
const headline = document.createElement('h1');
|
|
82
|
+
const subline = document.createElement('h3');
|
|
83
|
+
headline.innerHTML = errorText[getLanguageCode(browserLanguageCode)].headline;
|
|
84
|
+
subline.innerHTML = errorText[getLanguageCode(browserLanguageCode)].subline;
|
|
85
|
+
document.getElementById('qd-error-page-content').appendChild(headline);
|
|
86
|
+
document.getElementById('qd-error-page-content').appendChild(subline);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function updateDefaults(defaults, updatedValues) {
|
|
91
|
+
for (let key in updatedValues) {
|
|
92
|
+
defaults[key] = updatedValues[key];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return defaults;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function isBrowserOutOfDate(parsedUserAgent, browserSupport) {
|
|
99
|
+
const browserName = parsedUserAgent.browser.name;
|
|
100
|
+
const browserMajorVersion = parsedUserAgent.browser.major;
|
|
101
|
+
|
|
102
|
+
let isOutOfDate = false;
|
|
103
|
+
if (isBrowserUnsupported()) {
|
|
104
|
+
isOutOfDate = true;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (browserName in browserSupport) {
|
|
108
|
+
const minVersion = browserSupport[browserName];
|
|
109
|
+
|
|
110
|
+
if (parseInt(browserMajorVersion) < parseInt(minVersion)) {
|
|
111
|
+
isOutOfDate = true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return isOutOfDate;
|
|
116
|
+
|
|
117
|
+
function isBrowserUnsupported() {
|
|
118
|
+
const browserName = parsedUserAgent.browser.name;
|
|
119
|
+
let isUnsupported = false;
|
|
120
|
+
if (!(browserName in browserSupport)) {
|
|
121
|
+
isUnsupported = true;
|
|
122
|
+
} else if (!browserSupport[browserName]) {
|
|
123
|
+
isUnsupported = true;
|
|
124
|
+
}
|
|
125
|
+
return isUnsupported;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function getLanguageCode(browserLanguageCode) {
|
|
130
|
+
if (['en', 'de', 'fr', 'it'].indexOf(browserLanguageCode) === -1) {
|
|
131
|
+
return 'en';
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return browserLanguageCode;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
}).call(this)}).call(this,require("buffer").Buffer)
|
|
139
|
+
|
|
140
|
+
},{"buffer":3,"ua-parser-js":5}],2:[function(require,module,exports){
|
|
141
|
+
'use strict'
|
|
142
|
+
|
|
143
|
+
exports.byteLength = byteLength
|
|
144
|
+
exports.toByteArray = toByteArray
|
|
145
|
+
exports.fromByteArray = fromByteArray
|
|
146
|
+
|
|
147
|
+
var lookup = []
|
|
148
|
+
var revLookup = []
|
|
149
|
+
var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
|
|
150
|
+
|
|
151
|
+
var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
|
152
|
+
for (var i = 0, len = code.length; i < len; ++i) {
|
|
153
|
+
lookup[i] = code[i]
|
|
154
|
+
revLookup[code.charCodeAt(i)] = i
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Support decoding URL-safe base64 strings, as Node.js does.
|
|
158
|
+
// See: https://en.wikipedia.org/wiki/Base64#URL_applications
|
|
159
|
+
revLookup['-'.charCodeAt(0)] = 62
|
|
160
|
+
revLookup['_'.charCodeAt(0)] = 63
|
|
161
|
+
|
|
162
|
+
function getLens (b64) {
|
|
163
|
+
var len = b64.length
|
|
164
|
+
|
|
165
|
+
if (len % 4 > 0) {
|
|
166
|
+
throw new Error('Invalid string. Length must be a multiple of 4')
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Trim off extra bytes after placeholder bytes are found
|
|
170
|
+
// See: https://github.com/beatgammit/base64-js/issues/42
|
|
171
|
+
var validLen = b64.indexOf('=')
|
|
172
|
+
if (validLen === -1) validLen = len
|
|
173
|
+
|
|
174
|
+
var placeHoldersLen = validLen === len
|
|
175
|
+
? 0
|
|
176
|
+
: 4 - (validLen % 4)
|
|
177
|
+
|
|
178
|
+
return [validLen, placeHoldersLen]
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// base64 is 4/3 + up to two characters of the original data
|
|
182
|
+
function byteLength (b64) {
|
|
183
|
+
var lens = getLens(b64)
|
|
184
|
+
var validLen = lens[0]
|
|
185
|
+
var placeHoldersLen = lens[1]
|
|
186
|
+
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function _byteLength (b64, validLen, placeHoldersLen) {
|
|
190
|
+
return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function toByteArray (b64) {
|
|
194
|
+
var tmp
|
|
195
|
+
var lens = getLens(b64)
|
|
196
|
+
var validLen = lens[0]
|
|
197
|
+
var placeHoldersLen = lens[1]
|
|
198
|
+
|
|
199
|
+
var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
|
|
200
|
+
|
|
201
|
+
var curByte = 0
|
|
202
|
+
|
|
203
|
+
// if there are placeholders, only get up to the last complete 4 chars
|
|
204
|
+
var len = placeHoldersLen > 0
|
|
205
|
+
? validLen - 4
|
|
206
|
+
: validLen
|
|
207
|
+
|
|
208
|
+
var i
|
|
209
|
+
for (i = 0; i < len; i += 4) {
|
|
210
|
+
tmp =
|
|
211
|
+
(revLookup[b64.charCodeAt(i)] << 18) |
|
|
212
|
+
(revLookup[b64.charCodeAt(i + 1)] << 12) |
|
|
213
|
+
(revLookup[b64.charCodeAt(i + 2)] << 6) |
|
|
214
|
+
revLookup[b64.charCodeAt(i + 3)]
|
|
215
|
+
arr[curByte++] = (tmp >> 16) & 0xFF
|
|
216
|
+
arr[curByte++] = (tmp >> 8) & 0xFF
|
|
217
|
+
arr[curByte++] = tmp & 0xFF
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (placeHoldersLen === 2) {
|
|
221
|
+
tmp =
|
|
222
|
+
(revLookup[b64.charCodeAt(i)] << 2) |
|
|
223
|
+
(revLookup[b64.charCodeAt(i + 1)] >> 4)
|
|
224
|
+
arr[curByte++] = tmp & 0xFF
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (placeHoldersLen === 1) {
|
|
228
|
+
tmp =
|
|
229
|
+
(revLookup[b64.charCodeAt(i)] << 10) |
|
|
230
|
+
(revLookup[b64.charCodeAt(i + 1)] << 4) |
|
|
231
|
+
(revLookup[b64.charCodeAt(i + 2)] >> 2)
|
|
232
|
+
arr[curByte++] = (tmp >> 8) & 0xFF
|
|
233
|
+
arr[curByte++] = tmp & 0xFF
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return arr
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function tripletToBase64 (num) {
|
|
240
|
+
return lookup[num >> 18 & 0x3F] +
|
|
241
|
+
lookup[num >> 12 & 0x3F] +
|
|
242
|
+
lookup[num >> 6 & 0x3F] +
|
|
243
|
+
lookup[num & 0x3F]
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function encodeChunk (uint8, start, end) {
|
|
247
|
+
var tmp
|
|
248
|
+
var output = []
|
|
249
|
+
for (var i = start; i < end; i += 3) {
|
|
250
|
+
tmp =
|
|
251
|
+
((uint8[i] << 16) & 0xFF0000) +
|
|
252
|
+
((uint8[i + 1] << 8) & 0xFF00) +
|
|
253
|
+
(uint8[i + 2] & 0xFF)
|
|
254
|
+
output.push(tripletToBase64(tmp))
|
|
255
|
+
}
|
|
256
|
+
return output.join('')
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function fromByteArray (uint8) {
|
|
260
|
+
var tmp
|
|
261
|
+
var len = uint8.length
|
|
262
|
+
var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
|
|
263
|
+
var parts = []
|
|
264
|
+
var maxChunkLength = 16383 // must be multiple of 3
|
|
265
|
+
|
|
266
|
+
// go through the array every three bytes, we'll deal with trailing stuff later
|
|
267
|
+
for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
|
|
268
|
+
parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// pad the end with zeros, but make sure to not forget the extra bytes
|
|
272
|
+
if (extraBytes === 1) {
|
|
273
|
+
tmp = uint8[len - 1]
|
|
274
|
+
parts.push(
|
|
275
|
+
lookup[tmp >> 2] +
|
|
276
|
+
lookup[(tmp << 4) & 0x3F] +
|
|
277
|
+
'=='
|
|
278
|
+
)
|
|
279
|
+
} else if (extraBytes === 2) {
|
|
280
|
+
tmp = (uint8[len - 2] << 8) + uint8[len - 1]
|
|
281
|
+
parts.push(
|
|
282
|
+
lookup[tmp >> 10] +
|
|
283
|
+
lookup[(tmp >> 4) & 0x3F] +
|
|
284
|
+
lookup[(tmp << 2) & 0x3F] +
|
|
285
|
+
'='
|
|
286
|
+
)
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
return parts.join('')
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
},{}],3:[function(require,module,exports){
|
|
293
|
+
(function (Buffer){(function (){
|
|
294
|
+
/*!
|
|
295
|
+
* The buffer module from node.js, for the browser.
|
|
296
|
+
*
|
|
297
|
+
* @author Feross Aboukhadijeh <https://feross.org>
|
|
298
|
+
* @license MIT
|
|
299
|
+
*/
|
|
300
|
+
/* eslint-disable no-proto */
|
|
301
|
+
|
|
302
|
+
'use strict'
|
|
303
|
+
|
|
304
|
+
var base64 = require('base64-js')
|
|
305
|
+
var ieee754 = require('ieee754')
|
|
306
|
+
|
|
307
|
+
exports.Buffer = Buffer
|
|
308
|
+
exports.SlowBuffer = SlowBuffer
|
|
309
|
+
exports.INSPECT_MAX_BYTES = 50
|
|
310
|
+
|
|
311
|
+
var K_MAX_LENGTH = 0x7fffffff
|
|
312
|
+
exports.kMaxLength = K_MAX_LENGTH
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* If `Buffer.TYPED_ARRAY_SUPPORT`:
|
|
316
|
+
* === true Use Uint8Array implementation (fastest)
|
|
317
|
+
* === false Print warning and recommend using `buffer` v4.x which has an Object
|
|
318
|
+
* implementation (most compatible, even IE6)
|
|
319
|
+
*
|
|
320
|
+
* Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
|
|
321
|
+
* Opera 11.6+, iOS 4.2+.
|
|
322
|
+
*
|
|
323
|
+
* We report that the browser does not support typed arrays if the are not subclassable
|
|
324
|
+
* using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
|
|
325
|
+
* (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
|
|
326
|
+
* for __proto__ and has a buggy typed array implementation.
|
|
327
|
+
*/
|
|
328
|
+
Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()
|
|
329
|
+
|
|
330
|
+
if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
|
|
331
|
+
typeof console.error === 'function') {
|
|
332
|
+
console.error(
|
|
333
|
+
'This browser lacks typed array (Uint8Array) support which is required by ' +
|
|
334
|
+
'`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
|
|
335
|
+
)
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
function typedArraySupport () {
|
|
339
|
+
// Can typed array instances can be augmented?
|
|
340
|
+
try {
|
|
341
|
+
var arr = new Uint8Array(1)
|
|
342
|
+
arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } }
|
|
343
|
+
return arr.foo() === 42
|
|
344
|
+
} catch (e) {
|
|
345
|
+
return false
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
Object.defineProperty(Buffer.prototype, 'parent', {
|
|
350
|
+
enumerable: true,
|
|
351
|
+
get: function () {
|
|
352
|
+
if (!Buffer.isBuffer(this)) return undefined
|
|
353
|
+
return this.buffer
|
|
354
|
+
}
|
|
355
|
+
})
|
|
356
|
+
|
|
357
|
+
Object.defineProperty(Buffer.prototype, 'offset', {
|
|
358
|
+
enumerable: true,
|
|
359
|
+
get: function () {
|
|
360
|
+
if (!Buffer.isBuffer(this)) return undefined
|
|
361
|
+
return this.byteOffset
|
|
362
|
+
}
|
|
363
|
+
})
|
|
364
|
+
|
|
365
|
+
function createBuffer (length) {
|
|
366
|
+
if (length > K_MAX_LENGTH) {
|
|
367
|
+
throw new RangeError('The value "' + length + '" is invalid for option "size"')
|
|
368
|
+
}
|
|
369
|
+
// Return an augmented `Uint8Array` instance
|
|
370
|
+
var buf = new Uint8Array(length)
|
|
371
|
+
buf.__proto__ = Buffer.prototype
|
|
372
|
+
return buf
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* The Buffer constructor returns instances of `Uint8Array` that have their
|
|
377
|
+
* prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
|
|
378
|
+
* `Uint8Array`, so the returned instances will have all the node `Buffer` methods
|
|
379
|
+
* and the `Uint8Array` methods. Square bracket notation works as expected -- it
|
|
380
|
+
* returns a single octet.
|
|
381
|
+
*
|
|
382
|
+
* The `Uint8Array` prototype remains unmodified.
|
|
383
|
+
*/
|
|
384
|
+
|
|
385
|
+
function Buffer (arg, encodingOrOffset, length) {
|
|
386
|
+
// Common case.
|
|
387
|
+
if (typeof arg === 'number') {
|
|
388
|
+
if (typeof encodingOrOffset === 'string') {
|
|
389
|
+
throw new TypeError(
|
|
390
|
+
'The "string" argument must be of type string. Received type number'
|
|
391
|
+
)
|
|
392
|
+
}
|
|
393
|
+
return allocUnsafe(arg)
|
|
394
|
+
}
|
|
395
|
+
return from(arg, encodingOrOffset, length)
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
|
|
399
|
+
if (typeof Symbol !== 'undefined' && Symbol.species != null &&
|
|
400
|
+
Buffer[Symbol.species] === Buffer) {
|
|
401
|
+
Object.defineProperty(Buffer, Symbol.species, {
|
|
402
|
+
value: null,
|
|
403
|
+
configurable: true,
|
|
404
|
+
enumerable: false,
|
|
405
|
+
writable: false
|
|
406
|
+
})
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
Buffer.poolSize = 8192 // not used by this implementation
|
|
410
|
+
|
|
411
|
+
function from (value, encodingOrOffset, length) {
|
|
412
|
+
if (typeof value === 'string') {
|
|
413
|
+
return fromString(value, encodingOrOffset)
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (ArrayBuffer.isView(value)) {
|
|
417
|
+
return fromArrayLike(value)
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
if (value == null) {
|
|
421
|
+
throw TypeError(
|
|
422
|
+
'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
|
|
423
|
+
'or Array-like Object. Received type ' + (typeof value)
|
|
424
|
+
)
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
if (isInstance(value, ArrayBuffer) ||
|
|
428
|
+
(value && isInstance(value.buffer, ArrayBuffer))) {
|
|
429
|
+
return fromArrayBuffer(value, encodingOrOffset, length)
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
if (typeof value === 'number') {
|
|
433
|
+
throw new TypeError(
|
|
434
|
+
'The "value" argument must not be of type number. Received type number'
|
|
435
|
+
)
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
var valueOf = value.valueOf && value.valueOf()
|
|
439
|
+
if (valueOf != null && valueOf !== value) {
|
|
440
|
+
return Buffer.from(valueOf, encodingOrOffset, length)
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
var b = fromObject(value)
|
|
444
|
+
if (b) return b
|
|
445
|
+
|
|
446
|
+
if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&
|
|
447
|
+
typeof value[Symbol.toPrimitive] === 'function') {
|
|
448
|
+
return Buffer.from(
|
|
449
|
+
value[Symbol.toPrimitive]('string'), encodingOrOffset, length
|
|
450
|
+
)
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
throw new TypeError(
|
|
454
|
+
'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
|
|
455
|
+
'or Array-like Object. Received type ' + (typeof value)
|
|
456
|
+
)
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
|
|
461
|
+
* if value is a number.
|
|
462
|
+
* Buffer.from(str[, encoding])
|
|
463
|
+
* Buffer.from(array)
|
|
464
|
+
* Buffer.from(buffer)
|
|
465
|
+
* Buffer.from(arrayBuffer[, byteOffset[, length]])
|
|
466
|
+
**/
|
|
467
|
+
Buffer.from = function (value, encodingOrOffset, length) {
|
|
468
|
+
return from(value, encodingOrOffset, length)
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
|
|
472
|
+
// https://github.com/feross/buffer/pull/148
|
|
473
|
+
Buffer.prototype.__proto__ = Uint8Array.prototype
|
|
474
|
+
Buffer.__proto__ = Uint8Array
|
|
475
|
+
|
|
476
|
+
function assertSize (size) {
|
|
477
|
+
if (typeof size !== 'number') {
|
|
478
|
+
throw new TypeError('"size" argument must be of type number')
|
|
479
|
+
} else if (size < 0) {
|
|
480
|
+
throw new RangeError('The value "' + size + '" is invalid for option "size"')
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
function alloc (size, fill, encoding) {
|
|
485
|
+
assertSize(size)
|
|
486
|
+
if (size <= 0) {
|
|
487
|
+
return createBuffer(size)
|
|
488
|
+
}
|
|
489
|
+
if (fill !== undefined) {
|
|
490
|
+
// Only pay attention to encoding if it's a string. This
|
|
491
|
+
// prevents accidentally sending in a number that would
|
|
492
|
+
// be interpretted as a start offset.
|
|
493
|
+
return typeof encoding === 'string'
|
|
494
|
+
? createBuffer(size).fill(fill, encoding)
|
|
495
|
+
: createBuffer(size).fill(fill)
|
|
496
|
+
}
|
|
497
|
+
return createBuffer(size)
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
* Creates a new filled Buffer instance.
|
|
502
|
+
* alloc(size[, fill[, encoding]])
|
|
503
|
+
**/
|
|
504
|
+
Buffer.alloc = function (size, fill, encoding) {
|
|
505
|
+
return alloc(size, fill, encoding)
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
function allocUnsafe (size) {
|
|
509
|
+
assertSize(size)
|
|
510
|
+
return createBuffer(size < 0 ? 0 : checked(size) | 0)
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
|
|
515
|
+
* */
|
|
516
|
+
Buffer.allocUnsafe = function (size) {
|
|
517
|
+
return allocUnsafe(size)
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
|
|
521
|
+
*/
|
|
522
|
+
Buffer.allocUnsafeSlow = function (size) {
|
|
523
|
+
return allocUnsafe(size)
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
function fromString (string, encoding) {
|
|
527
|
+
if (typeof encoding !== 'string' || encoding === '') {
|
|
528
|
+
encoding = 'utf8'
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
if (!Buffer.isEncoding(encoding)) {
|
|
532
|
+
throw new TypeError('Unknown encoding: ' + encoding)
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
var length = byteLength(string, encoding) | 0
|
|
536
|
+
var buf = createBuffer(length)
|
|
537
|
+
|
|
538
|
+
var actual = buf.write(string, encoding)
|
|
539
|
+
|
|
540
|
+
if (actual !== length) {
|
|
541
|
+
// Writing a hex string, for example, that contains invalid characters will
|
|
542
|
+
// cause everything after the first invalid character to be ignored. (e.g.
|
|
543
|
+
// 'abxxcd' will be treated as 'ab')
|
|
544
|
+
buf = buf.slice(0, actual)
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
return buf
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
function fromArrayLike (array) {
|
|
551
|
+
var length = array.length < 0 ? 0 : checked(array.length) | 0
|
|
552
|
+
var buf = createBuffer(length)
|
|
553
|
+
for (var i = 0; i < length; i += 1) {
|
|
554
|
+
buf[i] = array[i] & 255
|
|
555
|
+
}
|
|
556
|
+
return buf
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
function fromArrayBuffer (array, byteOffset, length) {
|
|
560
|
+
if (byteOffset < 0 || array.byteLength < byteOffset) {
|
|
561
|
+
throw new RangeError('"offset" is outside of buffer bounds')
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
if (array.byteLength < byteOffset + (length || 0)) {
|
|
565
|
+
throw new RangeError('"length" is outside of buffer bounds')
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
var buf
|
|
569
|
+
if (byteOffset === undefined && length === undefined) {
|
|
570
|
+
buf = new Uint8Array(array)
|
|
571
|
+
} else if (length === undefined) {
|
|
572
|
+
buf = new Uint8Array(array, byteOffset)
|
|
573
|
+
} else {
|
|
574
|
+
buf = new Uint8Array(array, byteOffset, length)
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
// Return an augmented `Uint8Array` instance
|
|
578
|
+
buf.__proto__ = Buffer.prototype
|
|
579
|
+
return buf
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
function fromObject (obj) {
|
|
583
|
+
if (Buffer.isBuffer(obj)) {
|
|
584
|
+
var len = checked(obj.length) | 0
|
|
585
|
+
var buf = createBuffer(len)
|
|
586
|
+
|
|
587
|
+
if (buf.length === 0) {
|
|
588
|
+
return buf
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
obj.copy(buf, 0, 0, len)
|
|
592
|
+
return buf
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
if (obj.length !== undefined) {
|
|
596
|
+
if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
|
|
597
|
+
return createBuffer(0)
|
|
598
|
+
}
|
|
599
|
+
return fromArrayLike(obj)
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
|
|
603
|
+
return fromArrayLike(obj.data)
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
function checked (length) {
|
|
608
|
+
// Note: cannot use `length < K_MAX_LENGTH` here because that fails when
|
|
609
|
+
// length is NaN (which is otherwise coerced to zero.)
|
|
610
|
+
if (length >= K_MAX_LENGTH) {
|
|
611
|
+
throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
|
|
612
|
+
'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
|
|
613
|
+
}
|
|
614
|
+
return length | 0
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
function SlowBuffer (length) {
|
|
618
|
+
if (+length != length) { // eslint-disable-line eqeqeq
|
|
619
|
+
length = 0
|
|
620
|
+
}
|
|
621
|
+
return Buffer.alloc(+length)
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
Buffer.isBuffer = function isBuffer (b) {
|
|
625
|
+
return b != null && b._isBuffer === true &&
|
|
626
|
+
b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
Buffer.compare = function compare (a, b) {
|
|
630
|
+
if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)
|
|
631
|
+
if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)
|
|
632
|
+
if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
|
|
633
|
+
throw new TypeError(
|
|
634
|
+
'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
|
|
635
|
+
)
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
if (a === b) return 0
|
|
639
|
+
|
|
640
|
+
var x = a.length
|
|
641
|
+
var y = b.length
|
|
642
|
+
|
|
643
|
+
for (var i = 0, len = Math.min(x, y); i < len; ++i) {
|
|
644
|
+
if (a[i] !== b[i]) {
|
|
645
|
+
x = a[i]
|
|
646
|
+
y = b[i]
|
|
647
|
+
break
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
if (x < y) return -1
|
|
652
|
+
if (y < x) return 1
|
|
653
|
+
return 0
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
Buffer.isEncoding = function isEncoding (encoding) {
|
|
657
|
+
switch (String(encoding).toLowerCase()) {
|
|
658
|
+
case 'hex':
|
|
659
|
+
case 'utf8':
|
|
660
|
+
case 'utf-8':
|
|
661
|
+
case 'ascii':
|
|
662
|
+
case 'latin1':
|
|
663
|
+
case 'binary':
|
|
664
|
+
case 'base64':
|
|
665
|
+
case 'ucs2':
|
|
666
|
+
case 'ucs-2':
|
|
667
|
+
case 'utf16le':
|
|
668
|
+
case 'utf-16le':
|
|
669
|
+
return true
|
|
670
|
+
default:
|
|
671
|
+
return false
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
Buffer.concat = function concat (list, length) {
|
|
676
|
+
if (!Array.isArray(list)) {
|
|
677
|
+
throw new TypeError('"list" argument must be an Array of Buffers')
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
if (list.length === 0) {
|
|
681
|
+
return Buffer.alloc(0)
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
var i
|
|
685
|
+
if (length === undefined) {
|
|
686
|
+
length = 0
|
|
687
|
+
for (i = 0; i < list.length; ++i) {
|
|
688
|
+
length += list[i].length
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
var buffer = Buffer.allocUnsafe(length)
|
|
693
|
+
var pos = 0
|
|
694
|
+
for (i = 0; i < list.length; ++i) {
|
|
695
|
+
var buf = list[i]
|
|
696
|
+
if (isInstance(buf, Uint8Array)) {
|
|
697
|
+
buf = Buffer.from(buf)
|
|
698
|
+
}
|
|
699
|
+
if (!Buffer.isBuffer(buf)) {
|
|
700
|
+
throw new TypeError('"list" argument must be an Array of Buffers')
|
|
701
|
+
}
|
|
702
|
+
buf.copy(buffer, pos)
|
|
703
|
+
pos += buf.length
|
|
704
|
+
}
|
|
705
|
+
return buffer
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
function byteLength (string, encoding) {
|
|
709
|
+
if (Buffer.isBuffer(string)) {
|
|
710
|
+
return string.length
|
|
711
|
+
}
|
|
712
|
+
if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {
|
|
713
|
+
return string.byteLength
|
|
714
|
+
}
|
|
715
|
+
if (typeof string !== 'string') {
|
|
716
|
+
throw new TypeError(
|
|
717
|
+
'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
|
|
718
|
+
'Received type ' + typeof string
|
|
719
|
+
)
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
var len = string.length
|
|
723
|
+
var mustMatch = (arguments.length > 2 && arguments[2] === true)
|
|
724
|
+
if (!mustMatch && len === 0) return 0
|
|
725
|
+
|
|
726
|
+
// Use a for loop to avoid recursion
|
|
727
|
+
var loweredCase = false
|
|
728
|
+
for (;;) {
|
|
729
|
+
switch (encoding) {
|
|
730
|
+
case 'ascii':
|
|
731
|
+
case 'latin1':
|
|
732
|
+
case 'binary':
|
|
733
|
+
return len
|
|
734
|
+
case 'utf8':
|
|
735
|
+
case 'utf-8':
|
|
736
|
+
return utf8ToBytes(string).length
|
|
737
|
+
case 'ucs2':
|
|
738
|
+
case 'ucs-2':
|
|
739
|
+
case 'utf16le':
|
|
740
|
+
case 'utf-16le':
|
|
741
|
+
return len * 2
|
|
742
|
+
case 'hex':
|
|
743
|
+
return len >>> 1
|
|
744
|
+
case 'base64':
|
|
745
|
+
return base64ToBytes(string).length
|
|
746
|
+
default:
|
|
747
|
+
if (loweredCase) {
|
|
748
|
+
return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8
|
|
749
|
+
}
|
|
750
|
+
encoding = ('' + encoding).toLowerCase()
|
|
751
|
+
loweredCase = true
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
Buffer.byteLength = byteLength
|
|
756
|
+
|
|
757
|
+
function slowToString (encoding, start, end) {
|
|
758
|
+
var loweredCase = false
|
|
759
|
+
|
|
760
|
+
// No need to verify that "this.length <= MAX_UINT32" since it's a read-only
|
|
761
|
+
// property of a typed array.
|
|
762
|
+
|
|
763
|
+
// This behaves neither like String nor Uint8Array in that we set start/end
|
|
764
|
+
// to their upper/lower bounds if the value passed is out of range.
|
|
765
|
+
// undefined is handled specially as per ECMA-262 6th Edition,
|
|
766
|
+
// Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
|
|
767
|
+
if (start === undefined || start < 0) {
|
|
768
|
+
start = 0
|
|
769
|
+
}
|
|
770
|
+
// Return early if start > this.length. Done here to prevent potential uint32
|
|
771
|
+
// coercion fail below.
|
|
772
|
+
if (start > this.length) {
|
|
773
|
+
return ''
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
if (end === undefined || end > this.length) {
|
|
777
|
+
end = this.length
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
if (end <= 0) {
|
|
781
|
+
return ''
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
// Force coersion to uint32. This will also coerce falsey/NaN values to 0.
|
|
785
|
+
end >>>= 0
|
|
786
|
+
start >>>= 0
|
|
787
|
+
|
|
788
|
+
if (end <= start) {
|
|
789
|
+
return ''
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
if (!encoding) encoding = 'utf8'
|
|
793
|
+
|
|
794
|
+
while (true) {
|
|
795
|
+
switch (encoding) {
|
|
796
|
+
case 'hex':
|
|
797
|
+
return hexSlice(this, start, end)
|
|
798
|
+
|
|
799
|
+
case 'utf8':
|
|
800
|
+
case 'utf-8':
|
|
801
|
+
return utf8Slice(this, start, end)
|
|
802
|
+
|
|
803
|
+
case 'ascii':
|
|
804
|
+
return asciiSlice(this, start, end)
|
|
805
|
+
|
|
806
|
+
case 'latin1':
|
|
807
|
+
case 'binary':
|
|
808
|
+
return latin1Slice(this, start, end)
|
|
809
|
+
|
|
810
|
+
case 'base64':
|
|
811
|
+
return base64Slice(this, start, end)
|
|
812
|
+
|
|
813
|
+
case 'ucs2':
|
|
814
|
+
case 'ucs-2':
|
|
815
|
+
case 'utf16le':
|
|
816
|
+
case 'utf-16le':
|
|
817
|
+
return utf16leSlice(this, start, end)
|
|
818
|
+
|
|
819
|
+
default:
|
|
820
|
+
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
|
|
821
|
+
encoding = (encoding + '').toLowerCase()
|
|
822
|
+
loweredCase = true
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
|
|
828
|
+
// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
|
|
829
|
+
// reliably in a browserify context because there could be multiple different
|
|
830
|
+
// copies of the 'buffer' package in use. This method works even for Buffer
|
|
831
|
+
// instances that were created from another copy of the `buffer` package.
|
|
832
|
+
// See: https://github.com/feross/buffer/issues/154
|
|
833
|
+
Buffer.prototype._isBuffer = true
|
|
834
|
+
|
|
835
|
+
function swap (b, n, m) {
|
|
836
|
+
var i = b[n]
|
|
837
|
+
b[n] = b[m]
|
|
838
|
+
b[m] = i
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
Buffer.prototype.swap16 = function swap16 () {
|
|
842
|
+
var len = this.length
|
|
843
|
+
if (len % 2 !== 0) {
|
|
844
|
+
throw new RangeError('Buffer size must be a multiple of 16-bits')
|
|
845
|
+
}
|
|
846
|
+
for (var i = 0; i < len; i += 2) {
|
|
847
|
+
swap(this, i, i + 1)
|
|
848
|
+
}
|
|
849
|
+
return this
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
Buffer.prototype.swap32 = function swap32 () {
|
|
853
|
+
var len = this.length
|
|
854
|
+
if (len % 4 !== 0) {
|
|
855
|
+
throw new RangeError('Buffer size must be a multiple of 32-bits')
|
|
856
|
+
}
|
|
857
|
+
for (var i = 0; i < len; i += 4) {
|
|
858
|
+
swap(this, i, i + 3)
|
|
859
|
+
swap(this, i + 1, i + 2)
|
|
860
|
+
}
|
|
861
|
+
return this
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
Buffer.prototype.swap64 = function swap64 () {
|
|
865
|
+
var len = this.length
|
|
866
|
+
if (len % 8 !== 0) {
|
|
867
|
+
throw new RangeError('Buffer size must be a multiple of 64-bits')
|
|
868
|
+
}
|
|
869
|
+
for (var i = 0; i < len; i += 8) {
|
|
870
|
+
swap(this, i, i + 7)
|
|
871
|
+
swap(this, i + 1, i + 6)
|
|
872
|
+
swap(this, i + 2, i + 5)
|
|
873
|
+
swap(this, i + 3, i + 4)
|
|
874
|
+
}
|
|
875
|
+
return this
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
Buffer.prototype.toString = function toString () {
|
|
879
|
+
var length = this.length
|
|
880
|
+
if (length === 0) return ''
|
|
881
|
+
if (arguments.length === 0) return utf8Slice(this, 0, length)
|
|
882
|
+
return slowToString.apply(this, arguments)
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
Buffer.prototype.toLocaleString = Buffer.prototype.toString
|
|
886
|
+
|
|
887
|
+
Buffer.prototype.equals = function equals (b) {
|
|
888
|
+
if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
|
|
889
|
+
if (this === b) return true
|
|
890
|
+
return Buffer.compare(this, b) === 0
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
Buffer.prototype.inspect = function inspect () {
|
|
894
|
+
var str = ''
|
|
895
|
+
var max = exports.INSPECT_MAX_BYTES
|
|
896
|
+
str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()
|
|
897
|
+
if (this.length > max) str += ' ... '
|
|
898
|
+
return '<Buffer ' + str + '>'
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
|
|
902
|
+
if (isInstance(target, Uint8Array)) {
|
|
903
|
+
target = Buffer.from(target, target.offset, target.byteLength)
|
|
904
|
+
}
|
|
905
|
+
if (!Buffer.isBuffer(target)) {
|
|
906
|
+
throw new TypeError(
|
|
907
|
+
'The "target" argument must be one of type Buffer or Uint8Array. ' +
|
|
908
|
+
'Received type ' + (typeof target)
|
|
909
|
+
)
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
if (start === undefined) {
|
|
913
|
+
start = 0
|
|
914
|
+
}
|
|
915
|
+
if (end === undefined) {
|
|
916
|
+
end = target ? target.length : 0
|
|
917
|
+
}
|
|
918
|
+
if (thisStart === undefined) {
|
|
919
|
+
thisStart = 0
|
|
920
|
+
}
|
|
921
|
+
if (thisEnd === undefined) {
|
|
922
|
+
thisEnd = this.length
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
|
|
926
|
+
throw new RangeError('out of range index')
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
if (thisStart >= thisEnd && start >= end) {
|
|
930
|
+
return 0
|
|
931
|
+
}
|
|
932
|
+
if (thisStart >= thisEnd) {
|
|
933
|
+
return -1
|
|
934
|
+
}
|
|
935
|
+
if (start >= end) {
|
|
936
|
+
return 1
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
start >>>= 0
|
|
940
|
+
end >>>= 0
|
|
941
|
+
thisStart >>>= 0
|
|
942
|
+
thisEnd >>>= 0
|
|
943
|
+
|
|
944
|
+
if (this === target) return 0
|
|
945
|
+
|
|
946
|
+
var x = thisEnd - thisStart
|
|
947
|
+
var y = end - start
|
|
948
|
+
var len = Math.min(x, y)
|
|
949
|
+
|
|
950
|
+
var thisCopy = this.slice(thisStart, thisEnd)
|
|
951
|
+
var targetCopy = target.slice(start, end)
|
|
952
|
+
|
|
953
|
+
for (var i = 0; i < len; ++i) {
|
|
954
|
+
if (thisCopy[i] !== targetCopy[i]) {
|
|
955
|
+
x = thisCopy[i]
|
|
956
|
+
y = targetCopy[i]
|
|
957
|
+
break
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
if (x < y) return -1
|
|
962
|
+
if (y < x) return 1
|
|
963
|
+
return 0
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
|
|
967
|
+
// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
|
|
968
|
+
//
|
|
969
|
+
// Arguments:
|
|
970
|
+
// - buffer - a Buffer to search
|
|
971
|
+
// - val - a string, Buffer, or number
|
|
972
|
+
// - byteOffset - an index into `buffer`; will be clamped to an int32
|
|
973
|
+
// - encoding - an optional encoding, relevant is val is a string
|
|
974
|
+
// - dir - true for indexOf, false for lastIndexOf
|
|
975
|
+
function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
|
|
976
|
+
// Empty buffer means no match
|
|
977
|
+
if (buffer.length === 0) return -1
|
|
978
|
+
|
|
979
|
+
// Normalize byteOffset
|
|
980
|
+
if (typeof byteOffset === 'string') {
|
|
981
|
+
encoding = byteOffset
|
|
982
|
+
byteOffset = 0
|
|
983
|
+
} else if (byteOffset > 0x7fffffff) {
|
|
984
|
+
byteOffset = 0x7fffffff
|
|
985
|
+
} else if (byteOffset < -0x80000000) {
|
|
986
|
+
byteOffset = -0x80000000
|
|
987
|
+
}
|
|
988
|
+
byteOffset = +byteOffset // Coerce to Number.
|
|
989
|
+
if (numberIsNaN(byteOffset)) {
|
|
990
|
+
// byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
|
|
991
|
+
byteOffset = dir ? 0 : (buffer.length - 1)
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
// Normalize byteOffset: negative offsets start from the end of the buffer
|
|
995
|
+
if (byteOffset < 0) byteOffset = buffer.length + byteOffset
|
|
996
|
+
if (byteOffset >= buffer.length) {
|
|
997
|
+
if (dir) return -1
|
|
998
|
+
else byteOffset = buffer.length - 1
|
|
999
|
+
} else if (byteOffset < 0) {
|
|
1000
|
+
if (dir) byteOffset = 0
|
|
1001
|
+
else return -1
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
// Normalize val
|
|
1005
|
+
if (typeof val === 'string') {
|
|
1006
|
+
val = Buffer.from(val, encoding)
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
// Finally, search either indexOf (if dir is true) or lastIndexOf
|
|
1010
|
+
if (Buffer.isBuffer(val)) {
|
|
1011
|
+
// Special case: looking for empty string/buffer always fails
|
|
1012
|
+
if (val.length === 0) {
|
|
1013
|
+
return -1
|
|
1014
|
+
}
|
|
1015
|
+
return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
|
|
1016
|
+
} else if (typeof val === 'number') {
|
|
1017
|
+
val = val & 0xFF // Search for a byte value [0-255]
|
|
1018
|
+
if (typeof Uint8Array.prototype.indexOf === 'function') {
|
|
1019
|
+
if (dir) {
|
|
1020
|
+
return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
|
|
1021
|
+
} else {
|
|
1022
|
+
return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
throw new TypeError('val must be string, number or Buffer')
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
|
|
1032
|
+
var indexSize = 1
|
|
1033
|
+
var arrLength = arr.length
|
|
1034
|
+
var valLength = val.length
|
|
1035
|
+
|
|
1036
|
+
if (encoding !== undefined) {
|
|
1037
|
+
encoding = String(encoding).toLowerCase()
|
|
1038
|
+
if (encoding === 'ucs2' || encoding === 'ucs-2' ||
|
|
1039
|
+
encoding === 'utf16le' || encoding === 'utf-16le') {
|
|
1040
|
+
if (arr.length < 2 || val.length < 2) {
|
|
1041
|
+
return -1
|
|
1042
|
+
}
|
|
1043
|
+
indexSize = 2
|
|
1044
|
+
arrLength /= 2
|
|
1045
|
+
valLength /= 2
|
|
1046
|
+
byteOffset /= 2
|
|
1047
|
+
}
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
function read (buf, i) {
|
|
1051
|
+
if (indexSize === 1) {
|
|
1052
|
+
return buf[i]
|
|
1053
|
+
} else {
|
|
1054
|
+
return buf.readUInt16BE(i * indexSize)
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1058
|
+
var i
|
|
1059
|
+
if (dir) {
|
|
1060
|
+
var foundIndex = -1
|
|
1061
|
+
for (i = byteOffset; i < arrLength; i++) {
|
|
1062
|
+
if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
|
|
1063
|
+
if (foundIndex === -1) foundIndex = i
|
|
1064
|
+
if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
|
|
1065
|
+
} else {
|
|
1066
|
+
if (foundIndex !== -1) i -= i - foundIndex
|
|
1067
|
+
foundIndex = -1
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
} else {
|
|
1071
|
+
if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
|
|
1072
|
+
for (i = byteOffset; i >= 0; i--) {
|
|
1073
|
+
var found = true
|
|
1074
|
+
for (var j = 0; j < valLength; j++) {
|
|
1075
|
+
if (read(arr, i + j) !== read(val, j)) {
|
|
1076
|
+
found = false
|
|
1077
|
+
break
|
|
1078
|
+
}
|
|
1079
|
+
}
|
|
1080
|
+
if (found) return i
|
|
1081
|
+
}
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
return -1
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
|
|
1088
|
+
return this.indexOf(val, byteOffset, encoding) !== -1
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
|
|
1092
|
+
return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
|
|
1096
|
+
return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
function hexWrite (buf, string, offset, length) {
|
|
1100
|
+
offset = Number(offset) || 0
|
|
1101
|
+
var remaining = buf.length - offset
|
|
1102
|
+
if (!length) {
|
|
1103
|
+
length = remaining
|
|
1104
|
+
} else {
|
|
1105
|
+
length = Number(length)
|
|
1106
|
+
if (length > remaining) {
|
|
1107
|
+
length = remaining
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1111
|
+
var strLen = string.length
|
|
1112
|
+
|
|
1113
|
+
if (length > strLen / 2) {
|
|
1114
|
+
length = strLen / 2
|
|
1115
|
+
}
|
|
1116
|
+
for (var i = 0; i < length; ++i) {
|
|
1117
|
+
var parsed = parseInt(string.substr(i * 2, 2), 16)
|
|
1118
|
+
if (numberIsNaN(parsed)) return i
|
|
1119
|
+
buf[offset + i] = parsed
|
|
1120
|
+
}
|
|
1121
|
+
return i
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
function utf8Write (buf, string, offset, length) {
|
|
1125
|
+
return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
function asciiWrite (buf, string, offset, length) {
|
|
1129
|
+
return blitBuffer(asciiToBytes(string), buf, offset, length)
|
|
1130
|
+
}
|
|
1131
|
+
|
|
1132
|
+
function latin1Write (buf, string, offset, length) {
|
|
1133
|
+
return asciiWrite(buf, string, offset, length)
|
|
1134
|
+
}
|
|
1135
|
+
|
|
1136
|
+
function base64Write (buf, string, offset, length) {
|
|
1137
|
+
return blitBuffer(base64ToBytes(string), buf, offset, length)
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
function ucs2Write (buf, string, offset, length) {
|
|
1141
|
+
return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1144
|
+
Buffer.prototype.write = function write (string, offset, length, encoding) {
|
|
1145
|
+
// Buffer#write(string)
|
|
1146
|
+
if (offset === undefined) {
|
|
1147
|
+
encoding = 'utf8'
|
|
1148
|
+
length = this.length
|
|
1149
|
+
offset = 0
|
|
1150
|
+
// Buffer#write(string, encoding)
|
|
1151
|
+
} else if (length === undefined && typeof offset === 'string') {
|
|
1152
|
+
encoding = offset
|
|
1153
|
+
length = this.length
|
|
1154
|
+
offset = 0
|
|
1155
|
+
// Buffer#write(string, offset[, length][, encoding])
|
|
1156
|
+
} else if (isFinite(offset)) {
|
|
1157
|
+
offset = offset >>> 0
|
|
1158
|
+
if (isFinite(length)) {
|
|
1159
|
+
length = length >>> 0
|
|
1160
|
+
if (encoding === undefined) encoding = 'utf8'
|
|
1161
|
+
} else {
|
|
1162
|
+
encoding = length
|
|
1163
|
+
length = undefined
|
|
1164
|
+
}
|
|
1165
|
+
} else {
|
|
1166
|
+
throw new Error(
|
|
1167
|
+
'Buffer.write(string, encoding, offset[, length]) is no longer supported'
|
|
1168
|
+
)
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
var remaining = this.length - offset
|
|
1172
|
+
if (length === undefined || length > remaining) length = remaining
|
|
1173
|
+
|
|
1174
|
+
if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
|
|
1175
|
+
throw new RangeError('Attempt to write outside buffer bounds')
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
if (!encoding) encoding = 'utf8'
|
|
1179
|
+
|
|
1180
|
+
var loweredCase = false
|
|
1181
|
+
for (;;) {
|
|
1182
|
+
switch (encoding) {
|
|
1183
|
+
case 'hex':
|
|
1184
|
+
return hexWrite(this, string, offset, length)
|
|
1185
|
+
|
|
1186
|
+
case 'utf8':
|
|
1187
|
+
case 'utf-8':
|
|
1188
|
+
return utf8Write(this, string, offset, length)
|
|
1189
|
+
|
|
1190
|
+
case 'ascii':
|
|
1191
|
+
return asciiWrite(this, string, offset, length)
|
|
1192
|
+
|
|
1193
|
+
case 'latin1':
|
|
1194
|
+
case 'binary':
|
|
1195
|
+
return latin1Write(this, string, offset, length)
|
|
1196
|
+
|
|
1197
|
+
case 'base64':
|
|
1198
|
+
// Warning: maxLength not taken into account in base64Write
|
|
1199
|
+
return base64Write(this, string, offset, length)
|
|
1200
|
+
|
|
1201
|
+
case 'ucs2':
|
|
1202
|
+
case 'ucs-2':
|
|
1203
|
+
case 'utf16le':
|
|
1204
|
+
case 'utf-16le':
|
|
1205
|
+
return ucs2Write(this, string, offset, length)
|
|
1206
|
+
|
|
1207
|
+
default:
|
|
1208
|
+
if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
|
|
1209
|
+
encoding = ('' + encoding).toLowerCase()
|
|
1210
|
+
loweredCase = true
|
|
1211
|
+
}
|
|
1212
|
+
}
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
Buffer.prototype.toJSON = function toJSON () {
|
|
1216
|
+
return {
|
|
1217
|
+
type: 'Buffer',
|
|
1218
|
+
data: Array.prototype.slice.call(this._arr || this, 0)
|
|
1219
|
+
}
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
function base64Slice (buf, start, end) {
|
|
1223
|
+
if (start === 0 && end === buf.length) {
|
|
1224
|
+
return base64.fromByteArray(buf)
|
|
1225
|
+
} else {
|
|
1226
|
+
return base64.fromByteArray(buf.slice(start, end))
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
function utf8Slice (buf, start, end) {
|
|
1231
|
+
end = Math.min(buf.length, end)
|
|
1232
|
+
var res = []
|
|
1233
|
+
|
|
1234
|
+
var i = start
|
|
1235
|
+
while (i < end) {
|
|
1236
|
+
var firstByte = buf[i]
|
|
1237
|
+
var codePoint = null
|
|
1238
|
+
var bytesPerSequence = (firstByte > 0xEF) ? 4
|
|
1239
|
+
: (firstByte > 0xDF) ? 3
|
|
1240
|
+
: (firstByte > 0xBF) ? 2
|
|
1241
|
+
: 1
|
|
1242
|
+
|
|
1243
|
+
if (i + bytesPerSequence <= end) {
|
|
1244
|
+
var secondByte, thirdByte, fourthByte, tempCodePoint
|
|
1245
|
+
|
|
1246
|
+
switch (bytesPerSequence) {
|
|
1247
|
+
case 1:
|
|
1248
|
+
if (firstByte < 0x80) {
|
|
1249
|
+
codePoint = firstByte
|
|
1250
|
+
}
|
|
1251
|
+
break
|
|
1252
|
+
case 2:
|
|
1253
|
+
secondByte = buf[i + 1]
|
|
1254
|
+
if ((secondByte & 0xC0) === 0x80) {
|
|
1255
|
+
tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
|
|
1256
|
+
if (tempCodePoint > 0x7F) {
|
|
1257
|
+
codePoint = tempCodePoint
|
|
1258
|
+
}
|
|
1259
|
+
}
|
|
1260
|
+
break
|
|
1261
|
+
case 3:
|
|
1262
|
+
secondByte = buf[i + 1]
|
|
1263
|
+
thirdByte = buf[i + 2]
|
|
1264
|
+
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
|
|
1265
|
+
tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
|
|
1266
|
+
if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
|
|
1267
|
+
codePoint = tempCodePoint
|
|
1268
|
+
}
|
|
1269
|
+
}
|
|
1270
|
+
break
|
|
1271
|
+
case 4:
|
|
1272
|
+
secondByte = buf[i + 1]
|
|
1273
|
+
thirdByte = buf[i + 2]
|
|
1274
|
+
fourthByte = buf[i + 3]
|
|
1275
|
+
if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
|
|
1276
|
+
tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
|
|
1277
|
+
if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
|
|
1278
|
+
codePoint = tempCodePoint
|
|
1279
|
+
}
|
|
1280
|
+
}
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1283
|
+
|
|
1284
|
+
if (codePoint === null) {
|
|
1285
|
+
// we did not generate a valid codePoint so insert a
|
|
1286
|
+
// replacement char (U+FFFD) and advance only 1 byte
|
|
1287
|
+
codePoint = 0xFFFD
|
|
1288
|
+
bytesPerSequence = 1
|
|
1289
|
+
} else if (codePoint > 0xFFFF) {
|
|
1290
|
+
// encode to utf16 (surrogate pair dance)
|
|
1291
|
+
codePoint -= 0x10000
|
|
1292
|
+
res.push(codePoint >>> 10 & 0x3FF | 0xD800)
|
|
1293
|
+
codePoint = 0xDC00 | codePoint & 0x3FF
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1296
|
+
res.push(codePoint)
|
|
1297
|
+
i += bytesPerSequence
|
|
1298
|
+
}
|
|
1299
|
+
|
|
1300
|
+
return decodeCodePointsArray(res)
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
// Based on http://stackoverflow.com/a/22747272/680742, the browser with
|
|
1304
|
+
// the lowest limit is Chrome, with 0x10000 args.
|
|
1305
|
+
// We go 1 magnitude less, for safety
|
|
1306
|
+
var MAX_ARGUMENTS_LENGTH = 0x1000
|
|
1307
|
+
|
|
1308
|
+
function decodeCodePointsArray (codePoints) {
|
|
1309
|
+
var len = codePoints.length
|
|
1310
|
+
if (len <= MAX_ARGUMENTS_LENGTH) {
|
|
1311
|
+
return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
|
|
1312
|
+
}
|
|
1313
|
+
|
|
1314
|
+
// Decode in chunks to avoid "call stack size exceeded".
|
|
1315
|
+
var res = ''
|
|
1316
|
+
var i = 0
|
|
1317
|
+
while (i < len) {
|
|
1318
|
+
res += String.fromCharCode.apply(
|
|
1319
|
+
String,
|
|
1320
|
+
codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
|
|
1321
|
+
)
|
|
1322
|
+
}
|
|
1323
|
+
return res
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
function asciiSlice (buf, start, end) {
|
|
1327
|
+
var ret = ''
|
|
1328
|
+
end = Math.min(buf.length, end)
|
|
1329
|
+
|
|
1330
|
+
for (var i = start; i < end; ++i) {
|
|
1331
|
+
ret += String.fromCharCode(buf[i] & 0x7F)
|
|
1332
|
+
}
|
|
1333
|
+
return ret
|
|
1334
|
+
}
|
|
1335
|
+
|
|
1336
|
+
function latin1Slice (buf, start, end) {
|
|
1337
|
+
var ret = ''
|
|
1338
|
+
end = Math.min(buf.length, end)
|
|
1339
|
+
|
|
1340
|
+
for (var i = start; i < end; ++i) {
|
|
1341
|
+
ret += String.fromCharCode(buf[i])
|
|
1342
|
+
}
|
|
1343
|
+
return ret
|
|
1344
|
+
}
|
|
1345
|
+
|
|
1346
|
+
function hexSlice (buf, start, end) {
|
|
1347
|
+
var len = buf.length
|
|
1348
|
+
|
|
1349
|
+
if (!start || start < 0) start = 0
|
|
1350
|
+
if (!end || end < 0 || end > len) end = len
|
|
1351
|
+
|
|
1352
|
+
var out = ''
|
|
1353
|
+
for (var i = start; i < end; ++i) {
|
|
1354
|
+
out += toHex(buf[i])
|
|
1355
|
+
}
|
|
1356
|
+
return out
|
|
1357
|
+
}
|
|
1358
|
+
|
|
1359
|
+
function utf16leSlice (buf, start, end) {
|
|
1360
|
+
var bytes = buf.slice(start, end)
|
|
1361
|
+
var res = ''
|
|
1362
|
+
for (var i = 0; i < bytes.length; i += 2) {
|
|
1363
|
+
res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
|
|
1364
|
+
}
|
|
1365
|
+
return res
|
|
1366
|
+
}
|
|
1367
|
+
|
|
1368
|
+
Buffer.prototype.slice = function slice (start, end) {
|
|
1369
|
+
var len = this.length
|
|
1370
|
+
start = ~~start
|
|
1371
|
+
end = end === undefined ? len : ~~end
|
|
1372
|
+
|
|
1373
|
+
if (start < 0) {
|
|
1374
|
+
start += len
|
|
1375
|
+
if (start < 0) start = 0
|
|
1376
|
+
} else if (start > len) {
|
|
1377
|
+
start = len
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
if (end < 0) {
|
|
1381
|
+
end += len
|
|
1382
|
+
if (end < 0) end = 0
|
|
1383
|
+
} else if (end > len) {
|
|
1384
|
+
end = len
|
|
1385
|
+
}
|
|
1386
|
+
|
|
1387
|
+
if (end < start) end = start
|
|
1388
|
+
|
|
1389
|
+
var newBuf = this.subarray(start, end)
|
|
1390
|
+
// Return an augmented `Uint8Array` instance
|
|
1391
|
+
newBuf.__proto__ = Buffer.prototype
|
|
1392
|
+
return newBuf
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
/*
|
|
1396
|
+
* Need to make sure that buffer isn't trying to write out of bounds.
|
|
1397
|
+
*/
|
|
1398
|
+
function checkOffset (offset, ext, length) {
|
|
1399
|
+
if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
|
|
1400
|
+
if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
|
|
1401
|
+
}
|
|
1402
|
+
|
|
1403
|
+
Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
|
|
1404
|
+
offset = offset >>> 0
|
|
1405
|
+
byteLength = byteLength >>> 0
|
|
1406
|
+
if (!noAssert) checkOffset(offset, byteLength, this.length)
|
|
1407
|
+
|
|
1408
|
+
var val = this[offset]
|
|
1409
|
+
var mul = 1
|
|
1410
|
+
var i = 0
|
|
1411
|
+
while (++i < byteLength && (mul *= 0x100)) {
|
|
1412
|
+
val += this[offset + i] * mul
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
return val
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1418
|
+
Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
|
|
1419
|
+
offset = offset >>> 0
|
|
1420
|
+
byteLength = byteLength >>> 0
|
|
1421
|
+
if (!noAssert) {
|
|
1422
|
+
checkOffset(offset, byteLength, this.length)
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
var val = this[offset + --byteLength]
|
|
1426
|
+
var mul = 1
|
|
1427
|
+
while (byteLength > 0 && (mul *= 0x100)) {
|
|
1428
|
+
val += this[offset + --byteLength] * mul
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
return val
|
|
1432
|
+
}
|
|
1433
|
+
|
|
1434
|
+
Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
|
|
1435
|
+
offset = offset >>> 0
|
|
1436
|
+
if (!noAssert) checkOffset(offset, 1, this.length)
|
|
1437
|
+
return this[offset]
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
|
|
1441
|
+
offset = offset >>> 0
|
|
1442
|
+
if (!noAssert) checkOffset(offset, 2, this.length)
|
|
1443
|
+
return this[offset] | (this[offset + 1] << 8)
|
|
1444
|
+
}
|
|
1445
|
+
|
|
1446
|
+
Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
|
|
1447
|
+
offset = offset >>> 0
|
|
1448
|
+
if (!noAssert) checkOffset(offset, 2, this.length)
|
|
1449
|
+
return (this[offset] << 8) | this[offset + 1]
|
|
1450
|
+
}
|
|
1451
|
+
|
|
1452
|
+
Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
|
|
1453
|
+
offset = offset >>> 0
|
|
1454
|
+
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
1455
|
+
|
|
1456
|
+
return ((this[offset]) |
|
|
1457
|
+
(this[offset + 1] << 8) |
|
|
1458
|
+
(this[offset + 2] << 16)) +
|
|
1459
|
+
(this[offset + 3] * 0x1000000)
|
|
1460
|
+
}
|
|
1461
|
+
|
|
1462
|
+
Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
|
|
1463
|
+
offset = offset >>> 0
|
|
1464
|
+
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
1465
|
+
|
|
1466
|
+
return (this[offset] * 0x1000000) +
|
|
1467
|
+
((this[offset + 1] << 16) |
|
|
1468
|
+
(this[offset + 2] << 8) |
|
|
1469
|
+
this[offset + 3])
|
|
1470
|
+
}
|
|
1471
|
+
|
|
1472
|
+
Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
|
|
1473
|
+
offset = offset >>> 0
|
|
1474
|
+
byteLength = byteLength >>> 0
|
|
1475
|
+
if (!noAssert) checkOffset(offset, byteLength, this.length)
|
|
1476
|
+
|
|
1477
|
+
var val = this[offset]
|
|
1478
|
+
var mul = 1
|
|
1479
|
+
var i = 0
|
|
1480
|
+
while (++i < byteLength && (mul *= 0x100)) {
|
|
1481
|
+
val += this[offset + i] * mul
|
|
1482
|
+
}
|
|
1483
|
+
mul *= 0x80
|
|
1484
|
+
|
|
1485
|
+
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
|
|
1486
|
+
|
|
1487
|
+
return val
|
|
1488
|
+
}
|
|
1489
|
+
|
|
1490
|
+
Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
|
|
1491
|
+
offset = offset >>> 0
|
|
1492
|
+
byteLength = byteLength >>> 0
|
|
1493
|
+
if (!noAssert) checkOffset(offset, byteLength, this.length)
|
|
1494
|
+
|
|
1495
|
+
var i = byteLength
|
|
1496
|
+
var mul = 1
|
|
1497
|
+
var val = this[offset + --i]
|
|
1498
|
+
while (i > 0 && (mul *= 0x100)) {
|
|
1499
|
+
val += this[offset + --i] * mul
|
|
1500
|
+
}
|
|
1501
|
+
mul *= 0x80
|
|
1502
|
+
|
|
1503
|
+
if (val >= mul) val -= Math.pow(2, 8 * byteLength)
|
|
1504
|
+
|
|
1505
|
+
return val
|
|
1506
|
+
}
|
|
1507
|
+
|
|
1508
|
+
Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
|
|
1509
|
+
offset = offset >>> 0
|
|
1510
|
+
if (!noAssert) checkOffset(offset, 1, this.length)
|
|
1511
|
+
if (!(this[offset] & 0x80)) return (this[offset])
|
|
1512
|
+
return ((0xff - this[offset] + 1) * -1)
|
|
1513
|
+
}
|
|
1514
|
+
|
|
1515
|
+
Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
|
|
1516
|
+
offset = offset >>> 0
|
|
1517
|
+
if (!noAssert) checkOffset(offset, 2, this.length)
|
|
1518
|
+
var val = this[offset] | (this[offset + 1] << 8)
|
|
1519
|
+
return (val & 0x8000) ? val | 0xFFFF0000 : val
|
|
1520
|
+
}
|
|
1521
|
+
|
|
1522
|
+
Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
|
|
1523
|
+
offset = offset >>> 0
|
|
1524
|
+
if (!noAssert) checkOffset(offset, 2, this.length)
|
|
1525
|
+
var val = this[offset + 1] | (this[offset] << 8)
|
|
1526
|
+
return (val & 0x8000) ? val | 0xFFFF0000 : val
|
|
1527
|
+
}
|
|
1528
|
+
|
|
1529
|
+
Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
|
|
1530
|
+
offset = offset >>> 0
|
|
1531
|
+
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
1532
|
+
|
|
1533
|
+
return (this[offset]) |
|
|
1534
|
+
(this[offset + 1] << 8) |
|
|
1535
|
+
(this[offset + 2] << 16) |
|
|
1536
|
+
(this[offset + 3] << 24)
|
|
1537
|
+
}
|
|
1538
|
+
|
|
1539
|
+
Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
|
|
1540
|
+
offset = offset >>> 0
|
|
1541
|
+
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
1542
|
+
|
|
1543
|
+
return (this[offset] << 24) |
|
|
1544
|
+
(this[offset + 1] << 16) |
|
|
1545
|
+
(this[offset + 2] << 8) |
|
|
1546
|
+
(this[offset + 3])
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
|
|
1550
|
+
offset = offset >>> 0
|
|
1551
|
+
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
1552
|
+
return ieee754.read(this, offset, true, 23, 4)
|
|
1553
|
+
}
|
|
1554
|
+
|
|
1555
|
+
Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
|
|
1556
|
+
offset = offset >>> 0
|
|
1557
|
+
if (!noAssert) checkOffset(offset, 4, this.length)
|
|
1558
|
+
return ieee754.read(this, offset, false, 23, 4)
|
|
1559
|
+
}
|
|
1560
|
+
|
|
1561
|
+
Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
|
|
1562
|
+
offset = offset >>> 0
|
|
1563
|
+
if (!noAssert) checkOffset(offset, 8, this.length)
|
|
1564
|
+
return ieee754.read(this, offset, true, 52, 8)
|
|
1565
|
+
}
|
|
1566
|
+
|
|
1567
|
+
Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
|
|
1568
|
+
offset = offset >>> 0
|
|
1569
|
+
if (!noAssert) checkOffset(offset, 8, this.length)
|
|
1570
|
+
return ieee754.read(this, offset, false, 52, 8)
|
|
1571
|
+
}
|
|
1572
|
+
|
|
1573
|
+
function checkInt (buf, value, offset, ext, max, min) {
|
|
1574
|
+
if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
|
|
1575
|
+
if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
|
|
1576
|
+
if (offset + ext > buf.length) throw new RangeError('Index out of range')
|
|
1577
|
+
}
|
|
1578
|
+
|
|
1579
|
+
Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
|
|
1580
|
+
value = +value
|
|
1581
|
+
offset = offset >>> 0
|
|
1582
|
+
byteLength = byteLength >>> 0
|
|
1583
|
+
if (!noAssert) {
|
|
1584
|
+
var maxBytes = Math.pow(2, 8 * byteLength) - 1
|
|
1585
|
+
checkInt(this, value, offset, byteLength, maxBytes, 0)
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
var mul = 1
|
|
1589
|
+
var i = 0
|
|
1590
|
+
this[offset] = value & 0xFF
|
|
1591
|
+
while (++i < byteLength && (mul *= 0x100)) {
|
|
1592
|
+
this[offset + i] = (value / mul) & 0xFF
|
|
1593
|
+
}
|
|
1594
|
+
|
|
1595
|
+
return offset + byteLength
|
|
1596
|
+
}
|
|
1597
|
+
|
|
1598
|
+
Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
|
|
1599
|
+
value = +value
|
|
1600
|
+
offset = offset >>> 0
|
|
1601
|
+
byteLength = byteLength >>> 0
|
|
1602
|
+
if (!noAssert) {
|
|
1603
|
+
var maxBytes = Math.pow(2, 8 * byteLength) - 1
|
|
1604
|
+
checkInt(this, value, offset, byteLength, maxBytes, 0)
|
|
1605
|
+
}
|
|
1606
|
+
|
|
1607
|
+
var i = byteLength - 1
|
|
1608
|
+
var mul = 1
|
|
1609
|
+
this[offset + i] = value & 0xFF
|
|
1610
|
+
while (--i >= 0 && (mul *= 0x100)) {
|
|
1611
|
+
this[offset + i] = (value / mul) & 0xFF
|
|
1612
|
+
}
|
|
1613
|
+
|
|
1614
|
+
return offset + byteLength
|
|
1615
|
+
}
|
|
1616
|
+
|
|
1617
|
+
Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
|
|
1618
|
+
value = +value
|
|
1619
|
+
offset = offset >>> 0
|
|
1620
|
+
if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
|
|
1621
|
+
this[offset] = (value & 0xff)
|
|
1622
|
+
return offset + 1
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1625
|
+
Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
|
|
1626
|
+
value = +value
|
|
1627
|
+
offset = offset >>> 0
|
|
1628
|
+
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
|
|
1629
|
+
this[offset] = (value & 0xff)
|
|
1630
|
+
this[offset + 1] = (value >>> 8)
|
|
1631
|
+
return offset + 2
|
|
1632
|
+
}
|
|
1633
|
+
|
|
1634
|
+
Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
|
|
1635
|
+
value = +value
|
|
1636
|
+
offset = offset >>> 0
|
|
1637
|
+
if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
|
|
1638
|
+
this[offset] = (value >>> 8)
|
|
1639
|
+
this[offset + 1] = (value & 0xff)
|
|
1640
|
+
return offset + 2
|
|
1641
|
+
}
|
|
1642
|
+
|
|
1643
|
+
Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
|
|
1644
|
+
value = +value
|
|
1645
|
+
offset = offset >>> 0
|
|
1646
|
+
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
|
|
1647
|
+
this[offset + 3] = (value >>> 24)
|
|
1648
|
+
this[offset + 2] = (value >>> 16)
|
|
1649
|
+
this[offset + 1] = (value >>> 8)
|
|
1650
|
+
this[offset] = (value & 0xff)
|
|
1651
|
+
return offset + 4
|
|
1652
|
+
}
|
|
1653
|
+
|
|
1654
|
+
Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
|
|
1655
|
+
value = +value
|
|
1656
|
+
offset = offset >>> 0
|
|
1657
|
+
if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
|
|
1658
|
+
this[offset] = (value >>> 24)
|
|
1659
|
+
this[offset + 1] = (value >>> 16)
|
|
1660
|
+
this[offset + 2] = (value >>> 8)
|
|
1661
|
+
this[offset + 3] = (value & 0xff)
|
|
1662
|
+
return offset + 4
|
|
1663
|
+
}
|
|
1664
|
+
|
|
1665
|
+
Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
|
|
1666
|
+
value = +value
|
|
1667
|
+
offset = offset >>> 0
|
|
1668
|
+
if (!noAssert) {
|
|
1669
|
+
var limit = Math.pow(2, (8 * byteLength) - 1)
|
|
1670
|
+
|
|
1671
|
+
checkInt(this, value, offset, byteLength, limit - 1, -limit)
|
|
1672
|
+
}
|
|
1673
|
+
|
|
1674
|
+
var i = 0
|
|
1675
|
+
var mul = 1
|
|
1676
|
+
var sub = 0
|
|
1677
|
+
this[offset] = value & 0xFF
|
|
1678
|
+
while (++i < byteLength && (mul *= 0x100)) {
|
|
1679
|
+
if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
|
|
1680
|
+
sub = 1
|
|
1681
|
+
}
|
|
1682
|
+
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
|
|
1683
|
+
}
|
|
1684
|
+
|
|
1685
|
+
return offset + byteLength
|
|
1686
|
+
}
|
|
1687
|
+
|
|
1688
|
+
Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
|
|
1689
|
+
value = +value
|
|
1690
|
+
offset = offset >>> 0
|
|
1691
|
+
if (!noAssert) {
|
|
1692
|
+
var limit = Math.pow(2, (8 * byteLength) - 1)
|
|
1693
|
+
|
|
1694
|
+
checkInt(this, value, offset, byteLength, limit - 1, -limit)
|
|
1695
|
+
}
|
|
1696
|
+
|
|
1697
|
+
var i = byteLength - 1
|
|
1698
|
+
var mul = 1
|
|
1699
|
+
var sub = 0
|
|
1700
|
+
this[offset + i] = value & 0xFF
|
|
1701
|
+
while (--i >= 0 && (mul *= 0x100)) {
|
|
1702
|
+
if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
|
|
1703
|
+
sub = 1
|
|
1704
|
+
}
|
|
1705
|
+
this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
|
|
1706
|
+
}
|
|
1707
|
+
|
|
1708
|
+
return offset + byteLength
|
|
1709
|
+
}
|
|
1710
|
+
|
|
1711
|
+
Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
|
|
1712
|
+
value = +value
|
|
1713
|
+
offset = offset >>> 0
|
|
1714
|
+
if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
|
|
1715
|
+
if (value < 0) value = 0xff + value + 1
|
|
1716
|
+
this[offset] = (value & 0xff)
|
|
1717
|
+
return offset + 1
|
|
1718
|
+
}
|
|
1719
|
+
|
|
1720
|
+
Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
|
|
1721
|
+
value = +value
|
|
1722
|
+
offset = offset >>> 0
|
|
1723
|
+
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
|
|
1724
|
+
this[offset] = (value & 0xff)
|
|
1725
|
+
this[offset + 1] = (value >>> 8)
|
|
1726
|
+
return offset + 2
|
|
1727
|
+
}
|
|
1728
|
+
|
|
1729
|
+
Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
|
|
1730
|
+
value = +value
|
|
1731
|
+
offset = offset >>> 0
|
|
1732
|
+
if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
|
|
1733
|
+
this[offset] = (value >>> 8)
|
|
1734
|
+
this[offset + 1] = (value & 0xff)
|
|
1735
|
+
return offset + 2
|
|
1736
|
+
}
|
|
1737
|
+
|
|
1738
|
+
Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
|
|
1739
|
+
value = +value
|
|
1740
|
+
offset = offset >>> 0
|
|
1741
|
+
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
|
|
1742
|
+
this[offset] = (value & 0xff)
|
|
1743
|
+
this[offset + 1] = (value >>> 8)
|
|
1744
|
+
this[offset + 2] = (value >>> 16)
|
|
1745
|
+
this[offset + 3] = (value >>> 24)
|
|
1746
|
+
return offset + 4
|
|
1747
|
+
}
|
|
1748
|
+
|
|
1749
|
+
Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
|
|
1750
|
+
value = +value
|
|
1751
|
+
offset = offset >>> 0
|
|
1752
|
+
if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
|
|
1753
|
+
if (value < 0) value = 0xffffffff + value + 1
|
|
1754
|
+
this[offset] = (value >>> 24)
|
|
1755
|
+
this[offset + 1] = (value >>> 16)
|
|
1756
|
+
this[offset + 2] = (value >>> 8)
|
|
1757
|
+
this[offset + 3] = (value & 0xff)
|
|
1758
|
+
return offset + 4
|
|
1759
|
+
}
|
|
1760
|
+
|
|
1761
|
+
function checkIEEE754 (buf, value, offset, ext, max, min) {
|
|
1762
|
+
if (offset + ext > buf.length) throw new RangeError('Index out of range')
|
|
1763
|
+
if (offset < 0) throw new RangeError('Index out of range')
|
|
1764
|
+
}
|
|
1765
|
+
|
|
1766
|
+
function writeFloat (buf, value, offset, littleEndian, noAssert) {
|
|
1767
|
+
value = +value
|
|
1768
|
+
offset = offset >>> 0
|
|
1769
|
+
if (!noAssert) {
|
|
1770
|
+
checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
|
|
1771
|
+
}
|
|
1772
|
+
ieee754.write(buf, value, offset, littleEndian, 23, 4)
|
|
1773
|
+
return offset + 4
|
|
1774
|
+
}
|
|
1775
|
+
|
|
1776
|
+
Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
|
|
1777
|
+
return writeFloat(this, value, offset, true, noAssert)
|
|
1778
|
+
}
|
|
1779
|
+
|
|
1780
|
+
Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
|
|
1781
|
+
return writeFloat(this, value, offset, false, noAssert)
|
|
1782
|
+
}
|
|
1783
|
+
|
|
1784
|
+
function writeDouble (buf, value, offset, littleEndian, noAssert) {
|
|
1785
|
+
value = +value
|
|
1786
|
+
offset = offset >>> 0
|
|
1787
|
+
if (!noAssert) {
|
|
1788
|
+
checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
|
|
1789
|
+
}
|
|
1790
|
+
ieee754.write(buf, value, offset, littleEndian, 52, 8)
|
|
1791
|
+
return offset + 8
|
|
1792
|
+
}
|
|
1793
|
+
|
|
1794
|
+
Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
|
|
1795
|
+
return writeDouble(this, value, offset, true, noAssert)
|
|
1796
|
+
}
|
|
1797
|
+
|
|
1798
|
+
Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
|
|
1799
|
+
return writeDouble(this, value, offset, false, noAssert)
|
|
1800
|
+
}
|
|
1801
|
+
|
|
1802
|
+
// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
|
|
1803
|
+
Buffer.prototype.copy = function copy (target, targetStart, start, end) {
|
|
1804
|
+
if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
|
|
1805
|
+
if (!start) start = 0
|
|
1806
|
+
if (!end && end !== 0) end = this.length
|
|
1807
|
+
if (targetStart >= target.length) targetStart = target.length
|
|
1808
|
+
if (!targetStart) targetStart = 0
|
|
1809
|
+
if (end > 0 && end < start) end = start
|
|
1810
|
+
|
|
1811
|
+
// Copy 0 bytes; we're done
|
|
1812
|
+
if (end === start) return 0
|
|
1813
|
+
if (target.length === 0 || this.length === 0) return 0
|
|
1814
|
+
|
|
1815
|
+
// Fatal error conditions
|
|
1816
|
+
if (targetStart < 0) {
|
|
1817
|
+
throw new RangeError('targetStart out of bounds')
|
|
1818
|
+
}
|
|
1819
|
+
if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
|
|
1820
|
+
if (end < 0) throw new RangeError('sourceEnd out of bounds')
|
|
1821
|
+
|
|
1822
|
+
// Are we oob?
|
|
1823
|
+
if (end > this.length) end = this.length
|
|
1824
|
+
if (target.length - targetStart < end - start) {
|
|
1825
|
+
end = target.length - targetStart + start
|
|
1826
|
+
}
|
|
1827
|
+
|
|
1828
|
+
var len = end - start
|
|
1829
|
+
|
|
1830
|
+
if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
|
|
1831
|
+
// Use built-in when available, missing from IE11
|
|
1832
|
+
this.copyWithin(targetStart, start, end)
|
|
1833
|
+
} else if (this === target && start < targetStart && targetStart < end) {
|
|
1834
|
+
// descending copy from end
|
|
1835
|
+
for (var i = len - 1; i >= 0; --i) {
|
|
1836
|
+
target[i + targetStart] = this[i + start]
|
|
1837
|
+
}
|
|
1838
|
+
} else {
|
|
1839
|
+
Uint8Array.prototype.set.call(
|
|
1840
|
+
target,
|
|
1841
|
+
this.subarray(start, end),
|
|
1842
|
+
targetStart
|
|
1843
|
+
)
|
|
1844
|
+
}
|
|
1845
|
+
|
|
1846
|
+
return len
|
|
1847
|
+
}
|
|
1848
|
+
|
|
1849
|
+
// Usage:
|
|
1850
|
+
// buffer.fill(number[, offset[, end]])
|
|
1851
|
+
// buffer.fill(buffer[, offset[, end]])
|
|
1852
|
+
// buffer.fill(string[, offset[, end]][, encoding])
|
|
1853
|
+
Buffer.prototype.fill = function fill (val, start, end, encoding) {
|
|
1854
|
+
// Handle string cases:
|
|
1855
|
+
if (typeof val === 'string') {
|
|
1856
|
+
if (typeof start === 'string') {
|
|
1857
|
+
encoding = start
|
|
1858
|
+
start = 0
|
|
1859
|
+
end = this.length
|
|
1860
|
+
} else if (typeof end === 'string') {
|
|
1861
|
+
encoding = end
|
|
1862
|
+
end = this.length
|
|
1863
|
+
}
|
|
1864
|
+
if (encoding !== undefined && typeof encoding !== 'string') {
|
|
1865
|
+
throw new TypeError('encoding must be a string')
|
|
1866
|
+
}
|
|
1867
|
+
if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
|
|
1868
|
+
throw new TypeError('Unknown encoding: ' + encoding)
|
|
1869
|
+
}
|
|
1870
|
+
if (val.length === 1) {
|
|
1871
|
+
var code = val.charCodeAt(0)
|
|
1872
|
+
if ((encoding === 'utf8' && code < 128) ||
|
|
1873
|
+
encoding === 'latin1') {
|
|
1874
|
+
// Fast path: If `val` fits into a single byte, use that numeric value.
|
|
1875
|
+
val = code
|
|
1876
|
+
}
|
|
1877
|
+
}
|
|
1878
|
+
} else if (typeof val === 'number') {
|
|
1879
|
+
val = val & 255
|
|
1880
|
+
}
|
|
1881
|
+
|
|
1882
|
+
// Invalid ranges are not set to a default, so can range check early.
|
|
1883
|
+
if (start < 0 || this.length < start || this.length < end) {
|
|
1884
|
+
throw new RangeError('Out of range index')
|
|
1885
|
+
}
|
|
1886
|
+
|
|
1887
|
+
if (end <= start) {
|
|
1888
|
+
return this
|
|
1889
|
+
}
|
|
1890
|
+
|
|
1891
|
+
start = start >>> 0
|
|
1892
|
+
end = end === undefined ? this.length : end >>> 0
|
|
1893
|
+
|
|
1894
|
+
if (!val) val = 0
|
|
1895
|
+
|
|
1896
|
+
var i
|
|
1897
|
+
if (typeof val === 'number') {
|
|
1898
|
+
for (i = start; i < end; ++i) {
|
|
1899
|
+
this[i] = val
|
|
1900
|
+
}
|
|
1901
|
+
} else {
|
|
1902
|
+
var bytes = Buffer.isBuffer(val)
|
|
1903
|
+
? val
|
|
1904
|
+
: Buffer.from(val, encoding)
|
|
1905
|
+
var len = bytes.length
|
|
1906
|
+
if (len === 0) {
|
|
1907
|
+
throw new TypeError('The value "' + val +
|
|
1908
|
+
'" is invalid for argument "value"')
|
|
1909
|
+
}
|
|
1910
|
+
for (i = 0; i < end - start; ++i) {
|
|
1911
|
+
this[i + start] = bytes[i % len]
|
|
1912
|
+
}
|
|
1913
|
+
}
|
|
1914
|
+
|
|
1915
|
+
return this
|
|
1916
|
+
}
|
|
1917
|
+
|
|
1918
|
+
// HELPER FUNCTIONS
|
|
1919
|
+
// ================
|
|
1920
|
+
|
|
1921
|
+
var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g
|
|
1922
|
+
|
|
1923
|
+
function base64clean (str) {
|
|
1924
|
+
// Node takes equal signs as end of the Base64 encoding
|
|
1925
|
+
str = str.split('=')[0]
|
|
1926
|
+
// Node strips out invalid characters like \n and \t from the string, base64-js does not
|
|
1927
|
+
str = str.trim().replace(INVALID_BASE64_RE, '')
|
|
1928
|
+
// Node converts strings with length < 2 to ''
|
|
1929
|
+
if (str.length < 2) return ''
|
|
1930
|
+
// Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
|
|
1931
|
+
while (str.length % 4 !== 0) {
|
|
1932
|
+
str = str + '='
|
|
1933
|
+
}
|
|
1934
|
+
return str
|
|
1935
|
+
}
|
|
1936
|
+
|
|
1937
|
+
function toHex (n) {
|
|
1938
|
+
if (n < 16) return '0' + n.toString(16)
|
|
1939
|
+
return n.toString(16)
|
|
1940
|
+
}
|
|
1941
|
+
|
|
1942
|
+
function utf8ToBytes (string, units) {
|
|
1943
|
+
units = units || Infinity
|
|
1944
|
+
var codePoint
|
|
1945
|
+
var length = string.length
|
|
1946
|
+
var leadSurrogate = null
|
|
1947
|
+
var bytes = []
|
|
1948
|
+
|
|
1949
|
+
for (var i = 0; i < length; ++i) {
|
|
1950
|
+
codePoint = string.charCodeAt(i)
|
|
1951
|
+
|
|
1952
|
+
// is surrogate component
|
|
1953
|
+
if (codePoint > 0xD7FF && codePoint < 0xE000) {
|
|
1954
|
+
// last char was a lead
|
|
1955
|
+
if (!leadSurrogate) {
|
|
1956
|
+
// no lead yet
|
|
1957
|
+
if (codePoint > 0xDBFF) {
|
|
1958
|
+
// unexpected trail
|
|
1959
|
+
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
|
1960
|
+
continue
|
|
1961
|
+
} else if (i + 1 === length) {
|
|
1962
|
+
// unpaired lead
|
|
1963
|
+
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
|
1964
|
+
continue
|
|
1965
|
+
}
|
|
1966
|
+
|
|
1967
|
+
// valid lead
|
|
1968
|
+
leadSurrogate = codePoint
|
|
1969
|
+
|
|
1970
|
+
continue
|
|
1971
|
+
}
|
|
1972
|
+
|
|
1973
|
+
// 2 leads in a row
|
|
1974
|
+
if (codePoint < 0xDC00) {
|
|
1975
|
+
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
|
1976
|
+
leadSurrogate = codePoint
|
|
1977
|
+
continue
|
|
1978
|
+
}
|
|
1979
|
+
|
|
1980
|
+
// valid surrogate pair
|
|
1981
|
+
codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
|
|
1982
|
+
} else if (leadSurrogate) {
|
|
1983
|
+
// valid bmp char, but last char was a lead
|
|
1984
|
+
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
|
|
1985
|
+
}
|
|
1986
|
+
|
|
1987
|
+
leadSurrogate = null
|
|
1988
|
+
|
|
1989
|
+
// encode utf8
|
|
1990
|
+
if (codePoint < 0x80) {
|
|
1991
|
+
if ((units -= 1) < 0) break
|
|
1992
|
+
bytes.push(codePoint)
|
|
1993
|
+
} else if (codePoint < 0x800) {
|
|
1994
|
+
if ((units -= 2) < 0) break
|
|
1995
|
+
bytes.push(
|
|
1996
|
+
codePoint >> 0x6 | 0xC0,
|
|
1997
|
+
codePoint & 0x3F | 0x80
|
|
1998
|
+
)
|
|
1999
|
+
} else if (codePoint < 0x10000) {
|
|
2000
|
+
if ((units -= 3) < 0) break
|
|
2001
|
+
bytes.push(
|
|
2002
|
+
codePoint >> 0xC | 0xE0,
|
|
2003
|
+
codePoint >> 0x6 & 0x3F | 0x80,
|
|
2004
|
+
codePoint & 0x3F | 0x80
|
|
2005
|
+
)
|
|
2006
|
+
} else if (codePoint < 0x110000) {
|
|
2007
|
+
if ((units -= 4) < 0) break
|
|
2008
|
+
bytes.push(
|
|
2009
|
+
codePoint >> 0x12 | 0xF0,
|
|
2010
|
+
codePoint >> 0xC & 0x3F | 0x80,
|
|
2011
|
+
codePoint >> 0x6 & 0x3F | 0x80,
|
|
2012
|
+
codePoint & 0x3F | 0x80
|
|
2013
|
+
)
|
|
2014
|
+
} else {
|
|
2015
|
+
throw new Error('Invalid code point')
|
|
2016
|
+
}
|
|
2017
|
+
}
|
|
2018
|
+
|
|
2019
|
+
return bytes
|
|
2020
|
+
}
|
|
2021
|
+
|
|
2022
|
+
function asciiToBytes (str) {
|
|
2023
|
+
var byteArray = []
|
|
2024
|
+
for (var i = 0; i < str.length; ++i) {
|
|
2025
|
+
// Node's code seems to be doing this and not & 0x7F..
|
|
2026
|
+
byteArray.push(str.charCodeAt(i) & 0xFF)
|
|
2027
|
+
}
|
|
2028
|
+
return byteArray
|
|
2029
|
+
}
|
|
2030
|
+
|
|
2031
|
+
function utf16leToBytes (str, units) {
|
|
2032
|
+
var c, hi, lo
|
|
2033
|
+
var byteArray = []
|
|
2034
|
+
for (var i = 0; i < str.length; ++i) {
|
|
2035
|
+
if ((units -= 2) < 0) break
|
|
2036
|
+
|
|
2037
|
+
c = str.charCodeAt(i)
|
|
2038
|
+
hi = c >> 8
|
|
2039
|
+
lo = c % 256
|
|
2040
|
+
byteArray.push(lo)
|
|
2041
|
+
byteArray.push(hi)
|
|
2042
|
+
}
|
|
2043
|
+
|
|
2044
|
+
return byteArray
|
|
2045
|
+
}
|
|
2046
|
+
|
|
2047
|
+
function base64ToBytes (str) {
|
|
2048
|
+
return base64.toByteArray(base64clean(str))
|
|
2049
|
+
}
|
|
2050
|
+
|
|
2051
|
+
function blitBuffer (src, dst, offset, length) {
|
|
2052
|
+
for (var i = 0; i < length; ++i) {
|
|
2053
|
+
if ((i + offset >= dst.length) || (i >= src.length)) break
|
|
2054
|
+
dst[i + offset] = src[i]
|
|
2055
|
+
}
|
|
2056
|
+
return i
|
|
2057
|
+
}
|
|
2058
|
+
|
|
2059
|
+
// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
|
|
2060
|
+
// the `instanceof` check but they should be treated as of that type.
|
|
2061
|
+
// See: https://github.com/feross/buffer/issues/166
|
|
2062
|
+
function isInstance (obj, type) {
|
|
2063
|
+
return obj instanceof type ||
|
|
2064
|
+
(obj != null && obj.constructor != null && obj.constructor.name != null &&
|
|
2065
|
+
obj.constructor.name === type.name)
|
|
2066
|
+
}
|
|
2067
|
+
function numberIsNaN (obj) {
|
|
2068
|
+
// For IE11 support
|
|
2069
|
+
return obj !== obj // eslint-disable-line no-self-compare
|
|
2070
|
+
}
|
|
2071
|
+
|
|
2072
|
+
}).call(this)}).call(this,require("buffer").Buffer)
|
|
2073
|
+
|
|
2074
|
+
},{"base64-js":2,"buffer":3,"ieee754":4}],4:[function(require,module,exports){
|
|
2075
|
+
/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
|
2076
|
+
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
|
|
2077
|
+
var e, m
|
|
2078
|
+
var eLen = (nBytes * 8) - mLen - 1
|
|
2079
|
+
var eMax = (1 << eLen) - 1
|
|
2080
|
+
var eBias = eMax >> 1
|
|
2081
|
+
var nBits = -7
|
|
2082
|
+
var i = isLE ? (nBytes - 1) : 0
|
|
2083
|
+
var d = isLE ? -1 : 1
|
|
2084
|
+
var s = buffer[offset + i]
|
|
2085
|
+
|
|
2086
|
+
i += d
|
|
2087
|
+
|
|
2088
|
+
e = s & ((1 << (-nBits)) - 1)
|
|
2089
|
+
s >>= (-nBits)
|
|
2090
|
+
nBits += eLen
|
|
2091
|
+
for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
|
|
2092
|
+
|
|
2093
|
+
m = e & ((1 << (-nBits)) - 1)
|
|
2094
|
+
e >>= (-nBits)
|
|
2095
|
+
nBits += mLen
|
|
2096
|
+
for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
|
|
2097
|
+
|
|
2098
|
+
if (e === 0) {
|
|
2099
|
+
e = 1 - eBias
|
|
2100
|
+
} else if (e === eMax) {
|
|
2101
|
+
return m ? NaN : ((s ? -1 : 1) * Infinity)
|
|
2102
|
+
} else {
|
|
2103
|
+
m = m + Math.pow(2, mLen)
|
|
2104
|
+
e = e - eBias
|
|
2105
|
+
}
|
|
2106
|
+
return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
|
|
2107
|
+
}
|
|
2108
|
+
|
|
2109
|
+
exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
|
|
2110
|
+
var e, m, c
|
|
2111
|
+
var eLen = (nBytes * 8) - mLen - 1
|
|
2112
|
+
var eMax = (1 << eLen) - 1
|
|
2113
|
+
var eBias = eMax >> 1
|
|
2114
|
+
var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
|
|
2115
|
+
var i = isLE ? 0 : (nBytes - 1)
|
|
2116
|
+
var d = isLE ? 1 : -1
|
|
2117
|
+
var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
|
|
2118
|
+
|
|
2119
|
+
value = Math.abs(value)
|
|
2120
|
+
|
|
2121
|
+
if (isNaN(value) || value === Infinity) {
|
|
2122
|
+
m = isNaN(value) ? 1 : 0
|
|
2123
|
+
e = eMax
|
|
2124
|
+
} else {
|
|
2125
|
+
e = Math.floor(Math.log(value) / Math.LN2)
|
|
2126
|
+
if (value * (c = Math.pow(2, -e)) < 1) {
|
|
2127
|
+
e--
|
|
2128
|
+
c *= 2
|
|
2129
|
+
}
|
|
2130
|
+
if (e + eBias >= 1) {
|
|
2131
|
+
value += rt / c
|
|
2132
|
+
} else {
|
|
2133
|
+
value += rt * Math.pow(2, 1 - eBias)
|
|
2134
|
+
}
|
|
2135
|
+
if (value * c >= 2) {
|
|
2136
|
+
e++
|
|
2137
|
+
c /= 2
|
|
2138
|
+
}
|
|
2139
|
+
|
|
2140
|
+
if (e + eBias >= eMax) {
|
|
2141
|
+
m = 0
|
|
2142
|
+
e = eMax
|
|
2143
|
+
} else if (e + eBias >= 1) {
|
|
2144
|
+
m = ((value * c) - 1) * Math.pow(2, mLen)
|
|
2145
|
+
e = e + eBias
|
|
2146
|
+
} else {
|
|
2147
|
+
m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
|
|
2148
|
+
e = 0
|
|
2149
|
+
}
|
|
2150
|
+
}
|
|
2151
|
+
|
|
2152
|
+
for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
|
|
2153
|
+
|
|
2154
|
+
e = (e << mLen) | m
|
|
2155
|
+
eLen += mLen
|
|
2156
|
+
for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
|
|
2157
|
+
|
|
2158
|
+
buffer[offset + i - d] |= s * 128
|
|
2159
|
+
}
|
|
2160
|
+
|
|
2161
|
+
},{}],5:[function(require,module,exports){
|
|
2162
|
+
/////////////////////////////////////////////////////////////////////////////////
|
|
2163
|
+
/* UAParser.js v1.0.40
|
|
2164
|
+
Copyright © 2012-2024 Faisal Salman <f@faisalman.com>
|
|
2165
|
+
MIT License *//*
|
|
2166
|
+
Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
|
|
2167
|
+
Supports browser & node.js environment.
|
|
2168
|
+
Demo : https://faisalman.github.io/ua-parser-js
|
|
2169
|
+
Source : https://github.com/faisalman/ua-parser-js */
|
|
2170
|
+
/////////////////////////////////////////////////////////////////////////////////
|
|
2171
|
+
|
|
2172
|
+
(function (window, undefined) {
|
|
2173
|
+
|
|
2174
|
+
'use strict';
|
|
2175
|
+
|
|
2176
|
+
//////////////
|
|
2177
|
+
// Constants
|
|
2178
|
+
/////////////
|
|
2179
|
+
|
|
2180
|
+
|
|
2181
|
+
var LIBVERSION = '1.0.40',
|
|
2182
|
+
EMPTY = '',
|
|
2183
|
+
UNKNOWN = '?',
|
|
2184
|
+
FUNC_TYPE = 'function',
|
|
2185
|
+
UNDEF_TYPE = 'undefined',
|
|
2186
|
+
OBJ_TYPE = 'object',
|
|
2187
|
+
STR_TYPE = 'string',
|
|
2188
|
+
MAJOR = 'major',
|
|
2189
|
+
MODEL = 'model',
|
|
2190
|
+
NAME = 'name',
|
|
2191
|
+
TYPE = 'type',
|
|
2192
|
+
VENDOR = 'vendor',
|
|
2193
|
+
VERSION = 'version',
|
|
2194
|
+
ARCHITECTURE= 'architecture',
|
|
2195
|
+
CONSOLE = 'console',
|
|
2196
|
+
MOBILE = 'mobile',
|
|
2197
|
+
TABLET = 'tablet',
|
|
2198
|
+
SMARTTV = 'smarttv',
|
|
2199
|
+
WEARABLE = 'wearable',
|
|
2200
|
+
EMBEDDED = 'embedded',
|
|
2201
|
+
UA_MAX_LENGTH = 500;
|
|
2202
|
+
|
|
2203
|
+
var AMAZON = 'Amazon',
|
|
2204
|
+
APPLE = 'Apple',
|
|
2205
|
+
ASUS = 'ASUS',
|
|
2206
|
+
BLACKBERRY = 'BlackBerry',
|
|
2207
|
+
BROWSER = 'Browser',
|
|
2208
|
+
CHROME = 'Chrome',
|
|
2209
|
+
EDGE = 'Edge',
|
|
2210
|
+
FIREFOX = 'Firefox',
|
|
2211
|
+
GOOGLE = 'Google',
|
|
2212
|
+
HUAWEI = 'Huawei',
|
|
2213
|
+
LG = 'LG',
|
|
2214
|
+
MICROSOFT = 'Microsoft',
|
|
2215
|
+
MOTOROLA = 'Motorola',
|
|
2216
|
+
OPERA = 'Opera',
|
|
2217
|
+
SAMSUNG = 'Samsung',
|
|
2218
|
+
SHARP = 'Sharp',
|
|
2219
|
+
SONY = 'Sony',
|
|
2220
|
+
XIAOMI = 'Xiaomi',
|
|
2221
|
+
ZEBRA = 'Zebra',
|
|
2222
|
+
FACEBOOK = 'Facebook',
|
|
2223
|
+
CHROMIUM_OS = 'Chromium OS',
|
|
2224
|
+
MAC_OS = 'Mac OS',
|
|
2225
|
+
SUFFIX_BROWSER = ' Browser';
|
|
2226
|
+
|
|
2227
|
+
///////////
|
|
2228
|
+
// Helper
|
|
2229
|
+
//////////
|
|
2230
|
+
|
|
2231
|
+
var extend = function (regexes, extensions) {
|
|
2232
|
+
var mergedRegexes = {};
|
|
2233
|
+
for (var i in regexes) {
|
|
2234
|
+
if (extensions[i] && extensions[i].length % 2 === 0) {
|
|
2235
|
+
mergedRegexes[i] = extensions[i].concat(regexes[i]);
|
|
2236
|
+
} else {
|
|
2237
|
+
mergedRegexes[i] = regexes[i];
|
|
2238
|
+
}
|
|
2239
|
+
}
|
|
2240
|
+
return mergedRegexes;
|
|
2241
|
+
},
|
|
2242
|
+
enumerize = function (arr) {
|
|
2243
|
+
var enums = {};
|
|
2244
|
+
for (var i=0; i<arr.length; i++) {
|
|
2245
|
+
enums[arr[i].toUpperCase()] = arr[i];
|
|
2246
|
+
}
|
|
2247
|
+
return enums;
|
|
2248
|
+
},
|
|
2249
|
+
has = function (str1, str2) {
|
|
2250
|
+
return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false;
|
|
2251
|
+
},
|
|
2252
|
+
lowerize = function (str) {
|
|
2253
|
+
return str.toLowerCase();
|
|
2254
|
+
},
|
|
2255
|
+
majorize = function (version) {
|
|
2256
|
+
return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g, EMPTY).split('.')[0] : undefined;
|
|
2257
|
+
},
|
|
2258
|
+
trim = function (str, len) {
|
|
2259
|
+
if (typeof(str) === STR_TYPE) {
|
|
2260
|
+
str = str.replace(/^\s\s*/, EMPTY);
|
|
2261
|
+
return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
|
|
2262
|
+
}
|
|
2263
|
+
};
|
|
2264
|
+
|
|
2265
|
+
///////////////
|
|
2266
|
+
// Map helper
|
|
2267
|
+
//////////////
|
|
2268
|
+
|
|
2269
|
+
var rgxMapper = function (ua, arrays) {
|
|
2270
|
+
|
|
2271
|
+
var i = 0, j, k, p, q, matches, match;
|
|
2272
|
+
|
|
2273
|
+
// loop through all regexes maps
|
|
2274
|
+
while (i < arrays.length && !matches) {
|
|
2275
|
+
|
|
2276
|
+
var regex = arrays[i], // even sequence (0,2,4,..)
|
|
2277
|
+
props = arrays[i + 1]; // odd sequence (1,3,5,..)
|
|
2278
|
+
j = k = 0;
|
|
2279
|
+
|
|
2280
|
+
// try matching uastring with regexes
|
|
2281
|
+
while (j < regex.length && !matches) {
|
|
2282
|
+
|
|
2283
|
+
if (!regex[j]) { break; }
|
|
2284
|
+
matches = regex[j++].exec(ua);
|
|
2285
|
+
|
|
2286
|
+
if (!!matches) {
|
|
2287
|
+
for (p = 0; p < props.length; p++) {
|
|
2288
|
+
match = matches[++k];
|
|
2289
|
+
q = props[p];
|
|
2290
|
+
// check if given property is actually array
|
|
2291
|
+
if (typeof q === OBJ_TYPE && q.length > 0) {
|
|
2292
|
+
if (q.length === 2) {
|
|
2293
|
+
if (typeof q[1] == FUNC_TYPE) {
|
|
2294
|
+
// assign modified match
|
|
2295
|
+
this[q[0]] = q[1].call(this, match);
|
|
2296
|
+
} else {
|
|
2297
|
+
// assign given value, ignore regex match
|
|
2298
|
+
this[q[0]] = q[1];
|
|
2299
|
+
}
|
|
2300
|
+
} else if (q.length === 3) {
|
|
2301
|
+
// check whether function or regex
|
|
2302
|
+
if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
|
|
2303
|
+
// call function (usually string mapper)
|
|
2304
|
+
this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
|
|
2305
|
+
} else {
|
|
2306
|
+
// sanitize match using given regex
|
|
2307
|
+
this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
|
|
2308
|
+
}
|
|
2309
|
+
} else if (q.length === 4) {
|
|
2310
|
+
this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
|
|
2311
|
+
}
|
|
2312
|
+
} else {
|
|
2313
|
+
this[q] = match ? match : undefined;
|
|
2314
|
+
}
|
|
2315
|
+
}
|
|
2316
|
+
}
|
|
2317
|
+
}
|
|
2318
|
+
i += 2;
|
|
2319
|
+
}
|
|
2320
|
+
},
|
|
2321
|
+
|
|
2322
|
+
strMapper = function (str, map) {
|
|
2323
|
+
|
|
2324
|
+
for (var i in map) {
|
|
2325
|
+
// check if current value is array
|
|
2326
|
+
if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {
|
|
2327
|
+
for (var j = 0; j < map[i].length; j++) {
|
|
2328
|
+
if (has(map[i][j], str)) {
|
|
2329
|
+
return (i === UNKNOWN) ? undefined : i;
|
|
2330
|
+
}
|
|
2331
|
+
}
|
|
2332
|
+
} else if (has(map[i], str)) {
|
|
2333
|
+
return (i === UNKNOWN) ? undefined : i;
|
|
2334
|
+
}
|
|
2335
|
+
}
|
|
2336
|
+
return map.hasOwnProperty('*') ? map['*'] : str;
|
|
2337
|
+
};
|
|
2338
|
+
|
|
2339
|
+
///////////////
|
|
2340
|
+
// String map
|
|
2341
|
+
//////////////
|
|
2342
|
+
|
|
2343
|
+
// Safari < 3.0
|
|
2344
|
+
var oldSafariMap = {
|
|
2345
|
+
'1.0' : '/8',
|
|
2346
|
+
'1.2' : '/1',
|
|
2347
|
+
'1.3' : '/3',
|
|
2348
|
+
'2.0' : '/412',
|
|
2349
|
+
'2.0.2' : '/416',
|
|
2350
|
+
'2.0.3' : '/417',
|
|
2351
|
+
'2.0.4' : '/419',
|
|
2352
|
+
'?' : '/'
|
|
2353
|
+
},
|
|
2354
|
+
windowsVersionMap = {
|
|
2355
|
+
'ME' : '4.90',
|
|
2356
|
+
'NT 3.11' : 'NT3.51',
|
|
2357
|
+
'NT 4.0' : 'NT4.0',
|
|
2358
|
+
'2000' : 'NT 5.0',
|
|
2359
|
+
'XP' : ['NT 5.1', 'NT 5.2'],
|
|
2360
|
+
'Vista' : 'NT 6.0',
|
|
2361
|
+
'7' : 'NT 6.1',
|
|
2362
|
+
'8' : 'NT 6.2',
|
|
2363
|
+
'8.1' : 'NT 6.3',
|
|
2364
|
+
'10' : ['NT 6.4', 'NT 10.0'],
|
|
2365
|
+
'RT' : 'ARM'
|
|
2366
|
+
};
|
|
2367
|
+
|
|
2368
|
+
//////////////
|
|
2369
|
+
// Regex map
|
|
2370
|
+
/////////////
|
|
2371
|
+
|
|
2372
|
+
var regexes = {
|
|
2373
|
+
|
|
2374
|
+
browser : [[
|
|
2375
|
+
|
|
2376
|
+
/\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
|
|
2377
|
+
], [VERSION, [NAME, 'Chrome']], [
|
|
2378
|
+
/edg(?:e|ios|a)?\/([\w\.]+)/i // Microsoft Edge
|
|
2379
|
+
], [VERSION, [NAME, 'Edge']], [
|
|
2380
|
+
|
|
2381
|
+
// Presto based
|
|
2382
|
+
/(opera mini)\/([-\w\.]+)/i, // Opera Mini
|
|
2383
|
+
/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i, // Opera Mobi/Tablet
|
|
2384
|
+
/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i // Opera
|
|
2385
|
+
], [NAME, VERSION], [
|
|
2386
|
+
/opios[\/ ]+([\w\.]+)/i // Opera mini on iphone >= 8.0
|
|
2387
|
+
], [VERSION, [NAME, OPERA+' Mini']], [
|
|
2388
|
+
/\bop(?:rg)?x\/([\w\.]+)/i // Opera GX
|
|
2389
|
+
], [VERSION, [NAME, OPERA+' GX']], [
|
|
2390
|
+
/\bopr\/([\w\.]+)/i // Opera Webkit
|
|
2391
|
+
], [VERSION, [NAME, OPERA]], [
|
|
2392
|
+
|
|
2393
|
+
// Mixed
|
|
2394
|
+
/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i // Baidu
|
|
2395
|
+
], [VERSION, [NAME, 'Baidu']], [
|
|
2396
|
+
/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i // Maxthon
|
|
2397
|
+
], [VERSION, [NAME, 'Maxthon']], [
|
|
2398
|
+
/(kindle)\/([\w\.]+)/i, // Kindle
|
|
2399
|
+
/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
|
|
2400
|
+
// Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir
|
|
2401
|
+
// Trident based
|
|
2402
|
+
/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
|
|
2403
|
+
/(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
|
|
2404
|
+
|
|
2405
|
+
// Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
|
|
2406
|
+
/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon)\/([-\w\.]+)/i,
|
|
2407
|
+
// Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
|
|
2408
|
+
/(heytap|ovi|115)browser\/([\d\.]+)/i, // HeyTap/Ovi/115
|
|
2409
|
+
/(weibo)__([\d\.]+)/i // Weibo
|
|
2410
|
+
], [NAME, VERSION], [
|
|
2411
|
+
/quark(?:pc)?\/([-\w\.]+)/i // Quark
|
|
2412
|
+
], [VERSION, [NAME, 'Quark']], [
|
|
2413
|
+
/\bddg\/([\w\.]+)/i // DuckDuckGo
|
|
2414
|
+
], [VERSION, [NAME, 'DuckDuckGo']], [
|
|
2415
|
+
/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
|
|
2416
|
+
], [VERSION, [NAME, 'UC'+BROWSER]], [
|
|
2417
|
+
/microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser
|
|
2418
|
+
/\bqbcore\/([\w\.]+).+microm/i,
|
|
2419
|
+
/micromessenger\/([\w\.]+)/i // WeChat
|
|
2420
|
+
], [VERSION, [NAME, 'WeChat']], [
|
|
2421
|
+
/konqueror\/([\w\.]+)/i // Konqueror
|
|
2422
|
+
], [VERSION, [NAME, 'Konqueror']], [
|
|
2423
|
+
/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i // IE11
|
|
2424
|
+
], [VERSION, [NAME, 'IE']], [
|
|
2425
|
+
/ya(?:search)?browser\/([\w\.]+)/i // Yandex
|
|
2426
|
+
], [VERSION, [NAME, 'Yandex']], [
|
|
2427
|
+
/slbrowser\/([\w\.]+)/i // Smart Lenovo Browser
|
|
2428
|
+
], [VERSION, [NAME, 'Smart Lenovo '+BROWSER]], [
|
|
2429
|
+
/(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
|
|
2430
|
+
], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [
|
|
2431
|
+
/\bfocus\/([\w\.]+)/i // Firefox Focus
|
|
2432
|
+
], [VERSION, [NAME, FIREFOX+' Focus']], [
|
|
2433
|
+
/\bopt\/([\w\.]+)/i // Opera Touch
|
|
2434
|
+
], [VERSION, [NAME, OPERA+' Touch']], [
|
|
2435
|
+
/coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser
|
|
2436
|
+
], [VERSION, [NAME, 'Coc Coc']], [
|
|
2437
|
+
/dolfin\/([\w\.]+)/i // Dolphin
|
|
2438
|
+
], [VERSION, [NAME, 'Dolphin']], [
|
|
2439
|
+
/coast\/([\w\.]+)/i // Opera Coast
|
|
2440
|
+
], [VERSION, [NAME, OPERA+' Coast']], [
|
|
2441
|
+
/miuibrowser\/([\w\.]+)/i // MIUI Browser
|
|
2442
|
+
], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [
|
|
2443
|
+
/fxios\/([\w\.-]+)/i // Firefox for iOS
|
|
2444
|
+
], [VERSION, [NAME, FIREFOX]], [
|
|
2445
|
+
/\bqihoobrowser\/?([\w\.]*)/i // 360
|
|
2446
|
+
], [VERSION, [NAME, '360']], [
|
|
2447
|
+
/\b(qq)\/([\w\.]+)/i // QQ
|
|
2448
|
+
], [[NAME, /(.+)/, '$1Browser'], VERSION], [
|
|
2449
|
+
/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i
|
|
2450
|
+
], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser
|
|
2451
|
+
/samsungbrowser\/([\w\.]+)/i // Samsung Internet
|
|
2452
|
+
], [VERSION, [NAME, SAMSUNG + ' Internet']], [
|
|
2453
|
+
/metasr[\/ ]?([\d\.]+)/i // Sogou Explorer
|
|
2454
|
+
], [VERSION, [NAME, 'Sogou Explorer']], [
|
|
2455
|
+
/(sogou)mo\w+\/([\d\.]+)/i // Sogou Mobile
|
|
2456
|
+
], [[NAME, 'Sogou Mobile'], VERSION], [
|
|
2457
|
+
/(electron)\/([\w\.]+) safari/i, // Electron-based App
|
|
2458
|
+
/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla
|
|
2459
|
+
/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i // QQ/2345
|
|
2460
|
+
], [NAME, VERSION], [
|
|
2461
|
+
/(lbbrowser|rekonq)/i, // LieBao Browser/Rekonq
|
|
2462
|
+
/\[(linkedin)app\]/i // LinkedIn App for iOS & Android
|
|
2463
|
+
], [NAME], [
|
|
2464
|
+
/ome\/([\w\.]+) \w* ?(iron) saf/i, // Iron
|
|
2465
|
+
/ome\/([\w\.]+).+qihu (360)[es]e/i // 360
|
|
2466
|
+
], [VERSION, NAME], [
|
|
2467
|
+
|
|
2468
|
+
// WebView
|
|
2469
|
+
/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android
|
|
2470
|
+
], [[NAME, FACEBOOK], VERSION], [
|
|
2471
|
+
/(Klarna)\/([\w\.]+)/i, // Klarna Shopping Browser for iOS & Android
|
|
2472
|
+
/(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
|
|
2473
|
+
/(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
|
|
2474
|
+
/safari (line)\/([\w\.]+)/i, // Line App for iOS
|
|
2475
|
+
/\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
|
|
2476
|
+
/(alipay)client\/([\w\.]+)/i, // Alipay
|
|
2477
|
+
/(twitter)(?:and| f.+e\/([\w\.]+))/i, // Twitter
|
|
2478
|
+
/(chromium|instagram|snapchat)[\/ ]([-\w\.]+)/i // Chromium/Instagram/Snapchat
|
|
2479
|
+
], [NAME, VERSION], [
|
|
2480
|
+
/\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
|
|
2481
|
+
], [VERSION, [NAME, 'GSA']], [
|
|
2482
|
+
/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
|
|
2483
|
+
], [VERSION, [NAME, 'TikTok']], [
|
|
2484
|
+
|
|
2485
|
+
/headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
|
|
2486
|
+
], [VERSION, [NAME, CHROME+' Headless']], [
|
|
2487
|
+
|
|
2488
|
+
/ wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
|
|
2489
|
+
], [[NAME, CHROME+' WebView'], VERSION], [
|
|
2490
|
+
|
|
2491
|
+
/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i // Android Browser
|
|
2492
|
+
], [VERSION, [NAME, 'Android '+BROWSER]], [
|
|
2493
|
+
|
|
2494
|
+
/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
|
|
2495
|
+
], [NAME, VERSION], [
|
|
2496
|
+
|
|
2497
|
+
/version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i // Mobile Safari
|
|
2498
|
+
], [VERSION, [NAME, 'Mobile Safari']], [
|
|
2499
|
+
/version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile
|
|
2500
|
+
], [VERSION, NAME], [
|
|
2501
|
+
/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
|
|
2502
|
+
], [NAME, [VERSION, strMapper, oldSafariMap]], [
|
|
2503
|
+
|
|
2504
|
+
/(webkit|khtml)\/([\w\.]+)/i
|
|
2505
|
+
], [NAME, VERSION], [
|
|
2506
|
+
|
|
2507
|
+
// Gecko based
|
|
2508
|
+
/(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape
|
|
2509
|
+
], [[NAME, 'Netscape'], VERSION], [
|
|
2510
|
+
/(wolvic|librewolf)\/([\w\.]+)/i // Wolvic/LibreWolf
|
|
2511
|
+
], [NAME, VERSION], [
|
|
2512
|
+
/mobile vr; rv:([\w\.]+)\).+firefox/i // Firefox Reality
|
|
2513
|
+
], [VERSION, [NAME, FIREFOX+' Reality']], [
|
|
2514
|
+
/ekiohf.+(flow)\/([\w\.]+)/i, // Flow
|
|
2515
|
+
/(swiftfox)/i, // Swiftfox
|
|
2516
|
+
/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
|
|
2517
|
+
// IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
|
|
2518
|
+
/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,
|
|
2519
|
+
// Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
|
|
2520
|
+
/(firefox)\/([\w\.]+)/i, // Other Firefox-based
|
|
2521
|
+
/(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i, // Mozilla
|
|
2522
|
+
|
|
2523
|
+
// Other
|
|
2524
|
+
/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
|
|
2525
|
+
// Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser
|
|
2526
|
+
/(links) \(([\w\.]+)/i // Links
|
|
2527
|
+
], [NAME, [VERSION, /_/g, '.']], [
|
|
2528
|
+
|
|
2529
|
+
/(cobalt)\/([\w\.]+)/i // Cobalt
|
|
2530
|
+
], [NAME, [VERSION, /master.|lts./, ""]]
|
|
2531
|
+
],
|
|
2532
|
+
|
|
2533
|
+
cpu : [[
|
|
2534
|
+
|
|
2535
|
+
/(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i // AMD64 (x64)
|
|
2536
|
+
], [[ARCHITECTURE, 'amd64']], [
|
|
2537
|
+
|
|
2538
|
+
/(ia32(?=;))/i // IA32 (quicktime)
|
|
2539
|
+
], [[ARCHITECTURE, lowerize]], [
|
|
2540
|
+
|
|
2541
|
+
/((?:i[346]|x)86)[;\)]/i // IA32 (x86)
|
|
2542
|
+
], [[ARCHITECTURE, 'ia32']], [
|
|
2543
|
+
|
|
2544
|
+
/\b(aarch64|arm(v?8e?l?|_?64))\b/i // ARM64
|
|
2545
|
+
], [[ARCHITECTURE, 'arm64']], [
|
|
2546
|
+
|
|
2547
|
+
/\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
|
|
2548
|
+
], [[ARCHITECTURE, 'armhf']], [
|
|
2549
|
+
|
|
2550
|
+
// PocketPC mistakenly identified as PowerPC
|
|
2551
|
+
/windows (ce|mobile); ppc;/i
|
|
2552
|
+
], [[ARCHITECTURE, 'arm']], [
|
|
2553
|
+
|
|
2554
|
+
/((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i // PowerPC
|
|
2555
|
+
], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [
|
|
2556
|
+
|
|
2557
|
+
/(sun4\w)[;\)]/i // SPARC
|
|
2558
|
+
], [[ARCHITECTURE, 'sparc']], [
|
|
2559
|
+
|
|
2560
|
+
/((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
|
|
2561
|
+
// IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
|
|
2562
|
+
], [[ARCHITECTURE, lowerize]]
|
|
2563
|
+
],
|
|
2564
|
+
|
|
2565
|
+
device : [[
|
|
2566
|
+
|
|
2567
|
+
//////////////////////////
|
|
2568
|
+
// MOBILES & TABLETS
|
|
2569
|
+
/////////////////////////
|
|
2570
|
+
|
|
2571
|
+
// Samsung
|
|
2572
|
+
/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i
|
|
2573
|
+
], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
|
|
2574
|
+
/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
|
|
2575
|
+
/samsung[- ]((?!sm-[lr])[-\w]+)/i,
|
|
2576
|
+
/sec-(sgh\w+)/i
|
|
2577
|
+
], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
|
|
2578
|
+
|
|
2579
|
+
// Apple
|
|
2580
|
+
/(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i // iPod/iPhone
|
|
2581
|
+
], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [
|
|
2582
|
+
/\((ipad);[-\w\),; ]+apple/i, // iPad
|
|
2583
|
+
/applecoremedia\/[\w\.]+ \((ipad)/i,
|
|
2584
|
+
/\b(ipad)\d\d?,\d\d?[;\]].+ios/i
|
|
2585
|
+
], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [
|
|
2586
|
+
/(macintosh);/i
|
|
2587
|
+
], [MODEL, [VENDOR, APPLE]], [
|
|
2588
|
+
|
|
2589
|
+
// Sharp
|
|
2590
|
+
/\b(sh-?[altvz]?\d\d[a-ekm]?)/i
|
|
2591
|
+
], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [
|
|
2592
|
+
|
|
2593
|
+
// Honor
|
|
2594
|
+
/(?:honor)([-\w ]+)[;\)]/i
|
|
2595
|
+
], [MODEL, [VENDOR, 'Honor'], [TYPE, MOBILE]], [
|
|
2596
|
+
|
|
2597
|
+
// Huawei
|
|
2598
|
+
/\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i
|
|
2599
|
+
], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [
|
|
2600
|
+
/(?:huawei)([-\w ]+)[;\)]/i,
|
|
2601
|
+
/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i
|
|
2602
|
+
], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
|
|
2603
|
+
|
|
2604
|
+
// Xiaomi
|
|
2605
|
+
/\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i, // Xiaomi POCO
|
|
2606
|
+
/\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
|
|
2607
|
+
/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
|
|
2608
|
+
/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
|
|
2609
|
+
/oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models
|
|
2610
|
+
/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i // Xiaomi Mi
|
|
2611
|
+
], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
|
|
2612
|
+
/oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i, // Redmi Pad
|
|
2613
|
+
/\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets
|
|
2614
|
+
],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
|
|
2615
|
+
|
|
2616
|
+
// OPPO
|
|
2617
|
+
/; (\w+) bui.+ oppo/i,
|
|
2618
|
+
/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
|
|
2619
|
+
], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
|
|
2620
|
+
/\b(opd2\d{3}a?) bui/i
|
|
2621
|
+
], [MODEL, [VENDOR, 'OPPO'], [TYPE, TABLET]], [
|
|
2622
|
+
|
|
2623
|
+
// Vivo
|
|
2624
|
+
/vivo (\w+)(?: bui|\))/i,
|
|
2625
|
+
/\b(v[12]\d{3}\w?[at])(?: bui|;)/i
|
|
2626
|
+
], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
|
|
2627
|
+
|
|
2628
|
+
// Realme
|
|
2629
|
+
/\b(rmx[1-3]\d{3})(?: bui|;|\))/i
|
|
2630
|
+
], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
|
|
2631
|
+
|
|
2632
|
+
// Motorola
|
|
2633
|
+
/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
|
|
2634
|
+
/\bmot(?:orola)?[- ](\w*)/i,
|
|
2635
|
+
/((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i
|
|
2636
|
+
], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [
|
|
2637
|
+
/\b(mz60\d|xoom[2 ]{0,2}) build\//i
|
|
2638
|
+
], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [
|
|
2639
|
+
|
|
2640
|
+
// LG
|
|
2641
|
+
/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
|
|
2642
|
+
], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [
|
|
2643
|
+
/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
|
|
2644
|
+
/\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i,
|
|
2645
|
+
/\blg-?([\d\w]+) bui/i
|
|
2646
|
+
], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [
|
|
2647
|
+
|
|
2648
|
+
// Lenovo
|
|
2649
|
+
/(ideatab[-\w ]+)/i,
|
|
2650
|
+
/lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i
|
|
2651
|
+
], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
|
|
2652
|
+
|
|
2653
|
+
// Nokia
|
|
2654
|
+
/(?:maemo|nokia).*(n900|lumia \d+)/i,
|
|
2655
|
+
/nokia[-_ ]?([-\w\.]*)/i
|
|
2656
|
+
], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [
|
|
2657
|
+
|
|
2658
|
+
// Google
|
|
2659
|
+
/(pixel c)\b/i // Google Pixel C
|
|
2660
|
+
], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [
|
|
2661
|
+
/droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i // Google Pixel
|
|
2662
|
+
], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [
|
|
2663
|
+
|
|
2664
|
+
// Sony
|
|
2665
|
+
/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
|
|
2666
|
+
], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [
|
|
2667
|
+
/sony tablet [ps]/i,
|
|
2668
|
+
/\b(?:sony)?sgp\w+(?: bui|\))/i
|
|
2669
|
+
], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [
|
|
2670
|
+
|
|
2671
|
+
// OnePlus
|
|
2672
|
+
/ (kb2005|in20[12]5|be20[12][59])\b/i,
|
|
2673
|
+
/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
|
|
2674
|
+
], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
|
|
2675
|
+
|
|
2676
|
+
// Amazon
|
|
2677
|
+
/(alexa)webm/i,
|
|
2678
|
+
/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i, // Kindle Fire without Silk / Echo Show
|
|
2679
|
+
/(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
|
|
2680
|
+
], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
|
|
2681
|
+
/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
|
|
2682
|
+
], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [
|
|
2683
|
+
|
|
2684
|
+
// BlackBerry
|
|
2685
|
+
/(playbook);[-\w\),; ]+(rim)/i // BlackBerry PlayBook
|
|
2686
|
+
], [MODEL, VENDOR, [TYPE, TABLET]], [
|
|
2687
|
+
/\b((?:bb[a-f]|st[hv])100-\d)/i,
|
|
2688
|
+
/\(bb10; (\w+)/i // BlackBerry 10
|
|
2689
|
+
], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [
|
|
2690
|
+
|
|
2691
|
+
// Asus
|
|
2692
|
+
/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
|
|
2693
|
+
], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [
|
|
2694
|
+
/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
|
|
2695
|
+
], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [
|
|
2696
|
+
|
|
2697
|
+
// HTC
|
|
2698
|
+
/(nexus 9)/i // HTC Nexus 9
|
|
2699
|
+
], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
|
|
2700
|
+
/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i, // HTC
|
|
2701
|
+
|
|
2702
|
+
// ZTE
|
|
2703
|
+
/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
|
|
2704
|
+
/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
|
|
2705
|
+
], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
|
|
2706
|
+
|
|
2707
|
+
// TCL
|
|
2708
|
+
/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])\w*(\)| bui)/i
|
|
2709
|
+
], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [
|
|
2710
|
+
|
|
2711
|
+
// itel
|
|
2712
|
+
/(itel) ((\w+))/i
|
|
2713
|
+
], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [
|
|
2714
|
+
|
|
2715
|
+
// Acer
|
|
2716
|
+
/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
|
|
2717
|
+
], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
|
|
2718
|
+
|
|
2719
|
+
// Meizu
|
|
2720
|
+
/droid.+; (m[1-5] note) bui/i,
|
|
2721
|
+
/\bmz-([-\w]{2,})/i
|
|
2722
|
+
], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
|
|
2723
|
+
|
|
2724
|
+
// Ulefone
|
|
2725
|
+
/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
|
|
2726
|
+
], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [
|
|
2727
|
+
|
|
2728
|
+
// Energizer
|
|
2729
|
+
/; (energy ?\w+)(?: bui|\))/i,
|
|
2730
|
+
/; energizer ([\w ]+)(?: bui|\))/i
|
|
2731
|
+
], [MODEL, [VENDOR, 'Energizer'], [TYPE, MOBILE]], [
|
|
2732
|
+
|
|
2733
|
+
// Cat
|
|
2734
|
+
/; cat (b35);/i,
|
|
2735
|
+
/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i
|
|
2736
|
+
], [MODEL, [VENDOR, 'Cat'], [TYPE, MOBILE]], [
|
|
2737
|
+
|
|
2738
|
+
// Smartfren
|
|
2739
|
+
/((?:new )?andromax[\w- ]+)(?: bui|\))/i
|
|
2740
|
+
], [MODEL, [VENDOR, 'Smartfren'], [TYPE, MOBILE]], [
|
|
2741
|
+
|
|
2742
|
+
// Nothing
|
|
2743
|
+
/droid.+; (a(?:015|06[35]|142p?))/i
|
|
2744
|
+
], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [
|
|
2745
|
+
|
|
2746
|
+
// MIXED
|
|
2747
|
+
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
|
|
2748
|
+
// BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Infinix/Tecno/Micromax/Advan
|
|
2749
|
+
/; (imo) ((?!tab)[\w ]+?)(?: bui|\))/i, // IMO
|
|
2750
|
+
/(hp) ([\w ]+\w)/i, // HP iPAQ
|
|
2751
|
+
/(asus)-?(\w+)/i, // Asus
|
|
2752
|
+
/(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia
|
|
2753
|
+
/(lenovo)[-_ ]?([-\w]+)/i, // Lenovo
|
|
2754
|
+
/(jolla)/i, // Jolla
|
|
2755
|
+
/(oppo) ?([\w ]+) bui/i // OPPO
|
|
2756
|
+
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
|
2757
|
+
|
|
2758
|
+
/(imo) (tab \w+)/i, // IMO
|
|
2759
|
+
/(kobo)\s(ereader|touch)/i, // Kobo
|
|
2760
|
+
/(archos) (gamepad2?)/i, // Archos
|
|
2761
|
+
/(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
|
|
2762
|
+
/(kindle)\/([\w\.]+)/i, // Kindle
|
|
2763
|
+
/(nook)[\w ]+build\/(\w+)/i, // Nook
|
|
2764
|
+
/(dell) (strea[kpr\d ]*[\dko])/i, // Dell Streak
|
|
2765
|
+
/(le[- ]+pan)[- ]+(\w{1,9}) bui/i, // Le Pan Tablets
|
|
2766
|
+
/(trinity)[- ]*(t\d{3}) bui/i, // Trinity Tablets
|
|
2767
|
+
/(gigaset)[- ]+(q\w{1,9}) bui/i, // Gigaset Tablets
|
|
2768
|
+
/(vodafone) ([\w ]+)(?:\)| bui)/i // Vodafone
|
|
2769
|
+
], [VENDOR, MODEL, [TYPE, TABLET]], [
|
|
2770
|
+
|
|
2771
|
+
/(surface duo)/i // Surface Duo
|
|
2772
|
+
], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [
|
|
2773
|
+
/droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone
|
|
2774
|
+
], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
|
|
2775
|
+
/(u304aa)/i // AT&T
|
|
2776
|
+
], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [
|
|
2777
|
+
/\bsie-(\w*)/i // Siemens
|
|
2778
|
+
], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
|
|
2779
|
+
/\b(rct\w+) b/i // RCA Tablets
|
|
2780
|
+
], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
|
|
2781
|
+
/\b(venue[\d ]{2,7}) b/i // Dell Venue Tablets
|
|
2782
|
+
], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
|
|
2783
|
+
/\b(q(?:mv|ta)\w+) b/i // Verizon Tablet
|
|
2784
|
+
], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
|
|
2785
|
+
/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i // Barnes & Noble Tablet
|
|
2786
|
+
], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [
|
|
2787
|
+
/\b(tm\d{3}\w+) b/i
|
|
2788
|
+
], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
|
|
2789
|
+
/\b(k88) b/i // ZTE K Series Tablet
|
|
2790
|
+
], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
|
|
2791
|
+
/\b(nx\d{3}j) b/i // ZTE Nubia
|
|
2792
|
+
], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
|
|
2793
|
+
/\b(gen\d{3}) b.+49h/i // Swiss GEN Mobile
|
|
2794
|
+
], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
|
|
2795
|
+
/\b(zur\d{3}) b/i // Swiss ZUR Tablet
|
|
2796
|
+
], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
|
|
2797
|
+
/\b((zeki)?tb.*\b) b/i // Zeki Tablets
|
|
2798
|
+
], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
|
|
2799
|
+
/\b([yr]\d{2}) b/i,
|
|
2800
|
+
/\b(dragon[- ]+touch |dt)(\w{5}) b/i // Dragon Touch Tablet
|
|
2801
|
+
], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
|
|
2802
|
+
/\b(ns-?\w{0,9}) b/i // Insignia Tablets
|
|
2803
|
+
], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
|
|
2804
|
+
/\b((nxa|next)-?\w{0,9}) b/i // NextBook Tablets
|
|
2805
|
+
], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
|
|
2806
|
+
/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones
|
|
2807
|
+
], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [
|
|
2808
|
+
/\b(lvtel\-)?(v1[12]) b/i // LvTel Phones
|
|
2809
|
+
], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
|
|
2810
|
+
/\b(ph-1) /i // Essential PH-1
|
|
2811
|
+
], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [
|
|
2812
|
+
/\b(v(100md|700na|7011|917g).*\b) b/i // Envizen Tablets
|
|
2813
|
+
], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
|
|
2814
|
+
/\b(trio[-\w\. ]+) b/i // MachSpeed Tablets
|
|
2815
|
+
], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
|
|
2816
|
+
/\btu_(1491) b/i // Rotor Tablets
|
|
2817
|
+
], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
|
|
2818
|
+
/(shield[\w ]+) b/i // Nvidia Shield Tablets
|
|
2819
|
+
], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [
|
|
2820
|
+
/(sprint) (\w+)/i // Sprint Phones
|
|
2821
|
+
], [VENDOR, MODEL, [TYPE, MOBILE]], [
|
|
2822
|
+
/(kin\.[onetw]{3})/i // Microsoft Kin
|
|
2823
|
+
], [[MODEL, /\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [
|
|
2824
|
+
/droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
|
|
2825
|
+
], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [
|
|
2826
|
+
/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
|
|
2827
|
+
], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [
|
|
2828
|
+
|
|
2829
|
+
///////////////////
|
|
2830
|
+
// SMARTTVS
|
|
2831
|
+
///////////////////
|
|
2832
|
+
|
|
2833
|
+
/smart-tv.+(samsung)/i // Samsung
|
|
2834
|
+
], [VENDOR, [TYPE, SMARTTV]], [
|
|
2835
|
+
/hbbtv.+maple;(\d+)/i
|
|
2836
|
+
], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [
|
|
2837
|
+
/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i // LG SmartTV
|
|
2838
|
+
], [[VENDOR, LG], [TYPE, SMARTTV]], [
|
|
2839
|
+
/(apple) ?tv/i // Apple TV
|
|
2840
|
+
], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
|
|
2841
|
+
/crkey/i // Google Chromecast
|
|
2842
|
+
], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
|
|
2843
|
+
/droid.+aft(\w+)( bui|\))/i // Fire TV
|
|
2844
|
+
], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
|
|
2845
|
+
/\(dtv[\);].+(aquos)/i,
|
|
2846
|
+
/(aquos-tv[\w ]+)\)/i // Sharp
|
|
2847
|
+
], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[
|
|
2848
|
+
/(bravia[\w ]+)( bui|\))/i // Sony
|
|
2849
|
+
], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [
|
|
2850
|
+
/(mitv-\w{5}) bui/i // Xiaomi
|
|
2851
|
+
], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [
|
|
2852
|
+
/Hbbtv.*(technisat) (.*);/i // TechniSAT
|
|
2853
|
+
], [VENDOR, MODEL, [TYPE, SMARTTV]], [
|
|
2854
|
+
/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku
|
|
2855
|
+
/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
|
|
2856
|
+
], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [
|
|
2857
|
+
/\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i // SmartTV from Unidentified Vendors
|
|
2858
|
+
], [[TYPE, SMARTTV]], [
|
|
2859
|
+
|
|
2860
|
+
///////////////////
|
|
2861
|
+
// CONSOLES
|
|
2862
|
+
///////////////////
|
|
2863
|
+
|
|
2864
|
+
/(ouya)/i, // Ouya
|
|
2865
|
+
/(nintendo) ([wids3utch]+)/i // Nintendo
|
|
2866
|
+
], [VENDOR, MODEL, [TYPE, CONSOLE]], [
|
|
2867
|
+
/droid.+; (shield) bui/i // Nvidia
|
|
2868
|
+
], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
|
|
2869
|
+
/(playstation [345portablevi]+)/i // Playstation
|
|
2870
|
+
], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [
|
|
2871
|
+
/\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
|
|
2872
|
+
], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
|
|
2873
|
+
|
|
2874
|
+
///////////////////
|
|
2875
|
+
// WEARABLES
|
|
2876
|
+
///////////////////
|
|
2877
|
+
|
|
2878
|
+
/\b(sm-[lr]\d\d[05][fnuw]?s?)\b/i // Samsung Galaxy Watch
|
|
2879
|
+
], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [
|
|
2880
|
+
/((pebble))app/i // Pebble
|
|
2881
|
+
], [VENDOR, MODEL, [TYPE, WEARABLE]], [
|
|
2882
|
+
/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
|
|
2883
|
+
], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [
|
|
2884
|
+
/droid.+; (glass) \d/i // Google Glass
|
|
2885
|
+
], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [
|
|
2886
|
+
/droid.+; (wt63?0{2,3})\)/i
|
|
2887
|
+
], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [
|
|
2888
|
+
|
|
2889
|
+
///////////////////
|
|
2890
|
+
// XR
|
|
2891
|
+
///////////////////
|
|
2892
|
+
|
|
2893
|
+
/droid.+; (glass) \d/i // Google Glass
|
|
2894
|
+
], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [
|
|
2895
|
+
/(pico) (4|neo3(?: link|pro)?)/i // Pico
|
|
2896
|
+
], [VENDOR, MODEL, [TYPE, WEARABLE]], [
|
|
2897
|
+
/; (quest( \d| pro)?)/i // Oculus Quest
|
|
2898
|
+
], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [
|
|
2899
|
+
|
|
2900
|
+
///////////////////
|
|
2901
|
+
// EMBEDDED
|
|
2902
|
+
///////////////////
|
|
2903
|
+
|
|
2904
|
+
/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i // Tesla
|
|
2905
|
+
], [VENDOR, [TYPE, EMBEDDED]], [
|
|
2906
|
+
/(aeobc)\b/i // Echo Dot
|
|
2907
|
+
], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
|
|
2908
|
+
|
|
2909
|
+
////////////////////
|
|
2910
|
+
// MIXED (GENERIC)
|
|
2911
|
+
///////////////////
|
|
2912
|
+
|
|
2913
|
+
/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors
|
|
2914
|
+
], [MODEL, [TYPE, MOBILE]], [
|
|
2915
|
+
/droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
|
|
2916
|
+
], [MODEL, [TYPE, TABLET]], [
|
|
2917
|
+
/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
|
|
2918
|
+
], [[TYPE, TABLET]], [
|
|
2919
|
+
/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
|
|
2920
|
+
], [[TYPE, MOBILE]], [
|
|
2921
|
+
/(android[-\w\. ]{0,9});.+buil/i // Generic Android Device
|
|
2922
|
+
], [MODEL, [VENDOR, 'Generic']]
|
|
2923
|
+
],
|
|
2924
|
+
|
|
2925
|
+
engine : [[
|
|
2926
|
+
|
|
2927
|
+
/windows.+ edge\/([\w\.]+)/i // EdgeHTML
|
|
2928
|
+
], [VERSION, [NAME, EDGE+'HTML']], [
|
|
2929
|
+
|
|
2930
|
+
/(arkweb)\/([\w\.]+)/i // ArkWeb
|
|
2931
|
+
], [NAME, VERSION], [
|
|
2932
|
+
|
|
2933
|
+
/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
|
|
2934
|
+
], [VERSION, [NAME, 'Blink']], [
|
|
2935
|
+
|
|
2936
|
+
/(presto)\/([\w\.]+)/i, // Presto
|
|
2937
|
+
/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo
|
|
2938
|
+
/ekioh(flow)\/([\w\.]+)/i, // Flow
|
|
2939
|
+
/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links
|
|
2940
|
+
/(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
|
|
2941
|
+
/\b(libweb)/i
|
|
2942
|
+
], [NAME, VERSION], [
|
|
2943
|
+
|
|
2944
|
+
/rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
|
|
2945
|
+
], [VERSION, NAME]
|
|
2946
|
+
],
|
|
2947
|
+
|
|
2948
|
+
os : [[
|
|
2949
|
+
|
|
2950
|
+
// Windows
|
|
2951
|
+
/microsoft (windows) (vista|xp)/i // Windows (iTunes)
|
|
2952
|
+
], [NAME, VERSION], [
|
|
2953
|
+
/(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i // Windows Phone
|
|
2954
|
+
], [NAME, [VERSION, strMapper, windowsVersionMap]], [
|
|
2955
|
+
/windows nt 6\.2; (arm)/i, // Windows RT
|
|
2956
|
+
/windows[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i,
|
|
2957
|
+
/(?:win(?=3|9|n)|win 9x )([nt\d\.]+)/i
|
|
2958
|
+
], [[VERSION, strMapper, windowsVersionMap], [NAME, 'Windows']], [
|
|
2959
|
+
|
|
2960
|
+
// iOS/macOS
|
|
2961
|
+
/ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
|
|
2962
|
+
/(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i,
|
|
2963
|
+
/cfnetwork\/.+darwin/i
|
|
2964
|
+
], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
|
|
2965
|
+
/(mac os x) ?([\w\. ]*)/i,
|
|
2966
|
+
/(macintosh|mac_powerpc\b)(?!.+haiku)/i // Mac OS
|
|
2967
|
+
], [[NAME, MAC_OS], [VERSION, /_/g, '.']], [
|
|
2968
|
+
|
|
2969
|
+
// Mobile OSes
|
|
2970
|
+
/droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS
|
|
2971
|
+
], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS/OpenHarmony
|
|
2972
|
+
/(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish|openharmony)[-\/ ]?([\w\.]*)/i,
|
|
2973
|
+
/(blackberry)\w*\/([\w\.]*)/i, // Blackberry
|
|
2974
|
+
/(tizen|kaios)[\/ ]([\w\.]+)/i, // Tizen/KaiOS
|
|
2975
|
+
/\((series40);/i // Series 40
|
|
2976
|
+
], [NAME, VERSION], [
|
|
2977
|
+
/\(bb(10);/i // BlackBerry 10
|
|
2978
|
+
], [VERSION, [NAME, BLACKBERRY]], [
|
|
2979
|
+
/(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i // Symbian
|
|
2980
|
+
], [VERSION, [NAME, 'Symbian']], [
|
|
2981
|
+
/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS
|
|
2982
|
+
], [VERSION, [NAME, FIREFOX+' OS']], [
|
|
2983
|
+
/web0s;.+rt(tv)/i,
|
|
2984
|
+
/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS
|
|
2985
|
+
], [VERSION, [NAME, 'webOS']], [
|
|
2986
|
+
/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
|
|
2987
|
+
], [VERSION, [NAME, 'watchOS']], [
|
|
2988
|
+
|
|
2989
|
+
// Google Chromecast
|
|
2990
|
+
/crkey\/([\d\.]+)/i // Google Chromecast
|
|
2991
|
+
], [VERSION, [NAME, CHROME+'cast']], [
|
|
2992
|
+
/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
|
|
2993
|
+
], [[NAME, CHROMIUM_OS], VERSION],[
|
|
2994
|
+
|
|
2995
|
+
// Smart TVs
|
|
2996
|
+
/panasonic;(viera)/i, // Panasonic Viera
|
|
2997
|
+
/(netrange)mmh/i, // Netrange
|
|
2998
|
+
/(nettv)\/(\d+\.[\w\.]+)/i, // NetTV
|
|
2999
|
+
|
|
3000
|
+
// Console
|
|
3001
|
+
/(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo/Playstation
|
|
3002
|
+
/(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
|
|
3003
|
+
|
|
3004
|
+
// Other
|
|
3005
|
+
/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, // Joli/Palm
|
|
3006
|
+
/(mint)[\/\(\) ]?(\w*)/i, // Mint
|
|
3007
|
+
/(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux
|
|
3008
|
+
/([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
|
|
3009
|
+
// Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire
|
|
3010
|
+
/(hurd|linux) ?([\w\.]*)/i, // Hurd/Linux
|
|
3011
|
+
/(gnu) ?([\w\.]*)/i, // GNU
|
|
3012
|
+
/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
|
|
3013
|
+
/(haiku) (\w+)/i // Haiku
|
|
3014
|
+
], [NAME, VERSION], [
|
|
3015
|
+
/(sunos) ?([\w\.\d]*)/i // Solaris
|
|
3016
|
+
], [[NAME, 'Solaris'], VERSION], [
|
|
3017
|
+
/((?:open)?solaris)[-\/ ]?([\w\.]*)/i, // Solaris
|
|
3018
|
+
/(aix) ((\d)(?=\.|\)| )[\w\.])*/i, // AIX
|
|
3019
|
+
/\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX/SerenityOS
|
|
3020
|
+
/(unix) ?([\w\.]*)/i // UNIX
|
|
3021
|
+
], [NAME, VERSION]
|
|
3022
|
+
]
|
|
3023
|
+
};
|
|
3024
|
+
|
|
3025
|
+
/////////////////
|
|
3026
|
+
// Constructor
|
|
3027
|
+
////////////////
|
|
3028
|
+
|
|
3029
|
+
var UAParser = function (ua, extensions) {
|
|
3030
|
+
|
|
3031
|
+
if (typeof ua === OBJ_TYPE) {
|
|
3032
|
+
extensions = ua;
|
|
3033
|
+
ua = undefined;
|
|
3034
|
+
}
|
|
3035
|
+
|
|
3036
|
+
if (!(this instanceof UAParser)) {
|
|
3037
|
+
return new UAParser(ua, extensions).getResult();
|
|
3038
|
+
}
|
|
3039
|
+
|
|
3040
|
+
var _navigator = (typeof window !== UNDEF_TYPE && window.navigator) ? window.navigator : undefined;
|
|
3041
|
+
var _ua = ua || ((_navigator && _navigator.userAgent) ? _navigator.userAgent : EMPTY);
|
|
3042
|
+
var _uach = (_navigator && _navigator.userAgentData) ? _navigator.userAgentData : undefined;
|
|
3043
|
+
var _rgxmap = extensions ? extend(regexes, extensions) : regexes;
|
|
3044
|
+
var _isSelfNav = _navigator && _navigator.userAgent == _ua;
|
|
3045
|
+
|
|
3046
|
+
this.getBrowser = function () {
|
|
3047
|
+
var _browser = {};
|
|
3048
|
+
_browser[NAME] = undefined;
|
|
3049
|
+
_browser[VERSION] = undefined;
|
|
3050
|
+
rgxMapper.call(_browser, _ua, _rgxmap.browser);
|
|
3051
|
+
_browser[MAJOR] = majorize(_browser[VERSION]);
|
|
3052
|
+
// Brave-specific detection
|
|
3053
|
+
if (_isSelfNav && _navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) {
|
|
3054
|
+
_browser[NAME] = 'Brave';
|
|
3055
|
+
}
|
|
3056
|
+
return _browser;
|
|
3057
|
+
};
|
|
3058
|
+
this.getCPU = function () {
|
|
3059
|
+
var _cpu = {};
|
|
3060
|
+
_cpu[ARCHITECTURE] = undefined;
|
|
3061
|
+
rgxMapper.call(_cpu, _ua, _rgxmap.cpu);
|
|
3062
|
+
return _cpu;
|
|
3063
|
+
};
|
|
3064
|
+
this.getDevice = function () {
|
|
3065
|
+
var _device = {};
|
|
3066
|
+
_device[VENDOR] = undefined;
|
|
3067
|
+
_device[MODEL] = undefined;
|
|
3068
|
+
_device[TYPE] = undefined;
|
|
3069
|
+
rgxMapper.call(_device, _ua, _rgxmap.device);
|
|
3070
|
+
if (_isSelfNav && !_device[TYPE] && _uach && _uach.mobile) {
|
|
3071
|
+
_device[TYPE] = MOBILE;
|
|
3072
|
+
}
|
|
3073
|
+
// iPadOS-specific detection: identified as Mac, but has some iOS-only properties
|
|
3074
|
+
if (_isSelfNav && _device[MODEL] == 'Macintosh' && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) {
|
|
3075
|
+
_device[MODEL] = 'iPad';
|
|
3076
|
+
_device[TYPE] = TABLET;
|
|
3077
|
+
}
|
|
3078
|
+
return _device;
|
|
3079
|
+
};
|
|
3080
|
+
this.getEngine = function () {
|
|
3081
|
+
var _engine = {};
|
|
3082
|
+
_engine[NAME] = undefined;
|
|
3083
|
+
_engine[VERSION] = undefined;
|
|
3084
|
+
rgxMapper.call(_engine, _ua, _rgxmap.engine);
|
|
3085
|
+
return _engine;
|
|
3086
|
+
};
|
|
3087
|
+
this.getOS = function () {
|
|
3088
|
+
var _os = {};
|
|
3089
|
+
_os[NAME] = undefined;
|
|
3090
|
+
_os[VERSION] = undefined;
|
|
3091
|
+
rgxMapper.call(_os, _ua, _rgxmap.os);
|
|
3092
|
+
if (_isSelfNav && !_os[NAME] && _uach && _uach.platform && _uach.platform != 'Unknown') {
|
|
3093
|
+
_os[NAME] = _uach.platform
|
|
3094
|
+
.replace(/chrome os/i, CHROMIUM_OS)
|
|
3095
|
+
.replace(/macos/i, MAC_OS); // backward compatibility
|
|
3096
|
+
}
|
|
3097
|
+
return _os;
|
|
3098
|
+
};
|
|
3099
|
+
this.getResult = function () {
|
|
3100
|
+
return {
|
|
3101
|
+
ua : this.getUA(),
|
|
3102
|
+
browser : this.getBrowser(),
|
|
3103
|
+
engine : this.getEngine(),
|
|
3104
|
+
os : this.getOS(),
|
|
3105
|
+
device : this.getDevice(),
|
|
3106
|
+
cpu : this.getCPU()
|
|
3107
|
+
};
|
|
3108
|
+
};
|
|
3109
|
+
this.getUA = function () {
|
|
3110
|
+
return _ua;
|
|
3111
|
+
};
|
|
3112
|
+
this.setUA = function (ua) {
|
|
3113
|
+
_ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua;
|
|
3114
|
+
return this;
|
|
3115
|
+
};
|
|
3116
|
+
this.setUA(_ua);
|
|
3117
|
+
return this;
|
|
3118
|
+
};
|
|
3119
|
+
|
|
3120
|
+
UAParser.VERSION = LIBVERSION;
|
|
3121
|
+
UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR]);
|
|
3122
|
+
UAParser.CPU = enumerize([ARCHITECTURE]);
|
|
3123
|
+
UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
|
|
3124
|
+
UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
|
|
3125
|
+
|
|
3126
|
+
///////////
|
|
3127
|
+
// Export
|
|
3128
|
+
//////////
|
|
3129
|
+
|
|
3130
|
+
// check js environment
|
|
3131
|
+
if (typeof(exports) !== UNDEF_TYPE) {
|
|
3132
|
+
// nodejs env
|
|
3133
|
+
if (typeof module !== UNDEF_TYPE && module.exports) {
|
|
3134
|
+
exports = module.exports = UAParser;
|
|
3135
|
+
}
|
|
3136
|
+
exports.UAParser = UAParser;
|
|
3137
|
+
} else {
|
|
3138
|
+
// requirejs env (optional)
|
|
3139
|
+
if (typeof(define) === FUNC_TYPE && define.amd) {
|
|
3140
|
+
define(function () {
|
|
3141
|
+
return UAParser;
|
|
3142
|
+
});
|
|
3143
|
+
} else if (typeof window !== UNDEF_TYPE) {
|
|
3144
|
+
// browser env
|
|
3145
|
+
window.UAParser = UAParser;
|
|
3146
|
+
}
|
|
3147
|
+
}
|
|
3148
|
+
|
|
3149
|
+
// jQuery/Zepto specific (optional)
|
|
3150
|
+
// Note:
|
|
3151
|
+
// In AMD env the global scope should be kept clean, but jQuery is an exception.
|
|
3152
|
+
// jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
|
|
3153
|
+
// and we should catch that.
|
|
3154
|
+
var $ = typeof window !== UNDEF_TYPE && (window.jQuery || window.Zepto);
|
|
3155
|
+
if ($ && !$.ua) {
|
|
3156
|
+
var parser = new UAParser();
|
|
3157
|
+
$.ua = parser.getResult();
|
|
3158
|
+
$.ua.get = function () {
|
|
3159
|
+
return parser.getUA();
|
|
3160
|
+
};
|
|
3161
|
+
$.ua.set = function (ua) {
|
|
3162
|
+
parser.setUA(ua);
|
|
3163
|
+
var result = parser.getResult();
|
|
3164
|
+
for (var prop in result) {
|
|
3165
|
+
$.ua[prop] = result[prop];
|
|
3166
|
+
}
|
|
3167
|
+
};
|
|
3168
|
+
}
|
|
3169
|
+
|
|
3170
|
+
})(typeof window === 'object' ? window : this);
|
|
3171
|
+
|
|
3172
|
+
},{}]},{},[1])(1)
|
|
3173
|
+
});
|
|
3174
|
+
|
|
3175
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIvZGF0YS9qZW5raW5zL3dvcmtzcGFjZS9WX1F1YWRyZWxfZXpxZC5xZC11dGlsaXRpZXNfbWFpbi9saWJzL3FkLWJyb3dzZXItY2hlY2svc3JjL2Jyb3dzZXItY2hlY2suanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3VhLXBhcnNlci1qcy9zcmMvdWEtcGFyc2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQ0FBLE1BQU0sa0JBQWtCLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNoRCxBQUF5QjtBQUN6QixNQUFNLFdBQVc7RUFDZixnQkFBZ0IsRUFBRTtFQUNsQixtQkFBbUIsRUFBRTtFQUNyQixRQUFRLEVBQUU7RUFDVixNQUFNLEVBQUU7RUFDUixRQUFRLEVBQUU7RUFDVixpQkFBaUIsRUFBRTtFQUNuQixTQUFTLEVBQUU7RUFDWCxJQUFJLEtBQUs7Q0FDVixDQUFDOztBQUVGLE1BQU0sUUFBUSxHQUFHLG1CQUFtQjs7RUFFbEMsTUFBTSxZQUFZLE1BQU0sT0FBTyxDQUFDOztFQUVoQyxJQUFJLE9BQU8sTUFBTSxPQUFPLEtBQUssVUFBVSxFQUFFO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQztHQUN0QixNQUFNO0lBQ0wsTUFBTSxPQUFPLEdBQUcsWUFBWTtNQUMxQixJQUFJLFNBQVMsRUFBRTtRQUNiLFNBQVMsRUFBRSxDQUFDO09BQ2I7TUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDZixDQUFDO0dBQ0g7Q0FDRixDQUFDOztBQUVGLHVCQUF1QjtFQUNyQixNQUFNLGdCQUFnQixtKzJDQUErQyxDQUFDOztFQUV0RSxNQUFNLGlCQUFpQixRQUFRLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztFQUNyRCxjQUFjLEdBQUcsR0FBRyxVQUFVLENBQUM7RUFDL0IsUUFBUSxLQUFLLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQzs7OztFQUkxQyxNQUFNLGtCQUFrQixJQUFJLGVBQWUsQ0FBQyxNQUFNLFVBQVUsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDOzs7RUFHcEYsTUFBTSxpQkFBaUIsT0FBTyxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDOzs7RUFHOUUsSUFBSSxrQkFBa0IsQ0FBQyxlQUFlLEVBQUUsY0FBYyxDQUFDLEVBQUU7SUFDdkQsTUFBTSxZQUFZO01BQ2hCLElBQUk7UUFDRixVQUFVLGdDQUFnQztRQUMxQztVQUNFLCtFQUErRTtVQUMvRSxxQ0FBcUM7T0FDeEM7TUFDRCxJQUFJO1FBQ0YsVUFBVSxxQ0FBcUM7UUFDL0M7VUFDRSw0RUFBNEU7VUFDNUUsb0RBQW9EO09BQ3ZEO01BQ0QsSUFBSTtRQUNGLFVBQVUsNENBQTRDO1FBQ3REO1VBQ0UsNEVBQTRFO1VBQzVFLHdEQUF3RDtPQUMzRDtNQUNELElBQUk7UUFDRixVQUFVLGtDQUFrQztRQUM1QztVQUNFLG1FQUFtRTtVQUNuRSx1REFBdUQ7T0FDMUQ7S0FDRixDQUFDOztJQUVGLE1BQU0sb0JBQW9CLFFBQVEsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlELGlCQUFpQixVQUFVLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3RELGlCQUFpQixVQUFVLEdBQUcsYUFBYSxDQUFDOztJQUU1QyxNQUFNLHNCQUFzQixDQUFDLFNBQVMsU0FBUyxJQUFJLFNBQVMsYUFBYSxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7SUFFekcsTUFBTSxXQUFXLFFBQVEsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlDLE1BQU0sVUFBVSxRQUFRLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxRQUFRLFVBQVUsR0FBRyxTQUFTLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzlFLE9BQU8sVUFBVSxHQUFHLFNBQVMsQ0FBQyxlQUFlLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDNUUsUUFBUSxlQUFlLENBQUMsdUJBQXVCLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZFLFFBQVEsZUFBZSxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztHQUN2RTtDQUNGOztBQUVELGlEQUFpRDtFQUMvQyxLQUFLLElBQUksR0FBRyxJQUFJLGFBQWEsRUFBRTtJQUM3QixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ3BDOztFQUVELE9BQU8sUUFBUSxDQUFDO0NBQ2pCOztBQUVELDZEQUE2RDtFQUMzRCxNQUFNLGNBQWMsZUFBZSxRQUFRLEtBQUssQ0FBQztFQUNqRCxNQUFNLHNCQUFzQixlQUFlLFFBQVEsTUFBTSxDQUFDOztFQUUxRCxJQUFJLGNBQWMsS0FBSyxDQUFDO0VBQ3hCLElBQUksb0JBQW9CLEVBQUUsRUFBRTtJQUMxQixjQUFjLElBQUksQ0FBQztHQUNwQjs7RUFFRCxJQUFJLFdBQVcsSUFBSSxjQUFjLEVBQUU7SUFDakMsTUFBTSxhQUFhLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQzs7SUFFL0MsSUFBSSxRQUFRLENBQUMsbUJBQW1CLENBQUMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7TUFDeEQsY0FBYyxJQUFJLENBQUM7S0FDcEI7R0FDRjs7RUFFRCxPQUFPLFdBQVcsQ0FBQzs7RUFFbkIsZ0NBQWdDO0lBQzlCLE1BQU0sY0FBYyxlQUFlLFFBQVEsS0FBSyxDQUFDO0lBQ2pELElBQUksZ0JBQWdCLEtBQUssQ0FBQztJQUMxQixJQUFJLEVBQUUsV0FBVyxJQUFJLGNBQWMsQ0FBQyxFQUFFO01BQ3BDLGdCQUFnQixJQUFJLENBQUM7S0FDdEIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFO01BQ3ZDLGdCQUFnQixJQUFJLENBQUM7S0FDdEI7SUFDRCxPQUFPLGFBQWEsQ0FBQztHQUN0QjtDQUNGOztBQUVELDhDQUE4QztFQUM1QyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0lBQ2hFLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsT0FBTyxtQkFBbUIsQ0FBQztDQUM1Qjs7Ozs7O0FDcElEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN0SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2p2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsImNvbnN0IFVzZXJBZ2VudFBhcnNlciA9IHJlcXVpcmUoJ3VhLXBhcnNlci1qcycpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgREVGQVVMVFMgPSB7XG4gIEhlYWRsZXNzQ2hyb21lOiA1NyxcbiAgJ0Nocm9tZSBIZWFkbGVzcyc6IDU3LFxuICBDaHJvbWU6IDU3LFxuICBFZGdlOiA4MCxcbiAgU2FmYXJpOiAxMCxcbiAgJ01vYmlsZSBTYWZhcmknOiAxMCxcbiAgRmlyZWZveDogNTAsXG4gIElFOiBmYWxzZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAvLyBMb2FkIG1haW4gd2hlbiBET00gcmVhZHkuXG4gIGNvbnN0IG9sZE9ubG9hZCA9IHdpbmRvdy5vbmxvYWQ7XG5cbiAgaWYgKHR5cGVvZiB3aW5kb3cub25sb2FkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgd2luZG93Lm9ubG9hZCA9IG1haW47XG4gIH0gZWxzZSB7XG4gICAgd2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvbGRPbmxvYWQpIHtcbiAgICAgICAgb2xkT25sb2FkKCk7XG4gICAgICB9XG4gICAgICBtYWluKG9wdGlvbnMpO1xuICAgIH07XG4gIH1cbn07XG5cbmZ1bmN0aW9uIG1haW4ob3B0aW9ucykge1xuICBjb25zdCBFcnJvclBhZ2VIdG1sID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZXJyb3ItcGFnZS5odG1sJyk7XG5cbiAgY29uc3QgZXJyb3JDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZXJyb3JDb250YWluZXIuaWQgPSAnb3V0ZGF0ZWQnO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVycm9yQ29udGFpbmVyKTtcblxuICAvLyBEZXNwaXRlIHRoZSBkb2NzLCBVQSBuZWVkcyB0byBiZSBwcm92aWRlZCB0byBjb25zdHJ1Y3RvciBleHBsaWNpdGx5OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFpc2FsbWFuL3VhLXBhcnNlci1qcy9pc3N1ZXMvOTBcbiAgY29uc3QgcGFyc2VkVXNlckFnZW50ID0gbmV3IFVzZXJBZ2VudFBhcnNlcih3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkuZ2V0UmVzdWx0KCk7XG5cbiAgLy8gU2V0IGRlZmF1bHQgb3B0aW9uc1xuICBjb25zdCBicm93c2VyU3VwcG9ydCA9IG9wdGlvbnMgPyB1cGRhdGVEZWZhdWx0cyhERUZBVUxUUywgb3B0aW9ucykgOiBERUZBVUxUUztcblxuICAvLyBDaGVjayBpZiBicm93c2VyIGlzIHN1cHBvcnRlZFxuICBpZiAoaXNCcm93c2VyT3V0T2ZEYXRlKHBhcnNlZFVzZXJBZ2VudCwgYnJvd3NlclN1cHBvcnQpKSB7XG4gICAgY29uc3QgZXJyb3JUZXh0ID0ge1xuICAgICAgZW46IHtcbiAgICAgICAgaGVhZGxpbmU6ICdZb3VyIGJyb3dzZXIgaXMgbm90IHN1cHBvcnRlZC4nLFxuICAgICAgICBzdWJsaW5lOlxuICAgICAgICAgICdXZSByZWNvbW1lbmQgdXNpbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIENocm9tZSAoR29vZ2xlKSwgRmlyZWZveCAoTW96aWxsYSksICcgK1xuICAgICAgICAgICdFZGdlIChNaWNyb3NvZnQpIG9yIFNhZmFyaSAoQXBwbGUpLidcbiAgICAgIH0sXG4gICAgICBkZToge1xuICAgICAgICBoZWFkbGluZTogJ0lociBCcm93c2VyIHdpcmQgbmljaHQgdW50ZXJzdMO8dHp0LicsXG4gICAgICAgIHN1YmxpbmU6XG4gICAgICAgICAgJ1dpciBlbXBmZWhsZW4sIGRpZSBuZXVzdGUgVmVyc2lvbiB2b24gQ2hyb21lIChHb29nbGUpLCBGaXJlZm94IChNb3ppbGxhKSwgJyArXG4gICAgICAgICAgJ0VkZ2UgKE1pY3Jvc29mdCkgb2RlciBTYWZhcmkgKEFwcGxlKSB6dSB2ZXJ3ZW5kZW4uJ1xuICAgICAgfSxcbiAgICAgIGZyOiB7XG4gICAgICAgIGhlYWRsaW5lOiBcIlZvdHJlIG5hdmlnYXRldXIgbidlc3QgcGFzIHByaXMgZW4gY2hhcmdlLlwiLFxuICAgICAgICBzdWJsaW5lOlxuICAgICAgICAgIFwiTm91cyB2b3VzIHJlY29tbWFuZG9ucyBkJ3V0aWxpc2VyIGxhIGRlcm5pw6hyZSB2ZXJzaW9uIGRlIENocm9tZSAoR29vZ2xlKSwgXCIgK1xuICAgICAgICAgICdGaXJlZm94IChNb3ppbGxhKSwgRWRnZSAoTWljcm9zb2Z0KSBvdSBTYWZhcmkgKEFwcGxlKS4nXG4gICAgICB9LFxuICAgICAgaXQ6IHtcbiAgICAgICAgaGVhZGxpbmU6ICdJbCB0dW8gYnJvd3NlciBub24gw6ggc3VwcG9ydGF0by4nLFxuICAgICAgICBzdWJsaW5lOlxuICAgICAgICAgIFwiU2kgY29uc2lnbGlhIGRpIHV0aWxpenphcmUgbCd1bHRpbWEgdmVyc2lvbmUgZGkgQ2hyb21lIChHb29nbGUpLCBcIiArXG4gICAgICAgICAgJ0ZpcmVmb3ggKE1vemlsbGEpLCBFZGdlIChNaWNyb3NvZnQpIG8gU2FmYXJpIChBcHBsZSkuJ1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBpbnNlcnRDb250ZW50SGVyZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvdXRkYXRlZCcpO1xuICAgIGluc2VydENvbnRlbnRIZXJlLmNsYXNzTGlzdC5hZGQoJ3FkLWZ1bGxzY3JlZW4taW5mbycpO1xuICAgIGluc2VydENvbnRlbnRIZXJlLmlubmVySFRNTCA9IEVycm9yUGFnZUh0bWw7XG5cbiAgICBjb25zdCBicm93c2VyTGFuZ3VhZ2VDb2RlID0gKG5hdmlnYXRvci5sYW5ndWFnZSB8fCBuYXZpZ2F0b3IudXNlckxhbmd1YWdlKS5zdWJzdHJpbmcoMCwgMikudG9Mb3dlckNhc2UoKTtcblxuICAgIGNvbnN0IGhlYWRsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDEnKTtcbiAgICBjb25zdCBzdWJsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTtcbiAgICBoZWFkbGluZS5pbm5lckhUTUwgPSBlcnJvclRleHRbZ2V0TGFuZ3VhZ2VDb2RlKGJyb3dzZXJMYW5ndWFnZUNvZGUpXS5oZWFkbGluZTtcbiAgICBzdWJsaW5lLmlubmVySFRNTCA9IGVycm9yVGV4dFtnZXRMYW5ndWFnZUNvZGUoYnJvd3Nlckxhbmd1YWdlQ29kZSldLnN1YmxpbmU7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3FkLWVycm9yLXBhZ2UtY29udGVudCcpLmFwcGVuZENoaWxkKGhlYWRsaW5lKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncWQtZXJyb3ItcGFnZS1jb250ZW50JykuYXBwZW5kQ2hpbGQoc3VibGluZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVmYXVsdHMoZGVmYXVsdHMsIHVwZGF0ZWRWYWx1ZXMpIHtcbiAgZm9yIChsZXQga2V5IGluIHVwZGF0ZWRWYWx1ZXMpIHtcbiAgICBkZWZhdWx0c1trZXldID0gdXBkYXRlZFZhbHVlc1trZXldO1xuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRzO1xufVxuXG5mdW5jdGlvbiBpc0Jyb3dzZXJPdXRPZkRhdGUocGFyc2VkVXNlckFnZW50LCBicm93c2VyU3VwcG9ydCkge1xuICBjb25zdCBicm93c2VyTmFtZSA9IHBhcnNlZFVzZXJBZ2VudC5icm93c2VyLm5hbWU7XG4gIGNvbnN0IGJyb3dzZXJNYWpvclZlcnNpb24gPSBwYXJzZWRVc2VyQWdlbnQuYnJvd3Nlci5tYWpvcjtcblxuICBsZXQgaXNPdXRPZkRhdGUgPSBmYWxzZTtcbiAgaWYgKGlzQnJvd3NlclVuc3VwcG9ydGVkKCkpIHtcbiAgICBpc091dE9mRGF0ZSA9IHRydWU7XG4gIH1cblxuICBpZiAoYnJvd3Nlck5hbWUgaW4gYnJvd3NlclN1cHBvcnQpIHtcbiAgICBjb25zdCBtaW5WZXJzaW9uID0gYnJvd3NlclN1cHBvcnRbYnJvd3Nlck5hbWVdO1xuXG4gICAgaWYgKHBhcnNlSW50KGJyb3dzZXJNYWpvclZlcnNpb24pIDwgcGFyc2VJbnQobWluVmVyc2lvbikpIHtcbiAgICAgIGlzT3V0T2ZEYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNPdXRPZkRhdGU7XG5cbiAgZnVuY3Rpb24gaXNCcm93c2VyVW5zdXBwb3J0ZWQoKSB7XG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSBwYXJzZWRVc2VyQWdlbnQuYnJvd3Nlci5uYW1lO1xuICAgIGxldCBpc1Vuc3VwcG9ydGVkID0gZmFsc2U7XG4gICAgaWYgKCEoYnJvd3Nlck5hbWUgaW4gYnJvd3NlclN1cHBvcnQpKSB7XG4gICAgICBpc1Vuc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFicm93c2VyU3VwcG9ydFticm93c2VyTmFtZV0pIHtcbiAgICAgIGlzVW5zdXBwb3J0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaXNVbnN1cHBvcnRlZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRMYW5ndWFnZUNvZGUoYnJvd3Nlckxhbmd1YWdlQ29kZSkge1xuICBpZiAoWydlbicsICdkZScsICdmcicsICdpdCddLmluZGV4T2YoYnJvd3Nlckxhbmd1YWdlQ29kZSkgPT09IC0xKSB7XG4gICAgcmV0dXJuICdlbic7XG4gIH1cblxuICByZXR1cm4gYnJvd3Nlckxhbmd1YWdlQ29kZTtcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIHZhciBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbnZhciBLX01BWF9MRU5HVEggPSAweDdmZmZmZmZmXG5leHBvcnRzLmtNYXhMZW5ndGggPSBLX01BWF9MRU5HVEhcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgUHJpbnQgd2FybmluZyBhbmQgcmVjb21tZW5kIHVzaW5nIGBidWZmZXJgIHY0Lnggd2hpY2ggaGFzIGFuIE9iamVjdFxuICogICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogV2UgcmVwb3J0IHRoYXQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0eXBlZCBhcnJheXMgaWYgdGhlIGFyZSBub3Qgc3ViY2xhc3NhYmxlXG4gKiB1c2luZyBfX3Byb3RvX18uIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgXG4gKiAoU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzgpLiBJRSAxMCBsYWNrcyBzdXBwb3J0XG4gKiBmb3IgX19wcm90b19fIGFuZCBoYXMgYSBidWdneSB0eXBlZCBhcnJheSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbmlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICAnVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5ICcgK1xuICAgICdgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LidcbiAgKVxufVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIC8vIENhbiB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZD9cbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0geyBfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH0gfVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ3BhcmVudCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5idWZmZXJcbiAgfVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdvZmZzZXQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRoaXMpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldFxuICB9XG59KVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAobGVuZ3RoID4gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBsZW5ndGggKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICBidWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYnVmXG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUoYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG4vLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICE9IG51bGwgJiZcbiAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG5mdW5jdGlvbiBmcm9tICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArXG4gICAgICAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdmFsdWUpXG4gICAgKVxuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2UodmFsdWUsIEFycmF5QnVmZmVyKSB8fFxuICAgICAgKHZhbHVlICYmIGlzSW5zdGFuY2UodmFsdWUuYnVmZmVyLCBBcnJheUJ1ZmZlcikpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgIClcbiAgfVxuXG4gIHZhciB2YWx1ZU9mID0gdmFsdWUudmFsdWVPZiAmJiB2YWx1ZS52YWx1ZU9mKClcbiAgaWYgKHZhbHVlT2YgIT0gbnVsbCAmJiB2YWx1ZU9mICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZU9mLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICB2YXIgYiA9IGZyb21PYmplY3QodmFsdWUpXG4gIGlmIChiKSByZXR1cm4gYlxuXG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9QcmltaXRpdmUgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgICB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdKCdzdHJpbmcnKSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoXG4gICAgKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArXG4gICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKVxuICApXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20odmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gTm90ZTogQ2hhbmdlIHByb3RvdHlwZSAqYWZ0ZXIqIEJ1ZmZlci5mcm9tIGlzIGRlZmluZWQgdG8gd29ya2Fyb3VuZCBDaHJvbWUgYnVnOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC8xNDhcbkJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbkJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBzaXplICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAoc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IGJ1Zi53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgYnVmID0gYnVmLnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGJ1ZltpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wib2Zmc2V0XCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJsZW5ndGhcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgdmFyIGJ1ZlxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgYnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0IChvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW4pXG5cbiAgICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGJ1ZlxuICAgIH1cblxuICAgIG9iai5jb3B5KGJ1ZiwgMCwgMCwgbGVuKVxuICAgIHJldHVybiBidWZcbiAgfVxuXG4gIGlmIChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IG51bWJlcklzTmFOKG9iai5sZW5ndGgpKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKDApXG4gICAgfVxuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iailcbiAgfVxuXG4gIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgQXJyYXkuaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmouZGF0YSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwgS19NQVhfTEVOR1RIYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IEtfTUFYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBLX01BWF9MRU5HVEgudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiBiICE9IG51bGwgJiYgYi5faXNCdWZmZXIgPT09IHRydWUgJiZcbiAgICBiICE9PSBCdWZmZXIucHJvdG90eXBlIC8vIHNvIEJ1ZmZlci5pc0J1ZmZlcihCdWZmZXIucHJvdG90eXBlKSB3aWxsIGJlIGZhbHNlXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoaXNJbnN0YW5jZShhLCBVaW50OEFycmF5KSkgYSA9IEJ1ZmZlci5mcm9tKGEsIGEub2Zmc2V0LCBhLmJ5dGVMZW5ndGgpXG4gIGlmIChpc0luc3RhbmNlKGIsIFVpbnQ4QXJyYXkpKSBiID0gQnVmZmVyLmZyb20oYiwgYi5vZmZzZXQsIGIuYnl0ZUxlbmd0aClcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwiYnVmMVwiLCBcImJ1ZjJcIiBhcmd1bWVudHMgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheSdcbiAgICApXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoaXNJbnN0YW5jZShidWYsIFVpbnQ4QXJyYXkpKSB7XG4gICAgICBidWYgPSBCdWZmZXIuZnJvbShidWYpXG4gICAgfVxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IGlzSW5zdGFuY2Uoc3RyaW5nLCBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIG9yIEFycmF5QnVmZmVyLiAnICtcbiAgICAgICdSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2Ygc3RyaW5nXG4gICAgKVxuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIG11c3RNYXRjaCA9IChhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gPT09IHRydWUpXG4gIGlmICghbXVzdE1hdGNoICYmIGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkge1xuICAgICAgICAgIHJldHVybiBtdXN0TWF0Y2ggPyAtMSA6IHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIH1cbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGlzIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgKGFuZCB0aGUgYGlzLWJ1ZmZlcmAgbnBtIHBhY2thZ2UpXG4vLyB0byBkZXRlY3QgYSBCdWZmZXIgaW5zdGFuY2UuIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBgaW5zdGFuY2VvZiBCdWZmZXJgXG4vLyByZWxpYWJseSBpbiBhIGJyb3dzZXJpZnkgY29udGV4dCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGRpZmZlcmVudFxuLy8gY29waWVzIG9mIHRoZSAnYnVmZmVyJyBwYWNrYWdlIGluIHVzZS4gVGhpcyBtZXRob2Qgd29ya3MgZXZlbiBmb3IgQnVmZmVyXG4vLyBpbnN0YW5jZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgZnJvbSBhbm90aGVyIGNvcHkgb2YgdGhlIGBidWZmZXJgIHBhY2thZ2UuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNTRcbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcgPSBCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nXG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkucmVwbGFjZSgvKC57Mn0pL2csICckMSAnKS50cmltKClcbiAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoaXNJbnN0YW5jZSh0YXJnZXQsIFVpbnQ4QXJyYXkpKSB7XG4gICAgdGFyZ2V0ID0gQnVmZmVyLmZyb20odGFyZ2V0LCB0YXJnZXQub2Zmc2V0LCB0YXJnZXQuYnl0ZUxlbmd0aClcbiAgfVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJ0YXJnZXRcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiAnICtcbiAgICAgICdSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHRhcmdldClcbiAgICApXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0IC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChudW1iZXJJc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChudW1iZXJJc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCA+Pj4gMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIChieXRlc1tpICsgMV0gKiAyNTYpKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsICg4ICogYnl0ZUxlbmd0aCkgLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzaG91bGQgYmUgYSBCdWZmZXInKVxuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFVzZSBidWlsdC1pbiB3aGVuIGF2YWlsYWJsZSwgbWlzc2luZyBmcm9tIElFMTFcbiAgICB0aGlzLmNvcHlXaXRoaW4odGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpXG4gIH0gZWxzZSBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmICgoZW5jb2RpbmcgPT09ICd1dGY4JyAmJiBjb2RlIDwgMTI4KSB8fFxuICAgICAgICAgIGVuY29kaW5nID09PSAnbGF0aW4xJykge1xuICAgICAgICAvLyBGYXN0IHBhdGg6IElmIGB2YWxgIGZpdHMgaW50byBhIHNpbmdsZSBieXRlLCB1c2UgdGhhdCBudW1lcmljIHZhbHVlLlxuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZhbHVlIFwiJyArIHZhbCArXG4gICAgICAgICdcIiBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCBcInZhbHVlXCInKVxuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXisvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHRha2VzIGVxdWFsIHNpZ25zIGFzIGVuZCBvZiB0aGUgQmFzZTY0IGVuY29kaW5nXG4gIHN0ciA9IHN0ci5zcGxpdCgnPScpWzBdXG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuLy8gQXJyYXlCdWZmZXIgb3IgVWludDhBcnJheSBvYmplY3RzIGZyb20gb3RoZXIgY29udGV4dHMgKGkuZS4gaWZyYW1lcykgZG8gbm90IHBhc3Ncbi8vIHRoZSBgaW5zdGFuY2VvZmAgY2hlY2sgYnV0IHRoZXkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb2YgdGhhdCB0eXBlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTY2XG5mdW5jdGlvbiBpc0luc3RhbmNlIChvYmosIHR5cGUpIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHR5cGUgfHxcbiAgICAob2JqICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT0gbnVsbCAmJlxuICAgICAgb2JqLmNvbnN0cnVjdG9yLm5hbWUgPT09IHR5cGUubmFtZSlcbn1cbmZ1bmN0aW9uIG51bWJlcklzTmFOIChvYmopIHtcbiAgLy8gRm9yIElFMTEgc3VwcG9ydFxuICByZXR1cm4gb2JqICE9PSBvYmogLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cbiIsIi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5leHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCIvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8qIFVBUGFyc2VyLmpzIHYxLjAuNDBcbiAgIENvcHlyaWdodCDCqSAyMDEyLTIwMjQgRmFpc2FsIFNhbG1hbiA8ZkBmYWlzYWxtYW4uY29tPlxuICAgTUlUIExpY2Vuc2UgKi8vKlxuICAgRGV0ZWN0IEJyb3dzZXIsIEVuZ2luZSwgT1MsIENQVSwgYW5kIERldmljZSB0eXBlL21vZGVsIGZyb20gVXNlci1BZ2VudCBkYXRhLlxuICAgU3VwcG9ydHMgYnJvd3NlciAmIG5vZGUuanMgZW52aXJvbm1lbnQuIFxuICAgRGVtbyAgIDogaHR0cHM6Ly9mYWlzYWxtYW4uZ2l0aHViLmlvL3VhLXBhcnNlci1qc1xuICAgU291cmNlIDogaHR0cHM6Ly9naXRodWIuY29tL2ZhaXNhbG1hbi91YS1wYXJzZXItanMgKi9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4oZnVuY3Rpb24gKHdpbmRvdywgdW5kZWZpbmVkKSB7XG5cbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICAvLy8vLy8vLy8vLy8vL1xuICAgIC8vIENvbnN0YW50c1xuICAgIC8vLy8vLy8vLy8vLy9cblxuXG4gICAgdmFyIExJQlZFUlNJT04gID0gJzEuMC40MCcsXG4gICAgICAgIEVNUFRZICAgICAgID0gJycsXG4gICAgICAgIFVOS05PV04gICAgID0gJz8nLFxuICAgICAgICBGVU5DX1RZUEUgICA9ICdmdW5jdGlvbicsXG4gICAgICAgIFVOREVGX1RZUEUgID0gJ3VuZGVmaW5lZCcsXG4gICAgICAgIE9CSl9UWVBFICAgID0gJ29iamVjdCcsXG4gICAgICAgIFNUUl9UWVBFICAgID0gJ3N0cmluZycsXG4gICAgICAgIE1BSk9SICAgICAgID0gJ21ham9yJyxcbiAgICAgICAgTU9ERUwgICAgICAgPSAnbW9kZWwnLFxuICAgICAgICBOQU1FICAgICAgICA9ICduYW1lJyxcbiAgICAgICAgVFlQRSAgICAgICAgPSAndHlwZScsXG4gICAgICAgIFZFTkRPUiAgICAgID0gJ3ZlbmRvcicsXG4gICAgICAgIFZFUlNJT04gICAgID0gJ3ZlcnNpb24nLFxuICAgICAgICBBUkNISVRFQ1RVUkU9ICdhcmNoaXRlY3R1cmUnLFxuICAgICAgICBDT05TT0xFICAgICA9ICdjb25zb2xlJyxcbiAgICAgICAgTU9CSUxFICAgICAgPSAnbW9iaWxlJyxcbiAgICAgICAgVEFCTEVUICAgICAgPSAndGFibGV0JyxcbiAgICAgICAgU01BUlRUViAgICAgPSAnc21hcnR0dicsXG4gICAgICAgIFdFQVJBQkxFICAgID0gJ3dlYXJhYmxlJyxcbiAgICAgICAgRU1CRURERUQgICAgPSAnZW1iZWRkZWQnLFxuICAgICAgICBVQV9NQVhfTEVOR1RIID0gNTAwO1xuXG4gICAgdmFyIEFNQVpPTiAgPSAnQW1hem9uJyxcbiAgICAgICAgQVBQTEUgICA9ICdBcHBsZScsXG4gICAgICAgIEFTVVMgICAgPSAnQVNVUycsXG4gICAgICAgIEJMQUNLQkVSUlkgPSAnQmxhY2tCZXJyeScsXG4gICAgICAgIEJST1dTRVIgPSAnQnJvd3NlcicsXG4gICAgICAgIENIUk9NRSAgPSAnQ2hyb21lJyxcbiAgICAgICAgRURHRSAgICA9ICdFZGdlJyxcbiAgICAgICAgRklSRUZPWCA9ICdGaXJlZm94JyxcbiAgICAgICAgR09PR0xFICA9ICdHb29nbGUnLFxuICAgICAgICBIVUFXRUkgID0gJ0h1YXdlaScsXG4gICAgICAgIExHICAgICAgPSAnTEcnLFxuICAgICAgICBNSUNST1NPRlQgPSAnTWljcm9zb2Z0JyxcbiAgICAgICAgTU9UT1JPTEEgID0gJ01vdG9yb2xhJyxcbiAgICAgICAgT1BFUkEgICA9ICdPcGVyYScsXG4gICAgICAgIFNBTVNVTkcgPSAnU2Ftc3VuZycsXG4gICAgICAgIFNIQVJQICAgPSAnU2hhcnAnLFxuICAgICAgICBTT05ZICAgID0gJ1NvbnknLFxuICAgICAgICBYSUFPTUkgID0gJ1hpYW9taScsXG4gICAgICAgIFpFQlJBICAgPSAnWmVicmEnLFxuICAgICAgICBGQUNFQk9PSyAgICA9ICdGYWNlYm9vaycsXG4gICAgICAgIENIUk9NSVVNX09TID0gJ0Nocm9taXVtIE9TJyxcbiAgICAgICAgTUFDX09TICA9ICdNYWMgT1MnLFxuICAgICAgICBTVUZGSVhfQlJPV1NFUiA9ICcgQnJvd3Nlcic7XG5cbiAgICAvLy8vLy8vLy8vL1xuICAgIC8vIEhlbHBlclxuICAgIC8vLy8vLy8vLy9cblxuICAgIHZhciBleHRlbmQgPSBmdW5jdGlvbiAocmVnZXhlcywgZXh0ZW5zaW9ucykge1xuICAgICAgICAgICAgdmFyIG1lcmdlZFJlZ2V4ZXMgPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcmVnZXhlcykge1xuICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb25zW2ldICYmIGV4dGVuc2lvbnNbaV0ubGVuZ3RoICUgMiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBtZXJnZWRSZWdleGVzW2ldID0gZXh0ZW5zaW9uc1tpXS5jb25jYXQocmVnZXhlc1tpXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VkUmVnZXhlc1tpXSA9IHJlZ2V4ZXNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlZFJlZ2V4ZXM7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcml6ZSA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgICAgICAgICAgIHZhciBlbnVtcyA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGVudW1zW2FycltpXS50b1VwcGVyQ2FzZSgpXSA9IGFycltpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnVtcztcbiAgICAgICAgfSxcbiAgICAgICAgaGFzID0gZnVuY3Rpb24gKHN0cjEsIHN0cjIpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2Ygc3RyMSA9PT0gU1RSX1RZUEUgPyBsb3dlcml6ZShzdHIyKS5pbmRleE9mKGxvd2VyaXplKHN0cjEpKSAhPT0gLTEgOiBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgbG93ZXJpemUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1ham9yaXplID0gZnVuY3Rpb24gKHZlcnNpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YodmVyc2lvbikgPT09IFNUUl9UWVBFID8gdmVyc2lvbi5yZXBsYWNlKC9bXlxcZFxcLl0vZywgRU1QVFkpLnNwbGl0KCcuJylbMF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIHRyaW0gPSBmdW5jdGlvbiAoc3RyLCBsZW4pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Yoc3RyKSA9PT0gU1RSX1RZUEUpIHtcbiAgICAgICAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXlxcc1xccyovLCBFTVBUWSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZihsZW4pID09PSBVTkRFRl9UWVBFID8gc3RyIDogc3RyLnN1YnN0cmluZygwLCBVQV9NQVhfTEVOR1RIKTtcbiAgICAgICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gTWFwIGhlbHBlclxuICAgIC8vLy8vLy8vLy8vLy8vXG5cbiAgICB2YXIgcmd4TWFwcGVyID0gZnVuY3Rpb24gKHVhLCBhcnJheXMpIHtcblxuICAgICAgICAgICAgdmFyIGkgPSAwLCBqLCBrLCBwLCBxLCBtYXRjaGVzLCBtYXRjaDtcblxuICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGFsbCByZWdleGVzIG1hcHNcbiAgICAgICAgICAgIHdoaWxlIChpIDwgYXJyYXlzLmxlbmd0aCAmJiAhbWF0Y2hlcykge1xuXG4gICAgICAgICAgICAgICAgdmFyIHJlZ2V4ID0gYXJyYXlzW2ldLCAgICAgICAvLyBldmVuIHNlcXVlbmNlICgwLDIsNCwuLilcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBhcnJheXNbaSArIDFdOyAgIC8vIG9kZCBzZXF1ZW5jZSAoMSwzLDUsLi4pXG4gICAgICAgICAgICAgICAgaiA9IGsgPSAwO1xuXG4gICAgICAgICAgICAgICAgLy8gdHJ5IG1hdGNoaW5nIHVhc3RyaW5nIHdpdGggcmVnZXhlc1xuICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgcmVnZXgubGVuZ3RoICYmICFtYXRjaGVzKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdleFtqXSkgeyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gcmVnZXhbaisrXS5leGVjKHVhKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISFtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDwgcHJvcHMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoZXNbKytrXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gcHJvcHNbcF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgZ2l2ZW4gcHJvcGVydHkgaXMgYWN0dWFsbHkgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHEgPT09IE9CSl9UWVBFICYmIHEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcVsxXSA9PSBGVU5DX1RZUEUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3NpZ24gbW9kaWZpZWQgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3FbMF1dID0gcVsxXS5jYWxsKHRoaXMsIG1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzaWduIGdpdmVuIHZhbHVlLCBpZ25vcmUgcmVnZXggbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3FbMF1dID0gcVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciBmdW5jdGlvbiBvciByZWdleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBxWzFdID09PSBGVU5DX1RZUEUgJiYgIShxWzFdLmV4ZWMgJiYgcVsxXS50ZXN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGwgZnVuY3Rpb24gKHVzdWFsbHkgc3RyaW5nIG1hcHBlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3FbMF1dID0gbWF0Y2ggPyBxWzFdLmNhbGwodGhpcywgbWF0Y2gsIHFbMl0pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYW5pdGl6ZSBtYXRjaCB1c2luZyBnaXZlbiByZWdleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbcVswXV0gPSBtYXRjaCA/IG1hdGNoLnJlcGxhY2UocVsxXSwgcVsyXSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocS5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3FbMF1dID0gbWF0Y2ggPyBxWzNdLmNhbGwodGhpcywgbWF0Y2gucmVwbGFjZShxWzFdLCBxWzJdKSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3FdID0gbWF0Y2ggPyBtYXRjaCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHN0ck1hcHBlciA9IGZ1bmN0aW9uIChzdHIsIG1hcCkge1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIG1hcCkge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGN1cnJlbnQgdmFsdWUgaXMgYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1hcFtpXSA9PT0gT0JKX1RZUEUgJiYgbWFwW2ldLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtYXBbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXMobWFwW2ldW2pdLCBzdHIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpID09PSBVTktOT1dOKSA/IHVuZGVmaW5lZCA6IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhcyhtYXBbaV0sIHN0cikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpID09PSBVTktOT1dOKSA/IHVuZGVmaW5lZCA6IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1hcC5oYXNPd25Qcm9wZXJ0eSgnKicpID8gbWFwWycqJ10gOiBzdHI7XG4gICAgfTtcblxuICAgIC8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIFN0cmluZyBtYXBcbiAgICAvLy8vLy8vLy8vLy8vL1xuXG4gICAgLy8gU2FmYXJpIDwgMy4wXG4gICAgdmFyIG9sZFNhZmFyaU1hcCA9IHtcbiAgICAgICAgICAgICcxLjAnICAgOiAnLzgnLFxuICAgICAgICAgICAgJzEuMicgICA6ICcvMScsXG4gICAgICAgICAgICAnMS4zJyAgIDogJy8zJyxcbiAgICAgICAgICAgICcyLjAnICAgOiAnLzQxMicsXG4gICAgICAgICAgICAnMi4wLjInIDogJy80MTYnLFxuICAgICAgICAgICAgJzIuMC4zJyA6ICcvNDE3JyxcbiAgICAgICAgICAgICcyLjAuNCcgOiAnLzQxOScsXG4gICAgICAgICAgICAnPycgICAgIDogJy8nXG4gICAgICAgIH0sXG4gICAgICAgIHdpbmRvd3NWZXJzaW9uTWFwID0ge1xuICAgICAgICAgICAgJ01FJyAgICAgICAgOiAnNC45MCcsXG4gICAgICAgICAgICAnTlQgMy4xMScgICA6ICdOVDMuNTEnLFxuICAgICAgICAgICAgJ05UIDQuMCcgICAgOiAnTlQ0LjAnLFxuICAgICAgICAgICAgJzIwMDAnICAgICAgOiAnTlQgNS4wJyxcbiAgICAgICAgICAgICdYUCcgICAgICAgIDogWydOVCA1LjEnLCAnTlQgNS4yJ10sXG4gICAgICAgICAgICAnVmlzdGEnICAgICA6ICdOVCA2LjAnLFxuICAgICAgICAgICAgJzcnICAgICAgICAgOiAnTlQgNi4xJyxcbiAgICAgICAgICAgICc4JyAgICAgICAgIDogJ05UIDYuMicsXG4gICAgICAgICAgICAnOC4xJyAgICAgICA6ICdOVCA2LjMnLFxuICAgICAgICAgICAgJzEwJyAgICAgICAgOiBbJ05UIDYuNCcsICdOVCAxMC4wJ10sXG4gICAgICAgICAgICAnUlQnICAgICAgICA6ICdBUk0nXG4gICAgfTtcblxuICAgIC8vLy8vLy8vLy8vLy8vXG4gICAgLy8gUmVnZXggbWFwXG4gICAgLy8vLy8vLy8vLy8vL1xuXG4gICAgdmFyIHJlZ2V4ZXMgPSB7XG5cbiAgICAgICAgYnJvd3NlciA6IFtbXG5cbiAgICAgICAgICAgIC9cXGIoPzpjcm1vfGNyaW9zKVxcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENocm9tZSBmb3IgQW5kcm9pZC9pT1NcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgJ0Nocm9tZSddXSwgW1xuICAgICAgICAgICAgL2VkZyg/OmV8aW9zfGEpP1xcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaWNyb3NvZnQgRWRnZVxuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCAnRWRnZSddXSwgW1xuXG4gICAgICAgICAgICAvLyBQcmVzdG8gYmFzZWRcbiAgICAgICAgICAgIC8ob3BlcmEgbWluaSlcXC8oWy1cXHdcXC5dKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlcmEgTWluaVxuICAgICAgICAgICAgLyhvcGVyYSBbbW9iaWxldGFiXXszLDZ9KVxcYi4rdmVyc2lvblxcLyhbLVxcd1xcLl0rKS9pLCAgICAgICAgICAgICAgICAgLy8gT3BlcmEgTW9iaS9UYWJsZXRcbiAgICAgICAgICAgIC8ob3BlcmEpKD86Lit2ZXJzaW9uXFwvfFtcXC8gXSspKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZXJhXG4gICAgICAgICAgICBdLCBbTkFNRSwgVkVSU0lPTl0sIFtcbiAgICAgICAgICAgIC9vcGlvc1tcXC8gXSsoW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlcmEgbWluaSBvbiBpcGhvbmUgPj0gOC4wXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIE9QRVJBKycgTWluaSddXSwgW1xuICAgICAgICAgICAgL1xcYm9wKD86cmcpP3hcXC8oW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlcmEgR1hcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgT1BFUkErJyBHWCddXSwgW1xuICAgICAgICAgICAgL1xcYm9wclxcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlcmEgV2Via2l0XG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIE9QRVJBXV0sIFtcblxuICAgICAgICAgICAgLy8gTWl4ZWRcbiAgICAgICAgICAgIC9cXGJiW2FpXSpkKD86dWhkfFt1Yl0qW2Fla29wcnN3eF17NSw2fSlbXFwvIF0/KFtcXHdcXC5dKykvaSAgICAgICAgICAgIC8vIEJhaWR1XG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICdCYWlkdSddXSwgW1xuICAgICAgICAgICAgL1xcYig/Om14YnJvd3NlcnxteGlvc3xteWllMilcXC8/KFstXFx3XFwuXSopXFxiL2kgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heHRob25cbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgJ01heHRob24nXV0sIFtcbiAgICAgICAgICAgIC8oa2luZGxlKVxcLyhbXFx3XFwuXSspL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2luZGxlXG4gICAgICAgICAgICAvKGx1bmFzY2FwZXxtYXh0aG9ufG5ldGZyb250fGphc21pbmV8YmxhemVyfHNsZWlwbmlyKVtcXC8gXT8oW1xcd1xcLl0qKS9pLCAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMdW5hc2NhcGUvTWF4dGhvbi9OZXRmcm9udC9KYXNtaW5lL0JsYXplci9TbGVpcG5pclxuICAgICAgICAgICAgLy8gVHJpZGVudCBiYXNlZFxuICAgICAgICAgICAgLyhhdmFudHxpZW1vYmlsZXxzbGltKD86YnJvd3Nlcnxib2F0fGpldCkpW1xcLyBdPyhbXFxkXFwuXSopL2ksICAgICAgICAvLyBBdmFudC9JRU1vYmlsZS9TbGltQnJvd3Nlci9TbGltQm9hdC9TbGltamV0XG4gICAgICAgICAgICAvKD86bXN8XFwoKShpZSkgKFtcXHdcXC5dKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmV0IEV4cGxvcmVyXG5cbiAgICAgICAgICAgIC8vIEJsaW5rL1dlYmtpdC9LSFRNTCBiYXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmxvY2svUm9ja01lbHQvTWlkb3JpL0VwaXBoYW55L1NpbGsvU2t5ZmlyZS9Cb2x0L0lyb24vSXJpZGl1bS9QaGFudG9tSlMvQm93c2VyL1F1cFppbGxhL0ZhbGtvblxuICAgICAgICAgICAgLyhmbG9ja3xyb2NrbWVsdHxtaWRvcml8ZXBpcGhhbnl8c2lsa3xza3lmaXJlfG92aWJyb3dzZXJ8Ym9sdHxpcm9ufHZpdmFsZGl8aXJpZGl1bXxwaGFudG9tanN8Ym93c2VyfHF1cHppbGxhfGZhbGtvbnxyZWtvbnF8cHVmZmlufGJyYXZlfHdoYWxlKD8hLituYXZlcil8cXFicm93c2VybGl0ZXxkdWNrZHVja2dvfGtsYXJ8aGVsaW98KD89Y29tb2RvXyk/ZHJhZ29uKVxcLyhbLVxcd1xcLl0rKS9pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWtvbnEvUHVmZmluL0JyYXZlL1doYWxlL1FRQnJvd3NlckxpdGUvUVEvL1ZpdmFsZGkvRHVja0R1Y2tHby9LbGFyL0hlbGlvL0RyYWdvblxuICAgICAgICAgICAgLyhoZXl0YXB8b3ZpfDExNSlicm93c2VyXFwvKFtcXGRcXC5dKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXlUYXAvT3ZpLzExNVxuICAgICAgICAgICAgLyh3ZWlibylfXyhbXFxkXFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlaWJvXG4gICAgICAgICAgICBdLCBbTkFNRSwgVkVSU0lPTl0sIFtcbiAgICAgICAgICAgIC9xdWFyayg/OnBjKT9cXC8oWy1cXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUXVhcmtcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgJ1F1YXJrJ11dLCBbXG4gICAgICAgICAgICAvXFxiZGRnXFwvKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEdWNrRHVja0dvXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICdEdWNrRHVja0dvJ11dLCBbXG4gICAgICAgICAgICAvKD86XFxidWM/ID9icm93c2VyfCg/Omp1Yy4rKXVjd2ViKVtcXC8gXT8oW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAvLyBVQ0Jyb3dzZXJcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgJ1VDJytCUk9XU0VSXV0sIFtcbiAgICAgICAgICAgIC9taWNyb20uK1xcYnFiY29yZVxcLyhbXFx3XFwuXSspL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlQ2hhdCBEZXNrdG9wIGZvciBXaW5kb3dzIEJ1aWx0LWluIEJyb3dzZXJcbiAgICAgICAgICAgIC9cXGJxYmNvcmVcXC8oW1xcd1xcLl0rKS4rbWljcm9tL2ksXG4gICAgICAgICAgICAvbWljcm9tZXNzZW5nZXJcXC8oW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlQ2hhdFxuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCAnV2VDaGF0J11dLCBbXG4gICAgICAgICAgICAva29ucXVlcm9yXFwvKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtvbnF1ZXJvclxuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCAnS29ucXVlcm9yJ11dLCBbXG4gICAgICAgICAgICAvdHJpZGVudC4rcnZbOiBdKFtcXHdcXC5dezEsOX0pXFxiLitsaWtlIGdlY2tvL2kgICAgICAgICAgICAgICAgICAgICAgIC8vIElFMTFcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgJ0lFJ11dLCBbXG4gICAgICAgICAgICAveWEoPzpzZWFyY2gpP2Jyb3dzZXJcXC8oW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFlhbmRleFxuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCAnWWFuZGV4J11dLCBbXG4gICAgICAgICAgICAvc2xicm93c2VyXFwvKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNtYXJ0IExlbm92byBCcm93c2VyXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICdTbWFydCBMZW5vdm8gJytCUk9XU0VSXV0sIFtcbiAgICAgICAgICAgIC8oYXZhc3R8YXZnKVxcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXZhc3QvQVZHIFNlY3VyZSBCcm93c2VyXG4gICAgICAgICAgICBdLCBbW05BTUUsIC8oLispLywgJyQxIFNlY3VyZSAnK0JST1dTRVJdLCBWRVJTSU9OXSwgW1xuICAgICAgICAgICAgL1xcYmZvY3VzXFwvKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyZWZveCBGb2N1c1xuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCBGSVJFRk9YKycgRm9jdXMnXV0sIFtcbiAgICAgICAgICAgIC9cXGJvcHRcXC8oW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZXJhIFRvdWNoXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIE9QRVJBKycgVG91Y2gnXV0sIFtcbiAgICAgICAgICAgIC9jb2NfY29jXFx3K1xcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvYyBDb2MgQnJvd3NlclxuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCAnQ29jIENvYyddXSwgW1xuICAgICAgICAgICAgL2RvbGZpblxcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2xwaGluXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICdEb2xwaGluJ11dLCBbXG4gICAgICAgICAgICAvY29hc3RcXC8oW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZXJhIENvYXN0XG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIE9QRVJBKycgQ29hc3QnXV0sIFtcbiAgICAgICAgICAgIC9taXVpYnJvd3NlclxcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTUlVSSBCcm93c2VyXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICdNSVVJJyArIFNVRkZJWF9CUk9XU0VSXV0sIFtcbiAgICAgICAgICAgIC9meGlvc1xcLyhbXFx3XFwuLV0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyZWZveCBmb3IgaU9TXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIEZJUkVGT1hdXSwgW1xuICAgICAgICAgICAgL1xcYnFpaG9vYnJvd3NlclxcLz8oW1xcd1xcLl0qKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMzYwXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICczNjAnXV0sIFtcbiAgICAgICAgICAgIC9cXGIocXEpXFwvKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFFRXG4gICAgICAgICAgICBdLCBbW05BTUUsIC8oLispLywgJyQxQnJvd3NlciddLCBWRVJTSU9OXSwgW1xuICAgICAgICAgICAgLyhvY3VsdXN8c2FpbGZpc2h8aHVhd2VpfHZpdm98cGljbylicm93c2VyXFwvKFtcXHdcXC5dKykvaVxuICAgICAgICAgICAgXSwgW1tOQU1FLCAvKC4rKS8sICckMScgKyBTVUZGSVhfQlJPV1NFUl0sIFZFUlNJT05dLCBbICAgICAgICAgICAgICAvLyBPY3VsdXMvU2FpbGZpc2gvSHVhd2VpQnJvd3Nlci9WaXZvQnJvd3Nlci9QaWNvQnJvd3NlclxuICAgICAgICAgICAgL3NhbXN1bmdicm93c2VyXFwvKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1zdW5nIEludGVybmV0XG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIFNBTVNVTkcgKyAnIEludGVybmV0J11dLCBbXG4gICAgICAgICAgICAvbWV0YXNyW1xcLyBdPyhbXFxkXFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvZ291IEV4cGxvcmVyXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICdTb2dvdSBFeHBsb3JlciddXSwgW1xuICAgICAgICAgICAgLyhzb2dvdSltb1xcdytcXC8oW1xcZFxcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29nb3UgTW9iaWxlXG4gICAgICAgICAgICBdLCBbW05BTUUsICdTb2dvdSBNb2JpbGUnXSwgVkVSU0lPTl0sIFtcbiAgICAgICAgICAgIC8oZWxlY3Ryb24pXFwvKFtcXHdcXC5dKykgc2FmYXJpL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxlY3Ryb24tYmFzZWQgQXBwXG4gICAgICAgICAgICAvKHRlc2xhKSg/OiBxdGNhcmJyb3dzZXJ8XFwvKDIwXFxkXFxkXFwuWy1cXHdcXC5dKykpL2ksICAgICAgICAgICAgICAgICAgIC8vIFRlc2xhXG4gICAgICAgICAgICAvbT8ocXFicm93c2VyfDIzNDUoPz1icm93c2VyfGNocm9tZXxleHBsb3JlcikpXFx3KltcXC8gXT92PyhbXFx3XFwuXSspL2kgICAvLyBRUS8yMzQ1XG4gICAgICAgICAgICBdLCBbTkFNRSwgVkVSU0lPTl0sIFtcbiAgICAgICAgICAgIC8obGJicm93c2VyfHJla29ucSkvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGllQmFvIEJyb3dzZXIvUmVrb25xXG4gICAgICAgICAgICAvXFxbKGxpbmtlZGluKWFwcFxcXS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGlua2VkSW4gQXBwIGZvciBpT1MgJiBBbmRyb2lkXG4gICAgICAgICAgICBdLCBbTkFNRV0sIFtcbiAgICAgICAgICAgIC9vbWVcXC8oW1xcd1xcLl0rKSBcXHcqID8oaXJvbikgc2FmL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElyb25cbiAgICAgICAgICAgIC9vbWVcXC8oW1xcd1xcLl0rKS4rcWlodSAoMzYwKVtlc11lL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMzYwXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgTkFNRV0sIFtcblxuICAgICAgICAgICAgLy8gV2ViVmlld1xuICAgICAgICAgICAgLygoPzpmYmFuXFwvZmJpb3N8ZmJfaWFiXFwvZmI0YSkoPyEuK2ZiYXYpfDtmYmF2XFwvKFtcXHdcXC5dKyk7KS9pICAgICAgIC8vIEZhY2Vib29rIEFwcCBmb3IgaU9TICYgQW5kcm9pZFxuICAgICAgICAgICAgXSwgW1tOQU1FLCBGQUNFQk9PS10sIFZFUlNJT05dLCBbXG4gICAgICAgICAgICAvKEtsYXJuYSlcXC8oW1xcd1xcLl0rKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtsYXJuYSBTaG9wcGluZyBCcm93c2VyIGZvciBpT1MgJiBBbmRyb2lkXG4gICAgICAgICAgICAvKGtha2FvKD86dGFsa3xzdG9yeSkpW1xcLyBdKFtcXHdcXC5dKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtha2FvIEFwcFxuICAgICAgICAgICAgLyhuYXZlcilcXCguKj8oXFxkK1xcLltcXHdcXC5dKykuKlxcKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXZlciBJbkFwcFxuICAgICAgICAgICAgL3NhZmFyaSAobGluZSlcXC8oW1xcd1xcLl0rKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMaW5lIEFwcCBmb3IgaU9TXG4gICAgICAgICAgICAvXFxiKGxpbmUpXFwvKFtcXHdcXC5dKylcXC9pYWIvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGluZSBBcHAgZm9yIEFuZHJvaWRcbiAgICAgICAgICAgIC8oYWxpcGF5KWNsaWVudFxcLyhbXFx3XFwuXSspL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxpcGF5XG4gICAgICAgICAgICAvKHR3aXR0ZXIpKD86YW5kfCBmLitlXFwvKFtcXHdcXC5dKykpL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXR0ZXJcbiAgICAgICAgICAgIC8oY2hyb21pdW18aW5zdGFncmFtfHNuYXBjaGF0KVtcXC8gXShbLVxcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgLy8gQ2hyb21pdW0vSW5zdGFncmFtL1NuYXBjaGF0XG4gICAgICAgICAgICBdLCBbTkFNRSwgVkVSU0lPTl0sIFtcbiAgICAgICAgICAgIC9cXGJnc2FcXC8oW1xcd1xcLl0rKSAuKnNhZmFyaVxcLy9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHb29nbGUgU2VhcmNoIEFwcGxpYW5jZSBvbiBpT1NcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgJ0dTQSddXSwgW1xuICAgICAgICAgICAgL211c2ljYWxfbHkoPzouK2FwcF8/dmVyc2lvblxcL3xfKShbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaWtUb2tcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgJ1Rpa1RvayddXSwgW1xuXG4gICAgICAgICAgICAvaGVhZGxlc3NjaHJvbWUoPzpcXC8oW1xcd1xcLl0rKXwgKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENocm9tZSBIZWFkbGVzc1xuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCBDSFJPTUUrJyBIZWFkbGVzcyddXSwgW1xuXG4gICAgICAgICAgICAvIHd2XFwpLisoY2hyb21lKVxcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaHJvbWUgV2ViVmlld1xuICAgICAgICAgICAgXSwgW1tOQU1FLCBDSFJPTUUrJyBXZWJWaWV3J10sIFZFUlNJT05dLCBbXG5cbiAgICAgICAgICAgIC9kcm9pZC4rIHZlcnNpb25cXC8oW1xcd1xcLl0rKVxcYi4rKD86bW9iaWxlIHNhZmFyaXxzYWZhcmkpL2kgICAgICAgICAgIC8vIEFuZHJvaWQgQnJvd3NlclxuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCAnQW5kcm9pZCAnK0JST1dTRVJdXSwgW1xuXG4gICAgICAgICAgICAvKGNocm9tZXxvbW5pd2VifGFyb3JhfFt0aXplbm9rYV17NX0gP2Jyb3dzZXIpXFwvdj8oW1xcd1xcLl0rKS9pICAgICAgIC8vIENocm9tZS9PbW5pV2ViL0Fyb3JhL1RpemVuL05va2lhXG4gICAgICAgICAgICBdLCBbTkFNRSwgVkVSU0lPTl0sIFtcblxuICAgICAgICAgICAgL3ZlcnNpb25cXC8oW1xcd1xcLlxcLF0rKSAuKm1vYmlsZVxcL1xcdysgKHNhZmFyaSkvaSAgICAgICAgICAgICAgICAgICAgICAvLyBNb2JpbGUgU2FmYXJpXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICdNb2JpbGUgU2FmYXJpJ11dLCBbXG4gICAgICAgICAgICAvdmVyc2lvblxcLyhbXFx3KFxcLnxcXCwpXSspIC4qKG1vYmlsZSA/c2FmYXJpfHNhZmFyaSkvaSAgICAgICAgICAgICAgICAvLyBTYWZhcmkgJiBTYWZhcmkgTW9iaWxlXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgTkFNRV0sIFtcbiAgICAgICAgICAgIC93ZWJraXQuKz8obW9iaWxlID9zYWZhcml8c2FmYXJpKShcXC9bXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgLy8gU2FmYXJpIDwgMy4wXG4gICAgICAgICAgICBdLCBbTkFNRSwgW1ZFUlNJT04sIHN0ck1hcHBlciwgb2xkU2FmYXJpTWFwXV0sIFtcblxuICAgICAgICAgICAgLyh3ZWJraXR8a2h0bWwpXFwvKFtcXHdcXC5dKykvaVxuICAgICAgICAgICAgXSwgW05BTUUsIFZFUlNJT05dLCBbXG5cbiAgICAgICAgICAgIC8vIEdlY2tvIGJhc2VkXG4gICAgICAgICAgICAvKG5hdmlnYXRvcnxuZXRzY2FwZVxcZD8pXFwvKFstXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXRzY2FwZVxuICAgICAgICAgICAgXSwgW1tOQU1FLCAnTmV0c2NhcGUnXSwgVkVSU0lPTl0sIFtcbiAgICAgICAgICAgIC8od29sdmljfGxpYnJld29sZilcXC8oW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV29sdmljL0xpYnJlV29sZlxuICAgICAgICAgICAgXSwgW05BTUUsIFZFUlNJT05dLCBbXG4gICAgICAgICAgICAvbW9iaWxlIHZyOyBydjooW1xcd1xcLl0rKVxcKS4rZmlyZWZveC9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggUmVhbGl0eVxuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCBGSVJFRk9YKycgUmVhbGl0eSddXSwgW1xuICAgICAgICAgICAgL2VraW9oZi4rKGZsb3cpXFwvKFtcXHdcXC5dKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGbG93XG4gICAgICAgICAgICAvKHN3aWZ0Zm94KS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN3aWZ0Zm94XG4gICAgICAgICAgICAvKGljZWRyYWdvbnxpY2V3ZWFzZWx8Y2FtaW5vfGNoaW1lcmF8ZmVubmVjfG1hZW1vIGJyb3dzZXJ8bWluaW1vfGNvbmtlcm9yKVtcXC8gXT8oW1xcd1xcLlxcK10rKS9pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJY2VEcmFnb24vSWNld2Vhc2VsL0NhbWluby9DaGltZXJhL0Zlbm5lYy9NYWVtby9NaW5pbW8vQ29ua2Vyb3JcbiAgICAgICAgICAgIC8oc2VhbW9ua2V5fGstbWVsZW9ufGljZWNhdHxpY2VhcGV8ZmlyZWJpcmR8cGhvZW5peHxwYWxlbW9vbnxiYXNpbGlza3x3YXRlcmZveClcXC8oWy1cXHdcXC5dKykkL2ksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcmVmb3gvU2VhTW9ua2V5L0stTWVsZW9uL0ljZUNhdC9JY2VBcGUvRmlyZWJpcmQvUGhvZW5peFxuICAgICAgICAgICAgLyhmaXJlZm94KVxcLyhbXFx3XFwuXSspL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciBGaXJlZm94LWJhc2VkXG4gICAgICAgICAgICAvKG1vemlsbGEpXFwvKFtcXHdcXC5dKykgLitydlxcOi4rZ2Vja29cXC9cXGQrL2ksICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vemlsbGFcblxuICAgICAgICAgICAgLy8gT3RoZXJcbiAgICAgICAgICAgIC8ocG9sYXJpc3xseW54fGRpbGxvfGljYWJ8ZG9yaXN8YW1heWF8dzNtfG5ldHN1cmZ8b2JpZ298bW9zYWljfCg/OmdvfGljZXx1cClbXFwuIF0/YnJvd3NlcilbLVxcLyBdP3Y/KFtcXHdcXC5dKykvaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9sYXJpcy9MeW54L0RpbGxvL2lDYWIvRG9yaXMvQW1heWEvdzNtL05ldFN1cmYvT2JpZ28vTW9zYWljL0dvL0lDRS9VUC5Ccm93c2VyXG4gICAgICAgICAgICAvKGxpbmtzKSBcXCgoW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExpbmtzXG4gICAgICAgICAgICBdLCBbTkFNRSwgW1ZFUlNJT04sIC9fL2csICcuJ11dLCBbXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8oY29iYWx0KVxcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29iYWx0XG4gICAgICAgICAgICBdLCBbTkFNRSwgW1ZFUlNJT04sIC9tYXN0ZXIufGx0cy4vLCBcIlwiXV1cbiAgICAgICAgXSxcblxuICAgICAgICBjcHUgOiBbW1xuXG4gICAgICAgICAgICAvKD86KGFtZHx4KD86KD86ODZ8NjQpWy1fXSk/fHdvd3x3aW4pNjQpWztcXCldL2kgICAgICAgICAgICAgICAgICAgICAvLyBBTUQ2NCAoeDY0KVxuICAgICAgICAgICAgXSwgW1tBUkNISVRFQ1RVUkUsICdhbWQ2NCddXSwgW1xuXG4gICAgICAgICAgICAvKGlhMzIoPz07KSkvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElBMzIgKHF1aWNrdGltZSlcbiAgICAgICAgICAgIF0sIFtbQVJDSElURUNUVVJFLCBsb3dlcml6ZV1dLCBbXG5cbiAgICAgICAgICAgIC8oKD86aVszNDZdfHgpODYpWztcXCldL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElBMzIgKHg4NilcbiAgICAgICAgICAgIF0sIFtbQVJDSElURUNUVVJFLCAnaWEzMiddXSwgW1xuXG4gICAgICAgICAgICAvXFxiKGFhcmNoNjR8YXJtKHY/OGU/bD98Xz82NCkpXFxiL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBUk02NFxuICAgICAgICAgICAgXSwgW1tBUkNISVRFQ1RVUkUsICdhcm02NCddXSwgW1xuXG4gICAgICAgICAgICAvXFxiKGFybSg/OnZbNjddKT9odD9uP1tmbF1wPylcXGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQVJNSEZcbiAgICAgICAgICAgIF0sIFtbQVJDSElURUNUVVJFLCAnYXJtaGYnXV0sIFtcblxuICAgICAgICAgICAgLy8gUG9ja2V0UEMgbWlzdGFrZW5seSBpZGVudGlmaWVkIGFzIFBvd2VyUENcbiAgICAgICAgICAgIC93aW5kb3dzIChjZXxtb2JpbGUpOyBwcGM7L2lcbiAgICAgICAgICAgIF0sIFtbQVJDSElURUNUVVJFLCAnYXJtJ11dLCBbXG5cbiAgICAgICAgICAgIC8oKD86cHBjfHBvd2VycGMpKD86NjQpPykoPzogbWFjfDt8XFwpKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvd2VyUENcbiAgICAgICAgICAgIF0sIFtbQVJDSElURUNUVVJFLCAvb3dlci8sIEVNUFRZLCBsb3dlcml6ZV1dLCBbXG5cbiAgICAgICAgICAgIC8oc3VuNFxcdylbO1xcKV0vaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTUEFSQ1xuICAgICAgICAgICAgXSwgW1tBUkNISVRFQ1RVUkUsICdzcGFyYyddXSwgW1xuXG4gICAgICAgICAgICAvKCg/OmF2cjMyfGlhNjQoPz07KSl8NjhrKD89XFwpKXxcXGJhcm0oPz12KD86WzEtN118WzUtN10xKWw/fDt8ZWFiaSl8KD89YXRtZWwgKWF2cnwoPzppcml4fG1pcHN8c3BhcmMpKD86NjQpP1xcYnxwYS1yaXNjKS9pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElBNjQsIDY4SywgQVJNLzY0LCBBVlIvMzIsIElSSVgvNjQsIE1JUFMvNjQsIFNQQVJDLzY0LCBQQS1SSVNDXG4gICAgICAgICAgICBdLCBbW0FSQ0hJVEVDVFVSRSwgbG93ZXJpemVdXVxuICAgICAgICBdLFxuXG4gICAgICAgIGRldmljZSA6IFtbXG5cbiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgICAgICAvLyBNT0JJTEVTICYgVEFCTEVUU1xuICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgICAgICAvLyBTYW1zdW5nXG4gICAgICAgICAgICAvXFxiKHNjaC1pWzg5XTBcXGR8c2h3LW0zODBzfHNtLVtwdHhdXFx3ezIsNH18Z3QtW3BuXVxcZHsyLDR9fHNnaC10OFs1Nl05fG5leHVzIDEwKS9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIFNBTVNVTkddLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC9cXGIoKD86c1tjZ3BdaHxndHxzbSktKD8hW2xyXSlcXHcrfHNjW2ctXT9bXFxkXSthP3xnYWxheHkgbmV4dXMpL2ksXG4gICAgICAgICAgICAvc2Ftc3VuZ1stIF0oKD8hc20tW2xyXSlbLVxcd10rKS9pLFxuICAgICAgICAgICAgL3NlYy0oc2doXFx3KykvaVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBTQU1TVU5HXSwgW1RZUEUsIE1PQklMRV1dLCBbXG5cbiAgICAgICAgICAgIC8vIEFwcGxlXG4gICAgICAgICAgICAvKD86XFwvfFxcKCkoaXAoPzpob25lfG9kKVtcXHcsIF0qKSg/OlxcL3w7KS9pICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpUG9kL2lQaG9uZVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBBUFBMRV0sIFtUWVBFLCBNT0JJTEVdXSwgW1xuICAgICAgICAgICAgL1xcKChpcGFkKTtbLVxcd1xcKSw7IF0rYXBwbGUvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpUGFkXG4gICAgICAgICAgICAvYXBwbGVjb3JlbWVkaWFcXC9bXFx3XFwuXSsgXFwoKGlwYWQpL2ksXG4gICAgICAgICAgICAvXFxiKGlwYWQpXFxkXFxkPyxcXGRcXGQ/WztcXF1dLitpb3MvaVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBBUFBMRV0sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgLyhtYWNpbnRvc2gpOy9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIEFQUExFXV0sIFtcblxuICAgICAgICAgICAgLy8gU2hhcnBcbiAgICAgICAgICAgIC9cXGIoc2gtP1thbHR2el0/XFxkXFxkW2EtZWttXT8pL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgU0hBUlBdLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLy8gSG9ub3JcbiAgICAgICAgICAgIC8oPzpob25vcikoWy1cXHcgXSspWztcXCldL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ0hvbm9yJ10sIFtUWVBFLCBNT0JJTEVdXSwgW1xuXG4gICAgICAgICAgICAvLyBIdWF3ZWlcbiAgICAgICAgICAgIC9cXGIoKD86YWdbcnNdWzIzXT98YmFoMj98c2h0P3xidHYpLWE/W2x3XVxcZHsyfSlcXGIoPyEuK2RcXC9zKS9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIEhVQVdFSV0sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgLyg/Omh1YXdlaSkoWy1cXHcgXSspWztcXCldL2ksXG4gICAgICAgICAgICAvXFxiKG5leHVzIDZwfFxcd3syLDR9ZT8tW2F0dV0/W2xuXVtcXGR4XVswMTIzNTljXVthZG5dPylcXGIoPyEuK2RcXC9zKS9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIEhVQVdFSV0sIFtUWVBFLCBNT0JJTEVdXSwgW1xuXG4gICAgICAgICAgICAvLyBYaWFvbWlcbiAgICAgICAgICAgIC9cXGIocG9jb1tcXHcgXSt8bTJcXGR7M31qXFxkXFxkW2Etel17Mn0pKD86IGJ1aXxcXCkpL2ksICAgICAgICAgICAgICAgICAgLy8gWGlhb21pIFBPQ09cbiAgICAgICAgICAgIC9cXGI7IChcXHcrKSBidWlsZFxcL2htXFwxL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhpYW9taSBIb25nbWkgJ251bWVyaWMnIG1vZGVsc1xuICAgICAgICAgICAgL1xcYihobVstXyBdP25vdGU/W18gXT8oPzpcXGRcXHcpPykgYnVpL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYaWFvbWkgSG9uZ21pXG4gICAgICAgICAgICAvXFxiKHJlZG1pW1xcLV8gXT8oPzpub3RlfGspP1tcXHdfIF0rKSg/OiBidWl8XFwpKS9pLCAgICAgICAgICAgICAgICAgICAvLyBYaWFvbWkgUmVkbWlcbiAgICAgICAgICAgIC9vaWRbXlxcKV0rOyAobT9bMTJdWzAtMzg5XVswMV1cXHd7Myw2fVtjLXldKSggYnVpfDsgd3Z8XFwpKS9pLCAgICAgICAgLy8gWGlhb21pIFJlZG1pICdudW1lcmljJyBtb2RlbHNcbiAgICAgICAgICAgIC9cXGIobWlbLV8gXT8oPzphXFxkfG9uZXxvbmVbXyBdcGx1c3xub3RlIGx0ZXxtYXh8Y2MpP1tfIF0/KD86XFxkP1xcdz8pW18gXT8oPzpwbHVzfHNlfGxpdGV8cHJvKT8pKD86IGJ1aXxcXCkpL2kgLy8gWGlhb21pIE1pXG4gICAgICAgICAgICBdLCBbW01PREVMLCAvXy9nLCAnICddLCBbVkVORE9SLCBYSUFPTUldLCBbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC9vaWRbXlxcKV0rOyAoMlxcZHs0fSgyODN8cnBiZilbY2dsXSkoIGJ1aXxcXCkpL2ksICAgICAgICAgICAgICAgICAgICAgLy8gUmVkbWkgUGFkXG4gICAgICAgICAgICAvXFxiKG1pWy1fIF0/KD86cGFkKSg/OltcXHdfIF0rKSkoPzogYnVpfFxcKSkvaSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pIFBhZCB0YWJsZXRzXG4gICAgICAgICAgICBdLFtbTU9ERUwsIC9fL2csICcgJ10sIFtWRU5ET1IsIFhJQU9NSV0sIFtUWVBFLCBUQUJMRVRdXSwgW1xuXG4gICAgICAgICAgICAvLyBPUFBPXG4gICAgICAgICAgICAvOyAoXFx3KykgYnVpLisgb3Bwby9pLFxuICAgICAgICAgICAgL1xcYihjcGhbMTJdXFxkezN9fHAoPzphZnxjW2FsXXxkXFx3fGVbYXJdKVttdF1cXGQwfHg5MDA3fGExMDFvcClcXGIvaVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnT1BQTyddLCBbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC9cXGIob3BkMlxcZHszfWE/KSBidWkvaVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnT1BQTyddLCBbVFlQRSwgVEFCTEVUXV0sIFtcblxuICAgICAgICAgICAgLy8gVml2b1xuICAgICAgICAgICAgL3Zpdm8gKFxcdyspKD86IGJ1aXxcXCkpL2ksXG4gICAgICAgICAgICAvXFxiKHZbMTJdXFxkezN9XFx3P1thdF0pKD86IGJ1aXw7KS9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdWaXZvJ10sIFtUWVBFLCBNT0JJTEVdXSwgW1xuXG4gICAgICAgICAgICAvLyBSZWFsbWVcbiAgICAgICAgICAgIC9cXGIocm14WzEtM11cXGR7M30pKD86IGJ1aXw7fFxcKSkvaVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnUmVhbG1lJ10sIFtUWVBFLCBNT0JJTEVdXSwgW1xuXG4gICAgICAgICAgICAvLyBNb3Rvcm9sYVxuICAgICAgICAgICAgL1xcYihtaWxlc3RvbmV8ZHJvaWQoPzpbMi00eF18ICg/OmJpb25pY3x4Mnxwcm98cmF6cikpPzo/KCA0Zyk/KVxcYltcXHcgXStidWlsZFxcLy9pLFxuICAgICAgICAgICAgL1xcYm1vdCg/Om9yb2xhKT9bLSBdKFxcdyopL2ksXG4gICAgICAgICAgICAvKCg/Om1vdG9bXFx3XFwoXFwpIF0rfHh0XFxkezMsNH18bmV4dXMgNikoPz0gYnVpfFxcKSkpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgTU9UT1JPTEFdLCBbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC9cXGIobXo2MFxcZHx4b29tWzIgXXswLDJ9KSBidWlsZFxcLy9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIE1PVE9ST0xBXSwgW1RZUEUsIFRBQkxFVF1dLCBbXG5cbiAgICAgICAgICAgIC8vIExHXG4gICAgICAgICAgICAvKCg/PWxnKT9bdmxda1xcLT9cXGR7M30pIGJ1aXwgM1xcLlstXFx3OyBdezEwfWxnPy0oWzA2Y3Y5XXszLDR9KS9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIExHXSwgW1RZUEUsIFRBQkxFVF1dLCBbXG4gICAgICAgICAgICAvKGxtKD86LT9mMTAwW252XT98LVtcXHdcXC5dKykoPz0gYnVpfFxcKSl8bmV4dXMgWzQ1XSkvaSxcbiAgICAgICAgICAgIC9cXGJsZ1stZTtcXC8gXSsoKD8hYnJvd3NlcnxuZXRjYXN0fGFuZHJvaWQgdHYpXFx3KykvaSxcbiAgICAgICAgICAgIC9cXGJsZy0/KFtcXGRcXHddKykgYnVpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgTEddLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLy8gTGVub3ZvXG4gICAgICAgICAgICAvKGlkZWF0YWJbLVxcdyBdKykvaSxcbiAgICAgICAgICAgIC9sZW5vdm8gPyhzWzU2XTAwMFstXFx3XSt8dGFiKD86W1xcdyBdKyl8eXRbLVxcZFxcd117Nn18dGJbLVxcZFxcd117Nn0pL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ0xlbm92byddLCBbVFlQRSwgVEFCTEVUXV0sIFtcblxuICAgICAgICAgICAgLy8gTm9raWFcbiAgICAgICAgICAgIC8oPzptYWVtb3xub2tpYSkuKihuOTAwfGx1bWlhIFxcZCspL2ksXG4gICAgICAgICAgICAvbm9raWFbLV8gXT8oWy1cXHdcXC5dKikvaVxuICAgICAgICAgICAgXSwgW1tNT0RFTCwgL18vZywgJyAnXSwgW1ZFTkRPUiwgJ05va2lhJ10sIFtUWVBFLCBNT0JJTEVdXSwgW1xuXG4gICAgICAgICAgICAvLyBHb29nbGVcbiAgICAgICAgICAgIC8ocGl4ZWwgYylcXGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBQaXhlbCBDXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIEdPT0dMRV0sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgL2Ryb2lkLis7IChwaXhlbFtcXGRheGwgXXswLDZ9KSg/OiBidWl8XFwpKS9pICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBQaXhlbFxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBHT09HTEVdLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLy8gU29ueVxuICAgICAgICAgICAgL2Ryb2lkLis7IChhP1xcZFswLTJdezJ9c298W2MtZ11cXGR7NH18c29bLWdsXVxcdyt8eHEtYVxcd1s0LTddWzEyXSkoPz0gYnVpfFxcKS4rY2hyb21lXFwvKD8hWzEtNl17MCwxfVxcZFxcLikpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgU09OWV0sIFtUWVBFLCBNT0JJTEVdXSwgW1xuICAgICAgICAgICAgL3NvbnkgdGFibGV0IFtwc10vaSxcbiAgICAgICAgICAgIC9cXGIoPzpzb255KT9zZ3BcXHcrKD86IGJ1aXxcXCkpL2lcbiAgICAgICAgICAgIF0sIFtbTU9ERUwsICdYcGVyaWEgVGFibGV0J10sIFtWRU5ET1IsIFNPTlldLCBbVFlQRSwgVEFCTEVUXV0sIFtcblxuICAgICAgICAgICAgLy8gT25lUGx1c1xuICAgICAgICAgICAgLyAoa2IyMDA1fGluMjBbMTJdNXxiZTIwWzEyXVs1OV0pXFxiL2ksXG4gICAgICAgICAgICAvKD86b25lKT8oPzpwbHVzKT8gKGFcXGQwXFxkXFxkKSg/OiBifFxcKSkvaVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnT25lUGx1cyddLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLy8gQW1hem9uXG4gICAgICAgICAgICAvKGFsZXhhKXdlYm0vaSxcbiAgICAgICAgICAgIC8oa2ZbYS16XXsyfXdpfGFlbyg/IWJjKVxcd1xcdykoIGJ1aXxcXCkpL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2luZGxlIEZpcmUgd2l0aG91dCBTaWxrIC8gRWNobyBTaG93XG4gICAgICAgICAgICAvKGtmW2Etel0rKSggYnVpfFxcKSkuK3NpbGtcXC8vaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2luZGxlIEZpcmUgSERcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgQU1BWk9OXSwgW1RZUEUsIFRBQkxFVF1dLCBbXG4gICAgICAgICAgICAvKCg/OnNkfGtmKVswMzQ5aGlqb3JzdHV3XSspKCBidWl8XFwpKS4rc2lsa1xcLy9pICAgICAgICAgICAgICAgICAgICAgLy8gRmlyZSBQaG9uZVxuICAgICAgICAgICAgXSwgW1tNT0RFTCwgLyguKykvZywgJ0ZpcmUgUGhvbmUgJDEnXSwgW1ZFTkRPUiwgQU1BWk9OXSwgW1RZUEUsIE1PQklMRV1dLCBbXG5cbiAgICAgICAgICAgIC8vIEJsYWNrQmVycnlcbiAgICAgICAgICAgIC8ocGxheWJvb2spO1stXFx3XFwpLDsgXSsocmltKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCbGFja0JlcnJ5IFBsYXlCb29rXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFZFTkRPUiwgW1RZUEUsIFRBQkxFVF1dLCBbXG4gICAgICAgICAgICAvXFxiKCg/OmJiW2EtZl18c3RbaHZdKTEwMC1cXGQpL2ksXG4gICAgICAgICAgICAvXFwoYmIxMDsgKFxcdyspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmxhY2tCZXJyeSAxMFxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBCTEFDS0JFUlJZXSwgW1RZUEUsIE1PQklMRV1dLCBbXG5cbiAgICAgICAgICAgIC8vIEFzdXNcbiAgICAgICAgICAgIC8oPzpcXGJ8YXN1c18pKHRyYW5zZm9bcHJpbWUgXXs0LDEwfSBcXHcrfGVlZXBjfHNsaWRlciBcXHcrfG5leHVzIDd8cGFkZm9uZXxwMDBbY2pdKS9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIEFTVVNdLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC8gKHpbYmVzXTZbMDI3XVswMTJdW2ttXVtsc118emVuZm9uZSBcXGRcXHc/KVxcYi9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIEFTVVNdLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLy8gSFRDXG4gICAgICAgICAgICAvKG5leHVzIDkpL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhUQyBOZXh1cyA5XG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdIVEMnXSwgW1RZUEUsIFRBQkxFVF1dLCBbXG4gICAgICAgICAgICAvKGh0YylbLTtfIF17MSwyfShbXFx3IF0rKD89XFwpfCBidWkpfFxcdyspL2ksICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhUQ1xuXG4gICAgICAgICAgICAvLyBaVEVcbiAgICAgICAgICAgIC8oenRlKVstIF0oW1xcdyBdKz8pKD86IGJ1aXxcXC98XFwpKS9pLFxuICAgICAgICAgICAgLyhhbGNhdGVsfGdlZWtzcGhvbmV8bmV4aWFufHBhbmFzb25pYyg/ISg/Ojt8XFwuKSl8c29ueSg/IS1icmEpKVstXyBdPyhbLVxcd10qKS9pICAgICAgICAgLy8gQWxjYXRlbC9HZWVrc1Bob25lL05leGlhbi9QYW5hc29uaWMvU29ueVxuICAgICAgICAgICAgXSwgW1ZFTkRPUiwgW01PREVMLCAvXy9nLCAnICddLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLy8gVENMXG4gICAgICAgICAgICAvZHJvaWQgW1xcd1xcLl0rOyAoKD86OFsxNF05WzE2XXw5KD86MCg/OjQ4fDYwfDhbMDFdKXwxKD86M1syN118NjYpfDIoPzo2WzY5XXw5WzU2XSl8NDY2KSlbZ3Fzd3hdKVxcdyooXFwpfCBidWkpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ1RDTCddLCBbVFlQRSwgVEFCTEVUXV0sIFtcblxuICAgICAgICAgICAgLy8gaXRlbFxuICAgICAgICAgICAgLyhpdGVsKSAoKFxcdyspKS9pXG4gICAgICAgICAgICBdLCBbW1ZFTkRPUiwgbG93ZXJpemVdLCBNT0RFTCwgW1RZUEUsIHN0ck1hcHBlciwgeyAndGFibGV0JyA6IFsncDEwMDAxbCcsICd3NzAwMSddLCAnKicgOiAnbW9iaWxlJyB9XV0sIFtcblxuICAgICAgICAgICAgLy8gQWNlclxuICAgICAgICAgICAgL2Ryb2lkLis7IChbYWJdWzEtN10tP1swMTc4YV1cXGRcXGQ/KS9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdBY2VyJ10sIFtUWVBFLCBUQUJMRVRdXSwgW1xuXG4gICAgICAgICAgICAvLyBNZWl6dVxuICAgICAgICAgICAgL2Ryb2lkLis7IChtWzEtNV0gbm90ZSkgYnVpL2ksXG4gICAgICAgICAgICAvXFxibXotKFstXFx3XXsyLH0pL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ01laXp1J10sIFtUWVBFLCBNT0JJTEVdXSwgW1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVWxlZm9uZVxuICAgICAgICAgICAgLzsgKCg/OnBvd2VyICk/YXJtb3IoPzpbXFx3IF17MCw4fSkpKD86IGJ1aXxcXCkpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ1VsZWZvbmUnXSwgW1RZUEUsIE1PQklMRV1dLCBbXG5cbiAgICAgICAgICAgIC8vIEVuZXJnaXplclxuICAgICAgICAgICAgLzsgKGVuZXJneSA/XFx3KykoPzogYnVpfFxcKSkvaSxcbiAgICAgICAgICAgIC87IGVuZXJnaXplciAoW1xcdyBdKykoPzogYnVpfFxcKSkvaVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnRW5lcmdpemVyJ10sIFtUWVBFLCBNT0JJTEVdXSwgW1xuXG4gICAgICAgICAgICAvLyBDYXRcbiAgICAgICAgICAgIC87IGNhdCAoYjM1KTsvaSxcbiAgICAgICAgICAgIC87IChiMTVxP3xzMjIgZmxpcHxzNDhjfHM2MiBwcm8pKD86IGJ1aXxcXCkpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ0NhdCddLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLy8gU21hcnRmcmVuXG4gICAgICAgICAgICAvKCg/Om5ldyApP2FuZHJvbWF4W1xcdy0gXSspKD86IGJ1aXxcXCkpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ1NtYXJ0ZnJlbiddLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLy8gTm90aGluZ1xuICAgICAgICAgICAgL2Ryb2lkLis7IChhKD86MDE1fDA2WzM1XXwxNDJwPykpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ05vdGhpbmcnXSwgW1RZUEUsIE1PQklMRV1dLCBbXG5cbiAgICAgICAgICAgIC8vIE1JWEVEXG4gICAgICAgICAgICAvKGJsYWNrYmVycnl8YmVucXxwYWxtKD89XFwtKXxzb255ZXJpY3Nzb258YWNlcnxhc3VzfGRlbGx8bWVpenV8bW90b3JvbGF8cG9seXRyb258aW5maW5peHx0ZWNub3xtaWNyb21heHxhZHZhbilbLV8gXT8oWy1cXHddKikvaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmxhY2tCZXJyeS9CZW5RL1BhbG0vU29ueS1Fcmljc3Nvbi9BY2VyL0FzdXMvRGVsbC9NZWl6dS9Nb3Rvcm9sYS9Qb2x5dHJvbi9JbmZpbml4L1RlY25vL01pY3JvbWF4L0FkdmFuXG4gICAgICAgICAgICAvOyAoaW1vKSAoKD8hdGFiKVtcXHcgXSs/KSg/OiBidWl8XFwpKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSU1PXG4gICAgICAgICAgICAvKGhwKSAoW1xcdyBdK1xcdykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSFAgaVBBUVxuICAgICAgICAgICAgLyhhc3VzKS0/KFxcdyspL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXN1c1xuICAgICAgICAgICAgLyhtaWNyb3NvZnQpOyAobHVtaWFbXFx3IF0rKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWljcm9zb2Z0IEx1bWlhXG4gICAgICAgICAgICAvKGxlbm92bylbLV8gXT8oWy1cXHddKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZW5vdm9cbiAgICAgICAgICAgIC8oam9sbGEpL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSm9sbGFcbiAgICAgICAgICAgIC8ob3BwbykgPyhbXFx3IF0rKSBidWkvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QUE9cbiAgICAgICAgICAgIF0sIFtWRU5ET1IsIE1PREVMLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLyhpbW8pICh0YWIgXFx3KykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSU1PXG4gICAgICAgICAgICAvKGtvYm8pXFxzKGVyZWFkZXJ8dG91Y2gpL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLb2JvXG4gICAgICAgICAgICAvKGFyY2hvcykgKGdhbWVwYWQyPykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFyY2hvc1xuICAgICAgICAgICAgLyhocCkuKyh0b3VjaHBhZCg/IS4rdGFibGV0KXx0YWJsZXQpL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIUCBUb3VjaFBhZFxuICAgICAgICAgICAgLyhraW5kbGUpXFwvKFtcXHdcXC5dKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLaW5kbGVcbiAgICAgICAgICAgIC8obm9vaylbXFx3IF0rYnVpbGRcXC8oXFx3KykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9va1xuICAgICAgICAgICAgLyhkZWxsKSAoc3RyZWFba3ByXFxkIF0qW1xcZGtvXSkvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGwgU3RyZWFrXG4gICAgICAgICAgICAvKGxlWy0gXStwYW4pWy0gXSsoXFx3ezEsOX0pIGJ1aS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZSBQYW4gVGFibGV0c1xuICAgICAgICAgICAgLyh0cmluaXR5KVstIF0qKHRcXGR7M30pIGJ1aS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJpbml0eSBUYWJsZXRzXG4gICAgICAgICAgICAvKGdpZ2FzZXQpWy0gXSsocVxcd3sxLDl9KSBidWkvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHaWdhc2V0IFRhYmxldHNcbiAgICAgICAgICAgIC8odm9kYWZvbmUpIChbXFx3IF0rKSg/OlxcKXwgYnVpKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWb2RhZm9uZVxuICAgICAgICAgICAgXSwgW1ZFTkRPUiwgTU9ERUwsIFtUWVBFLCBUQUJMRVRdXSwgW1xuXG4gICAgICAgICAgICAvKHN1cmZhY2UgZHVvKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1cmZhY2UgRHVvXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIE1JQ1JPU09GVF0sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgL2Ryb2lkIFtcXGRcXC5dKzsgKGZwXFxkdT8pKD86IGJ8XFwpKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpcnBob25lXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdGYWlycGhvbmUnXSwgW1RZUEUsIE1PQklMRV1dLCBbXG4gICAgICAgICAgICAvKHUzMDRhYSkvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFUJlRcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ0FUJlQnXSwgW1RZUEUsIE1PQklMRV1dLCBbXG4gICAgICAgICAgICAvXFxic2llLShcXHcqKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2llbWVuc1xuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnU2llbWVucyddLCBbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC9cXGIocmN0XFx3KykgYi9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSQ0EgVGFibGV0c1xuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnUkNBJ10sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgL1xcYih2ZW51ZVtcXGQgXXsyLDd9KSBiL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGwgVmVudWUgVGFibGV0c1xuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnRGVsbCddLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC9cXGIocSg/Om12fHRhKVxcdyspIGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWZXJpem9uIFRhYmxldFxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnVmVyaXpvbiddLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC9cXGIoPzpiYXJuZXNbJiBdK25vYmxlIHxibltydF0pKFtcXHdcXCsgXSopIGIvaSAgICAgICAgICAgICAgICAgICAgICAgLy8gQmFybmVzICYgTm9ibGUgVGFibGV0XG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdCYXJuZXMgJiBOb2JsZSddLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC9cXGIodG1cXGR7M31cXHcrKSBiL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ051VmlzaW9uJ10sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgL1xcYihrODgpIGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWlRFIEsgU2VyaWVzIFRhYmxldFxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnWlRFJ10sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgL1xcYihueFxcZHszfWopIGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFpURSBOdWJpYVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnWlRFJ10sIFtUWVBFLCBNT0JJTEVdXSwgW1xuICAgICAgICAgICAgL1xcYihnZW5cXGR7M30pIGIuKzQ5aC9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN3aXNzIEdFTiBNb2JpbGVcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ1N3aXNzJ10sIFtUWVBFLCBNT0JJTEVdXSwgW1xuICAgICAgICAgICAgL1xcYih6dXJcXGR7M30pIGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN3aXNzIFpVUiBUYWJsZXRcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ1N3aXNzJ10sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgL1xcYigoemVraSk/dGIuKlxcYikgYi9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFpla2kgVGFibGV0c1xuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnWmVraSddLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC9cXGIoW3lyXVxcZHsyfSkgYi9pLFxuICAgICAgICAgICAgL1xcYihkcmFnb25bLSBdK3RvdWNoIHxkdCkoXFx3ezV9KSBiL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERyYWdvbiBUb3VjaCBUYWJsZXRcbiAgICAgICAgICAgIF0sIFtbVkVORE9SLCAnRHJhZ29uIFRvdWNoJ10sIE1PREVMLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC9cXGIobnMtP1xcd3swLDl9KSBiL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNpZ25pYSBUYWJsZXRzXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdJbnNpZ25pYSddLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC9cXGIoKG54YXxuZXh0KS0/XFx3ezAsOX0pIGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXh0Qm9vayBUYWJsZXRzXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdOZXh0Qm9vayddLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC9cXGIoeHRyZW1lXFxfKT8odigxWzA0NV18MlswMTVdfFszNDY5XTB8N1swNV0pKSBiL2kgICAgICAgICAgICAgICAgICAvLyBWb2ljZSBYdHJlbWUgUGhvbmVzXG4gICAgICAgICAgICBdLCBbW1ZFTkRPUiwgJ1ZvaWNlJ10sIE1PREVMLCBbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC9cXGIobHZ0ZWxcXC0pPyh2MVsxMl0pIGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMdlRlbCBQaG9uZXNcbiAgICAgICAgICAgIF0sIFtbVkVORE9SLCAnTHZUZWwnXSwgTU9ERUwsIFtUWVBFLCBNT0JJTEVdXSwgW1xuICAgICAgICAgICAgL1xcYihwaC0xKSAvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXNzZW50aWFsIFBILTFcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ0Vzc2VudGlhbCddLCBbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC9cXGIodigxMDBtZHw3MDBuYXw3MDExfDkxN2cpLipcXGIpIGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnZpemVuIFRhYmxldHNcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ0Vudml6ZW4nXSwgW1RZUEUsIFRBQkxFVF1dLCBbXG4gICAgICAgICAgICAvXFxiKHRyaW9bLVxcd1xcLiBdKykgYi9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hY2hTcGVlZCBUYWJsZXRzXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdNYWNoU3BlZWQnXSwgW1RZUEUsIFRBQkxFVF1dLCBbXG4gICAgICAgICAgICAvXFxidHVfKDE0OTEpIGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSb3RvciBUYWJsZXRzXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdSb3RvciddLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC8oc2hpZWxkW1xcdyBdKykgYi9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE52aWRpYSBTaGllbGQgVGFibGV0c1xuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnTnZpZGlhJ10sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgLyhzcHJpbnQpIChcXHcrKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3ByaW50IFBob25lc1xuICAgICAgICAgICAgXSwgW1ZFTkRPUiwgTU9ERUwsIFtUWVBFLCBNT0JJTEVdXSwgW1xuICAgICAgICAgICAgLyhraW5cXC5bb25ldHddezN9KS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWljcm9zb2Z0IEtpblxuICAgICAgICAgICAgXSwgW1tNT0RFTCwgL1xcLi9nLCAnICddLCBbVkVORE9SLCBNSUNST1NPRlRdLCBbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC9kcm9pZC4rOyAoY2M2NjY2P3xldDVbMTZdfG1jWzIzOV1bMjNdeD98dmM4WzAzXXg/KVxcKS9pICAgICAgICAgICAgIC8vIFplYnJhXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIFpFQlJBXSwgW1RZUEUsIFRBQkxFVF1dLCBbXG4gICAgICAgICAgICAvZHJvaWQuKzsgKGVjMzB8cHMyMHx0Y1syLThdXFxkW2t4XSlcXCkvaVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBaRUJSQV0sIFtUWVBFLCBNT0JJTEVdXSwgW1xuXG4gICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgICAgICAvLyBTTUFSVFRWU1xuICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgICAgICAvc21hcnQtdHYuKyhzYW1zdW5nKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbXN1bmdcbiAgICAgICAgICAgIF0sIFtWRU5ET1IsIFtUWVBFLCBTTUFSVFRWXV0sIFtcbiAgICAgICAgICAgIC9oYmJ0di4rbWFwbGU7KFxcZCspL2lcbiAgICAgICAgICAgIF0sIFtbTU9ERUwsIC9eLywgJ1NtYXJ0VFYnXSwgW1ZFTkRPUiwgU0FNU1VOR10sIFtUWVBFLCBTTUFSVFRWXV0sIFtcbiAgICAgICAgICAgIC8obnV4OyBuZXRjYXN0LitzbWFydHR2fGxnIChuZXRjYXN0XFwudHYtMjAxXFxkfGFuZHJvaWQgdHYpKS9pICAgICAgICAvLyBMRyBTbWFydFRWXG4gICAgICAgICAgICBdLCBbW1ZFTkRPUiwgTEddLCBbVFlQRSwgU01BUlRUVl1dLCBbXG4gICAgICAgICAgICAvKGFwcGxlKSA/dHYvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGxlIFRWXG4gICAgICAgICAgICBdLCBbVkVORE9SLCBbTU9ERUwsIEFQUExFKycgVFYnXSwgW1RZUEUsIFNNQVJUVFZdXSwgW1xuICAgICAgICAgICAgL2Nya2V5L2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHb29nbGUgQ2hyb21lY2FzdFxuICAgICAgICAgICAgXSwgW1tNT0RFTCwgQ0hST01FKydjYXN0J10sIFtWRU5ET1IsIEdPT0dMRV0sIFtUWVBFLCBTTUFSVFRWXV0sIFtcbiAgICAgICAgICAgIC9kcm9pZC4rYWZ0KFxcdyspKCBidWl8XFwpKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJlIFRWXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIEFNQVpPTl0sIFtUWVBFLCBTTUFSVFRWXV0sIFtcbiAgICAgICAgICAgIC9cXChkdHZbXFwpO10uKyhhcXVvcykvaSxcbiAgICAgICAgICAgIC8oYXF1b3MtdHZbXFx3IF0rKVxcKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaGFycFxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBTSEFSUF0sIFtUWVBFLCBTTUFSVFRWXV0sW1xuICAgICAgICAgICAgLyhicmF2aWFbXFx3IF0rKSggYnVpfFxcKSkvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTb255XG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIFNPTlldLCBbVFlQRSwgU01BUlRUVl1dLCBbXG4gICAgICAgICAgICAvKG1pdHYtXFx3ezV9KSBidWkvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYaWFvbWlcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgWElBT01JXSwgW1RZUEUsIFNNQVJUVFZdXSwgW1xuICAgICAgICAgICAgL0hiYnR2LioodGVjaG5pc2F0KSAoLiopOy9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUZWNobmlTQVRcbiAgICAgICAgICAgIF0sIFtWRU5ET1IsIE1PREVMLCBbVFlQRSwgU01BUlRUVl1dLCBbXG4gICAgICAgICAgICAvXFxiKHJva3UpW1xcZHhdKltcXClcXC9dKCg/OmR2cC0pP1tcXGRcXC5dKikvaSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJva3VcbiAgICAgICAgICAgIC9oYmJ0dlxcL1xcZCtcXC5cXGQrXFwuXFxkKyArXFwoW1xcd1xcKyBdKjsgKihbXFx3XFxkXVteO10qKTsoW147XSopL2kgICAgICAgICAvLyBIYmJUViBkZXZpY2VzXG4gICAgICAgICAgICBdLCBbW1ZFTkRPUiwgdHJpbV0sIFtNT0RFTCwgdHJpbV0sIFtUWVBFLCBTTUFSVFRWXV0sIFtcbiAgICAgICAgICAgIC9cXGIoYW5kcm9pZCB0dnxzbWFydFstIF0/dHZ8b3BlcmEgdHZ8dHY7IHJ2OilcXGIvaSAgICAgICAgICAgICAgICAgICAvLyBTbWFydFRWIGZyb20gVW5pZGVudGlmaWVkIFZlbmRvcnNcbiAgICAgICAgICAgIF0sIFtbVFlQRSwgU01BUlRUVl1dLCBbXG5cbiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgICAgIC8vIENPTlNPTEVTXG4gICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgICAgIC8ob3V5YSkvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3V5YVxuICAgICAgICAgICAgLyhuaW50ZW5kbykgKFt3aWRzM3V0Y2hdKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOaW50ZW5kb1xuICAgICAgICAgICAgXSwgW1ZFTkRPUiwgTU9ERUwsIFtUWVBFLCBDT05TT0xFXV0sIFtcbiAgICAgICAgICAgIC9kcm9pZC4rOyAoc2hpZWxkKSBidWkvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnZpZGlhXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdOdmlkaWEnXSwgW1RZUEUsIENPTlNPTEVdXSwgW1xuICAgICAgICAgICAgLyhwbGF5c3RhdGlvbiBbMzQ1cG9ydGFibGV2aV0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQbGF5c3RhdGlvblxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBTT05ZXSwgW1RZUEUsIENPTlNPTEVdXSwgW1xuICAgICAgICAgICAgL1xcYih4Ym94KD86IG9uZSk/KD8hOyB4Ym94KSlbXFwpOyBdL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pY3Jvc29mdCBYYm94XG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIE1JQ1JPU09GVF0sIFtUWVBFLCBDT05TT0xFXV0sIFtcblxuICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgICAgICAgICAgLy8gV0VBUkFCTEVTXG4gICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgICAgIC9cXGIoc20tW2xyXVxcZFxcZFswNV1bZm51d10/cz8pXFxiL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbXN1bmcgR2FsYXh5IFdhdGNoXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIFNBTVNVTkddLCBbVFlQRSwgV0VBUkFCTEVdXSwgW1xuICAgICAgICAgICAgLygocGViYmxlKSlhcHAvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZWJibGVcbiAgICAgICAgICAgIF0sIFtWRU5ET1IsIE1PREVMLCBbVFlQRSwgV0VBUkFCTEVdXSwgW1xuICAgICAgICAgICAgLyh3YXRjaCkoPzogP29zWyxcXC9dfFxcZCxcXGRcXC8pW1xcZFxcLl0rL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBsZSBXYXRjaFxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBBUFBMRV0sIFtUWVBFLCBXRUFSQUJMRV1dLCBbXG4gICAgICAgICAgICAvZHJvaWQuKzsgKGdsYXNzKSBcXGQvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHb29nbGUgR2xhc3NcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgR09PR0xFXSwgW1RZUEUsIFdFQVJBQkxFXV0sIFtcbiAgICAgICAgICAgIC9kcm9pZC4rOyAod3Q2Mz8wezIsM30pXFwpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgWkVCUkFdLCBbVFlQRSwgV0VBUkFCTEVdXSwgW1xuXG4gICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgICAgICAvLyBYUlxuICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgICAgICAvZHJvaWQuKzsgKGdsYXNzKSBcXGQvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHb29nbGUgR2xhc3NcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgR09PR0xFXSwgW1RZUEUsIFdFQVJBQkxFXV0sIFtcbiAgICAgICAgICAgIC8ocGljbykgKDR8bmVvMyg/OiBsaW5rfHBybyk/KS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGljb1xuICAgICAgICAgICAgXSwgW1ZFTkRPUiwgTU9ERUwsIFtUWVBFLCBXRUFSQUJMRV1dLCBbXG4gICAgICAgICAgICAvOyAocXVlc3QoIFxcZHwgcHJvKT8pL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPY3VsdXMgUXVlc3RcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgRkFDRUJPT0tdLCBbVFlQRSwgV0VBUkFCTEVdXSwgW1xuXG4gICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgICAgICAvLyBFTUJFRERFRFxuICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgICAgICAvKHRlc2xhKSg/OiBxdGNhcmJyb3dzZXJ8XFwvWy1cXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlc2xhXG4gICAgICAgICAgICBdLCBbVkVORE9SLCBbVFlQRSwgRU1CRURERURdXSwgW1xuICAgICAgICAgICAgLyhhZW9iYylcXGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWNobyBEb3RcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgQU1BWk9OXSwgW1RZUEUsIEVNQkVEREVEXV0sIFtcblxuICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgICAgIC8vIE1JWEVEIChHRU5FUklDKVxuICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgICAgICAvZHJvaWQgLis/OyAoW147XSs/KSg/OiBidWl8OyB3dlxcKXxcXCkgYXBwbGV3KS4rPyBtb2JpbGUgc2FmYXJpL2kgICAgLy8gQW5kcm9pZCBQaG9uZXMgZnJvbSBVbmlkZW50aWZpZWQgVmVuZG9yc1xuICAgICAgICAgICAgXSwgW01PREVMLCBbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC9kcm9pZCAuKz87IChbXjtdKz8pKD86IGJ1aXxcXCkgYXBwbGV3KS4rPyg/ISBtb2JpbGUpIHNhZmFyaS9pICAgICAgIC8vIEFuZHJvaWQgVGFibGV0cyBmcm9tIFVuaWRlbnRpZmllZCBWZW5kb3JzXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgL1xcYigodGFibGV0fHRhYilbO1xcL118Zm9jdXNcXC9cXGQoPyEuK21vYmlsZSkpL2kgICAgICAgICAgICAgICAgICAgICAgLy8gVW5pZGVudGlmaWFibGUgVGFibGV0XG4gICAgICAgICAgICBdLCBbW1RZUEUsIFRBQkxFVF1dLCBbXG4gICAgICAgICAgICAvKHBob25lfG1vYmlsZSg/Ols7XFwvXXwgWyBcXHdcXC9cXC5dKnNhZmFyaSl8cGRhKD89Lit3aW5kb3dzIGNlKSkvaSAgICAvLyBVbmlkZW50aWZpYWJsZSBNb2JpbGVcbiAgICAgICAgICAgIF0sIFtbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC8oYW5kcm9pZFstXFx3XFwuIF17MCw5fSk7LitidWlsL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZW5lcmljIEFuZHJvaWQgRGV2aWNlXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdHZW5lcmljJ11dXG4gICAgICAgIF0sXG5cbiAgICAgICAgZW5naW5lIDogW1tcblxuICAgICAgICAgICAgL3dpbmRvd3MuKyBlZGdlXFwvKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVkZ2VIVE1MXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIEVER0UrJ0hUTUwnXV0sIFtcblxuICAgICAgICAgICAgLyhhcmt3ZWIpXFwvKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcmtXZWJcbiAgICAgICAgICAgIF0sIFtOQU1FLCBWRVJTSU9OXSwgW1xuXG4gICAgICAgICAgICAvd2Via2l0XFwvNTM3XFwuMzYuK2Nocm9tZVxcLyg/ITI3KShbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmxpbmtcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgJ0JsaW5rJ11dLCBbXG5cbiAgICAgICAgICAgIC8ocHJlc3RvKVxcLyhbXFx3XFwuXSspL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlc3RvXG4gICAgICAgICAgICAvKHdlYmtpdHx0cmlkZW50fG5ldGZyb250fG5ldHN1cmZ8YW1heWF8bHlueHx3M218Z29hbm5hfHNlcnZvKVxcLyhbXFx3XFwuXSspL2ksIC8vIFdlYktpdC9UcmlkZW50L05ldEZyb250L05ldFN1cmYvQW1heWEvTHlueC93M20vR29hbm5hL1NlcnZvXG4gICAgICAgICAgICAvZWtpb2goZmxvdylcXC8oW1xcd1xcLl0rKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsb3dcbiAgICAgICAgICAgIC8oa2h0bWx8dGFzbWFufGxpbmtzKVtcXC8gXVxcKD8oW1xcd1xcLl0rKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtIVE1ML1Rhc21hbi9MaW5rc1xuICAgICAgICAgICAgLyhpY2FiKVtcXC8gXShbMjNdXFwuW1xcZFxcLl0rKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaUNhYlxuICAgICAgICAgICAgL1xcYihsaWJ3ZWIpL2lcbiAgICAgICAgICAgIF0sIFtOQU1FLCBWRVJTSU9OXSwgW1xuXG4gICAgICAgICAgICAvcnZcXDooW1xcd1xcLl17MSw5fSlcXGIuKyhnZWNrbykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZWNrb1xuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIE5BTUVdXG4gICAgICAgIF0sXG5cbiAgICAgICAgb3MgOiBbW1xuXG4gICAgICAgICAgICAvLyBXaW5kb3dzXG4gICAgICAgICAgICAvbWljcm9zb2Z0ICh3aW5kb3dzKSAodmlzdGF8eHApL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpbmRvd3MgKGlUdW5lcylcbiAgICAgICAgICAgIF0sIFtOQU1FLCBWRVJTSU9OXSwgW1xuICAgICAgICAgICAgLyh3aW5kb3dzICg/OnBob25lKD86IG9zKT98bW9iaWxlKSlbXFwvIF0/KFtcXGRcXC5cXHcgXSopL2kgICAgICAgICAgICAgLy8gV2luZG93cyBQaG9uZVxuICAgICAgICAgICAgXSwgW05BTUUsIFtWRVJTSU9OLCBzdHJNYXBwZXIsIHdpbmRvd3NWZXJzaW9uTWFwXV0sIFtcbiAgICAgICAgICAgIC93aW5kb3dzIG50IDZcXC4yOyAoYXJtKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaW5kb3dzIFJUXG4gICAgICAgICAgICAvd2luZG93c1tcXC8gXT8oW250Y2VcXGRcXC4gXStcXHcpKD8hLit4Ym94KS9pLFxuICAgICAgICAgICAgLyg/Ondpbig/PTN8OXxuKXx3aW4gOXggKShbbnRcXGRcXC5dKykvaVxuICAgICAgICAgICAgXSwgW1tWRVJTSU9OLCBzdHJNYXBwZXIsIHdpbmRvd3NWZXJzaW9uTWFwXSwgW05BTUUsICdXaW5kb3dzJ11dLCBbXG5cbiAgICAgICAgICAgIC8vIGlPUy9tYWNPU1xuICAgICAgICAgICAgL2lwW2hvbmVhZF17Miw0fVxcYig/Oi4qb3MgKFtcXHddKykgbGlrZSBtYWN8OyBvcGVyYSkvaSwgICAgICAgICAgICAgIC8vIGlPU1xuICAgICAgICAgICAgLyg/OmlvcztmYnN2XFwvfGlwaG9uZS4raW9zW1xcLyBdKShbXFxkXFwuXSspL2ksXG4gICAgICAgICAgICAvY2ZuZXR3b3JrXFwvLitkYXJ3aW4vaVxuICAgICAgICAgICAgXSwgW1tWRVJTSU9OLCAvXy9nLCAnLiddLCBbTkFNRSwgJ2lPUyddXSwgW1xuICAgICAgICAgICAgLyhtYWMgb3MgeCkgPyhbXFx3XFwuIF0qKS9pLFxuICAgICAgICAgICAgLyhtYWNpbnRvc2h8bWFjX3Bvd2VycGNcXGIpKD8hLitoYWlrdSkvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFjIE9TXG4gICAgICAgICAgICBdLCBbW05BTUUsIE1BQ19PU10sIFtWRVJTSU9OLCAvXy9nLCAnLiddXSwgW1xuXG4gICAgICAgICAgICAvLyBNb2JpbGUgT1Nlc1xuICAgICAgICAgICAgL2Ryb2lkIChbXFx3XFwuXSspXFxiLisoYW5kcm9pZFstIF14ODZ8aGFybW9ueW9zKS9pICAgICAgICAgICAgICAgICAgICAvLyBBbmRyb2lkLXg4Ni9IYXJtb255T1NcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBOQU1FXSwgWyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5kcm9pZC9XZWJPUy9RTlgvQmFkYS9SSU0vTWFlbW8vTWVlR28vU2FpbGZpc2ggT1MvT3Blbkhhcm1vbnlcbiAgICAgICAgICAgIC8oYW5kcm9pZHx3ZWJvc3xxbnh8YmFkYXxyaW0gdGFibGV0IG9zfG1hZW1vfG1lZWdvfHNhaWxmaXNofG9wZW5oYXJtb255KVstXFwvIF0/KFtcXHdcXC5dKikvaSxcbiAgICAgICAgICAgIC8oYmxhY2tiZXJyeSlcXHcqXFwvKFtcXHdcXC5dKikvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJsYWNrYmVycnlcbiAgICAgICAgICAgIC8odGl6ZW58a2Fpb3MpW1xcLyBdKFtcXHdcXC5dKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGl6ZW4vS2FpT1NcbiAgICAgICAgICAgIC9cXCgoc2VyaWVzNDApOy9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlcmllcyA0MFxuICAgICAgICAgICAgXSwgW05BTUUsIFZFUlNJT05dLCBbXG4gICAgICAgICAgICAvXFwoYmIoMTApOy9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCbGFja0JlcnJ5IDEwXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIEJMQUNLQkVSUlldXSwgW1xuICAgICAgICAgICAgLyg/OnN5bWJpYW4gP29zfHN5bWJvc3xzNjAoPz07KXxzZXJpZXM2MClbLVxcLyBdPyhbXFx3XFwuXSopL2kgICAgICAgICAvLyBTeW1iaWFuXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICdTeW1iaWFuJ11dLCBbXG4gICAgICAgICAgICAvbW96aWxsYVxcL1tcXGRcXC5dKyBcXCgoPzptb2JpbGV8dGFibGV0fHR2fG1vYmlsZTsgW1xcdyBdKyk7IHJ2Oi4rIGdlY2tvXFwvKFtcXHdcXC5dKykvaSAvLyBGaXJlZm94IE9TXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIEZJUkVGT1grJyBPUyddXSwgW1xuICAgICAgICAgICAgL3dlYjBzOy4rcnQodHYpL2ksXG4gICAgICAgICAgICAvXFxiKD86aHApP3dvcyg/OmJyb3dzZXIpP1xcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZWJPU1xuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCAnd2ViT1MnXV0sIFtcbiAgICAgICAgICAgIC93YXRjaCg/OiA/b3NbLFxcL118XFxkLFxcZFxcLykoW1xcZFxcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2F0Y2hPU1xuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCAnd2F0Y2hPUyddXSwgW1xuXG4gICAgICAgICAgICAvLyBHb29nbGUgQ2hyb21lY2FzdFxuICAgICAgICAgICAgL2Nya2V5XFwvKFtcXGRcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHb29nbGUgQ2hyb21lY2FzdFxuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCBDSFJPTUUrJ2Nhc3QnXV0sIFtcbiAgICAgICAgICAgIC8oY3JvcykgW1xcd10rKD86XFwpfCAoW1xcd1xcLl0rKVxcYikvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaHJvbWl1bSBPU1xuICAgICAgICAgICAgXSwgW1tOQU1FLCBDSFJPTUlVTV9PU10sIFZFUlNJT05dLFtcblxuICAgICAgICAgICAgLy8gU21hcnQgVFZzXG4gICAgICAgICAgICAvcGFuYXNvbmljOyh2aWVyYSkvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhbmFzb25pYyBWaWVyYVxuICAgICAgICAgICAgLyhuZXRyYW5nZSltbWgvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXRyYW5nZVxuICAgICAgICAgICAgLyhuZXR0dilcXC8oXFxkK1xcLltcXHdcXC5dKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldFRWXG5cbiAgICAgICAgICAgIC8vIENvbnNvbGVcbiAgICAgICAgICAgIC8obmludGVuZG98cGxheXN0YXRpb24pIChbd2lkczM0NXBvcnRhYmxldnVjaF0rKS9pLCAgICAgICAgICAgICAgICAgLy8gTmludGVuZG8vUGxheXN0YXRpb25cbiAgICAgICAgICAgIC8oeGJveCk7ICt4Ym94IChbXlxcKTtdKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pY3Jvc29mdCBYYm94ICgzNjAsIE9uZSwgWCwgUywgU2VyaWVzIFgsIFNlcmllcyBTKVxuXG4gICAgICAgICAgICAvLyBPdGhlclxuICAgICAgICAgICAgL1xcYihqb2xpfHBhbG0pXFxiID8oPzpvcyk/XFwvPyhbXFx3XFwuXSopL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpvbGkvUGFsbVxuICAgICAgICAgICAgLyhtaW50KVtcXC9cXChcXCkgXT8oXFx3KikvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWludFxuICAgICAgICAgICAgLyhtYWdlaWF8dmVjdG9ybGludXgpWzsgXS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWdlaWEvVmVjdG9yTGludXhcbiAgICAgICAgICAgIC8oW2t4bG5dP3VidW50dXxkZWJpYW58c3VzZXxvcGVuc3VzZXxnZW50b298YXJjaCg/PSBsaW51eCl8c2xhY2t3YXJlfGZlZG9yYXxtYW5kcml2YXxjZW50b3N8cGNsaW51eG9zfHJlZCA/aGF0fHplbndhbGt8bGlucHVzfHJhc3BiaWFufHBsYW4gOXxtaW5peHxyaXNjIG9zfGNvbnRpa2l8ZGVlcGlufG1hbmphcm98ZWxlbWVudGFyeSBvc3xzYWJheW9ufGxpbnNwaXJlKSg/OiBnbnVcXC9saW51eCk/KD86IGVudGVycHJpc2UpPyg/OlstIF1saW51eCk/KD86LWdudSk/Wy1cXC8gXT8oPyFjaHJvbXxwYWNrYWdlKShbLVxcd1xcLl0qKS9pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVYnVudHUvRGViaWFuL1NVU0UvR2VudG9vL0FyY2gvU2xhY2t3YXJlL0ZlZG9yYS9NYW5kcml2YS9DZW50T1MvUENMaW51eE9TL1JlZEhhdC9aZW53YWxrL0xpbnB1cy9SYXNwYmlhbi9QbGFuOS9NaW5peC9SSVNDT1MvQ29udGlraS9EZWVwaW4vTWFuamFyby9lbGVtZW50YXJ5L1NhYmF5b24vTGluc3BpcmVcbiAgICAgICAgICAgIC8oaHVyZHxsaW51eCkgPyhbXFx3XFwuXSopL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIdXJkL0xpbnV4XG4gICAgICAgICAgICAvKGdudSkgPyhbXFx3XFwuXSopL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR05VXG4gICAgICAgICAgICAvXFxiKFstZnJlbnRvcGNnaHNdezAsNX1ic2R8ZHJhZ29uZmx5KVtcXC8gXT8oPyFhbWR8W2l4MzQ2XXsxLDJ9ODYpKFtcXHdcXC5dKikvaSwgLy8gRnJlZUJTRC9OZXRCU0QvT3BlbkJTRC9QQy1CU0QvR2hvc3RCU0QvRHJhZ29uRmx5XG4gICAgICAgICAgICAvKGhhaWt1KSAoXFx3KykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYWlrdVxuICAgICAgICAgICAgXSwgW05BTUUsIFZFUlNJT05dLCBbXG4gICAgICAgICAgICAvKHN1bm9zKSA/KFtcXHdcXC5cXGRdKikvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvbGFyaXNcbiAgICAgICAgICAgIF0sIFtbTkFNRSwgJ1NvbGFyaXMnXSwgVkVSU0lPTl0sIFtcbiAgICAgICAgICAgIC8oKD86b3Blbik/c29sYXJpcylbLVxcLyBdPyhbXFx3XFwuXSopL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29sYXJpc1xuICAgICAgICAgICAgLyhhaXgpICgoXFxkKSg/PVxcLnxcXCl8IClbXFx3XFwuXSkqL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFJWFxuICAgICAgICAgICAgL1xcYihiZW9zfG9zXFwvMnxhbWlnYW9zfG1vcnBob3N8b3BlbnZtc3xmdWNoc2lhfGhwLXV4fHNlcmVuaXR5b3MpL2ksIC8vIEJlT1MvT1MyL0FtaWdhT1MvTW9ycGhPUy9PcGVuVk1TL0Z1Y2hzaWEvSFAtVVgvU2VyZW5pdHlPU1xuICAgICAgICAgICAgLyh1bml4KSA/KFtcXHdcXC5dKikvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVOSVhcbiAgICAgICAgICAgIF0sIFtOQU1FLCBWRVJTSU9OXVxuICAgICAgICBdXG4gICAgfTtcblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLy8vLy8vLy8vLy8vLy8vXG5cbiAgICB2YXIgVUFQYXJzZXIgPSBmdW5jdGlvbiAodWEsIGV4dGVuc2lvbnMpIHtcblxuICAgICAgICBpZiAodHlwZW9mIHVhID09PSBPQkpfVFlQRSkge1xuICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IHVhO1xuICAgICAgICAgICAgdWEgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVUFQYXJzZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVBUGFyc2VyKHVhLCBleHRlbnNpb25zKS5nZXRSZXN1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfbmF2aWdhdG9yID0gKHR5cGVvZiB3aW5kb3cgIT09IFVOREVGX1RZUEUgJiYgd2luZG93Lm5hdmlnYXRvcikgPyB3aW5kb3cubmF2aWdhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgX3VhID0gdWEgfHwgKChfbmF2aWdhdG9yICYmIF9uYXZpZ2F0b3IudXNlckFnZW50KSA/IF9uYXZpZ2F0b3IudXNlckFnZW50IDogRU1QVFkpO1xuICAgICAgICB2YXIgX3VhY2ggPSAoX25hdmlnYXRvciAmJiBfbmF2aWdhdG9yLnVzZXJBZ2VudERhdGEpID8gX25hdmlnYXRvci51c2VyQWdlbnREYXRhIDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgX3JneG1hcCA9IGV4dGVuc2lvbnMgPyBleHRlbmQocmVnZXhlcywgZXh0ZW5zaW9ucykgOiByZWdleGVzO1xuICAgICAgICB2YXIgX2lzU2VsZk5hdiA9IF9uYXZpZ2F0b3IgJiYgX25hdmlnYXRvci51c2VyQWdlbnQgPT0gX3VhO1xuXG4gICAgICAgIHRoaXMuZ2V0QnJvd3NlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYnJvd3NlciA9IHt9O1xuICAgICAgICAgICAgX2Jyb3dzZXJbTkFNRV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBfYnJvd3NlcltWRVJTSU9OXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJneE1hcHBlci5jYWxsKF9icm93c2VyLCBfdWEsIF9yZ3htYXAuYnJvd3Nlcik7XG4gICAgICAgICAgICBfYnJvd3NlcltNQUpPUl0gPSBtYWpvcml6ZShfYnJvd3NlcltWRVJTSU9OXSk7XG4gICAgICAgICAgICAvLyBCcmF2ZS1zcGVjaWZpYyBkZXRlY3Rpb25cbiAgICAgICAgICAgIGlmIChfaXNTZWxmTmF2ICYmIF9uYXZpZ2F0b3IgJiYgX25hdmlnYXRvci5icmF2ZSAmJiB0eXBlb2YgX25hdmlnYXRvci5icmF2ZS5pc0JyYXZlID09IEZVTkNfVFlQRSkge1xuICAgICAgICAgICAgICAgIF9icm93c2VyW05BTUVdID0gJ0JyYXZlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfYnJvd3NlcjtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXRDUFUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2NwdSA9IHt9O1xuICAgICAgICAgICAgX2NwdVtBUkNISVRFQ1RVUkVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmd4TWFwcGVyLmNhbGwoX2NwdSwgX3VhLCBfcmd4bWFwLmNwdSk7XG4gICAgICAgICAgICByZXR1cm4gX2NwdTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXREZXZpY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2RldmljZSA9IHt9O1xuICAgICAgICAgICAgX2RldmljZVtWRU5ET1JdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgX2RldmljZVtNT0RFTF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBfZGV2aWNlW1RZUEVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmd4TWFwcGVyLmNhbGwoX2RldmljZSwgX3VhLCBfcmd4bWFwLmRldmljZSk7XG4gICAgICAgICAgICBpZiAoX2lzU2VsZk5hdiAmJiAhX2RldmljZVtUWVBFXSAmJiBfdWFjaCAmJiBfdWFjaC5tb2JpbGUpIHtcbiAgICAgICAgICAgICAgICBfZGV2aWNlW1RZUEVdID0gTU9CSUxFO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaVBhZE9TLXNwZWNpZmljIGRldGVjdGlvbjogaWRlbnRpZmllZCBhcyBNYWMsIGJ1dCBoYXMgc29tZSBpT1Mtb25seSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBpZiAoX2lzU2VsZk5hdiAmJiBfZGV2aWNlW01PREVMXSA9PSAnTWFjaW50b3NoJyAmJiBfbmF2aWdhdG9yICYmIHR5cGVvZiBfbmF2aWdhdG9yLnN0YW5kYWxvbmUgIT09IFVOREVGX1RZUEUgJiYgX25hdmlnYXRvci5tYXhUb3VjaFBvaW50cyAmJiBfbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMikge1xuICAgICAgICAgICAgICAgIF9kZXZpY2VbTU9ERUxdID0gJ2lQYWQnO1xuICAgICAgICAgICAgICAgIF9kZXZpY2VbVFlQRV0gPSBUQUJMRVQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX2RldmljZTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXRFbmdpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2VuZ2luZSA9IHt9O1xuICAgICAgICAgICAgX2VuZ2luZVtOQU1FXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIF9lbmdpbmVbVkVSU0lPTl0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZ3hNYXBwZXIuY2FsbChfZW5naW5lLCBfdWEsIF9yZ3htYXAuZW5naW5lKTtcbiAgICAgICAgICAgIHJldHVybiBfZW5naW5lO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdldE9TID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9vcyA9IHt9O1xuICAgICAgICAgICAgX29zW05BTUVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgX29zW1ZFUlNJT05dID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmd4TWFwcGVyLmNhbGwoX29zLCBfdWEsIF9yZ3htYXAub3MpO1xuICAgICAgICAgICAgaWYgKF9pc1NlbGZOYXYgJiYgIV9vc1tOQU1FXSAmJiBfdWFjaCAmJiBfdWFjaC5wbGF0Zm9ybSAmJiBfdWFjaC5wbGF0Zm9ybSAhPSAnVW5rbm93bicpIHtcbiAgICAgICAgICAgICAgICBfb3NbTkFNRV0gPSBfdWFjaC5wbGF0Zm9ybSAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvY2hyb21lIG9zL2ksIENIUk9NSVVNX09TKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL21hY29zL2ksIE1BQ19PUyk7ICAgICAgICAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX29zO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdldFJlc3VsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdWEgICAgICA6IHRoaXMuZ2V0VUEoKSxcbiAgICAgICAgICAgICAgICBicm93c2VyIDogdGhpcy5nZXRCcm93c2VyKCksXG4gICAgICAgICAgICAgICAgZW5naW5lICA6IHRoaXMuZ2V0RW5naW5lKCksXG4gICAgICAgICAgICAgICAgb3MgICAgICA6IHRoaXMuZ2V0T1MoKSxcbiAgICAgICAgICAgICAgICBkZXZpY2UgIDogdGhpcy5nZXREZXZpY2UoKSxcbiAgICAgICAgICAgICAgICBjcHUgICAgIDogdGhpcy5nZXRDUFUoKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXRVQSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdWE7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2V0VUEgPSBmdW5jdGlvbiAodWEpIHtcbiAgICAgICAgICAgIF91YSA9ICh0eXBlb2YgdWEgPT09IFNUUl9UWVBFICYmIHVhLmxlbmd0aCA+IFVBX01BWF9MRU5HVEgpID8gdHJpbSh1YSwgVUFfTUFYX0xFTkdUSCkgOiB1YTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNldFVBKF91YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBVQVBhcnNlci5WRVJTSU9OID0gTElCVkVSU0lPTjtcbiAgICBVQVBhcnNlci5CUk9XU0VSID0gIGVudW1lcml6ZShbTkFNRSwgVkVSU0lPTiwgTUFKT1JdKTtcbiAgICBVQVBhcnNlci5DUFUgPSBlbnVtZXJpemUoW0FSQ0hJVEVDVFVSRV0pO1xuICAgIFVBUGFyc2VyLkRFVklDRSA9IGVudW1lcml6ZShbTU9ERUwsIFZFTkRPUiwgVFlQRSwgQ09OU09MRSwgTU9CSUxFLCBTTUFSVFRWLCBUQUJMRVQsIFdFQVJBQkxFLCBFTUJFRERFRF0pO1xuICAgIFVBUGFyc2VyLkVOR0lORSA9IFVBUGFyc2VyLk9TID0gZW51bWVyaXplKFtOQU1FLCBWRVJTSU9OXSk7XG5cbiAgICAvLy8vLy8vLy8vL1xuICAgIC8vIEV4cG9ydFxuICAgIC8vLy8vLy8vLy9cblxuICAgIC8vIGNoZWNrIGpzIGVudmlyb25tZW50XG4gICAgaWYgKHR5cGVvZihleHBvcnRzKSAhPT0gVU5ERUZfVFlQRSkge1xuICAgICAgICAvLyBub2RlanMgZW52XG4gICAgICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSBVTkRFRl9UWVBFICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgICAgICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBVQVBhcnNlcjtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRzLlVBUGFyc2VyID0gVUFQYXJzZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVxdWlyZWpzIGVudiAob3B0aW9uYWwpXG4gICAgICAgIGlmICh0eXBlb2YoZGVmaW5lKSA9PT0gRlVOQ19UWVBFICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgICAgIGRlZmluZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVBUGFyc2VyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gVU5ERUZfVFlQRSkge1xuICAgICAgICAgICAgLy8gYnJvd3NlciBlbnZcbiAgICAgICAgICAgIHdpbmRvdy5VQVBhcnNlciA9IFVBUGFyc2VyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8galF1ZXJ5L1plcHRvIHNwZWNpZmljIChvcHRpb25hbClcbiAgICAvLyBOb3RlOlxuICAgIC8vICAgSW4gQU1EIGVudiB0aGUgZ2xvYmFsIHNjb3BlIHNob3VsZCBiZSBrZXB0IGNsZWFuLCBidXQgalF1ZXJ5IGlzIGFuIGV4Y2VwdGlvbi5cbiAgICAvLyAgIGpRdWVyeSBhbHdheXMgZXhwb3J0cyB0byBnbG9iYWwgc2NvcGUsIHVubGVzcyBqUXVlcnkubm9Db25mbGljdCh0cnVlKSBpcyB1c2VkLFxuICAgIC8vICAgYW5kIHdlIHNob3VsZCBjYXRjaCB0aGF0LlxuICAgIHZhciAkID0gdHlwZW9mIHdpbmRvdyAhPT0gVU5ERUZfVFlQRSAmJiAod2luZG93LmpRdWVyeSB8fCB3aW5kb3cuWmVwdG8pO1xuICAgIGlmICgkICYmICEkLnVhKSB7XG4gICAgICAgIHZhciBwYXJzZXIgPSBuZXcgVUFQYXJzZXIoKTtcbiAgICAgICAgJC51YSA9IHBhcnNlci5nZXRSZXN1bHQoKTtcbiAgICAgICAgJC51YS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VyLmdldFVBKCk7XG4gICAgICAgIH07XG4gICAgICAgICQudWEuc2V0ID0gZnVuY3Rpb24gKHVhKSB7XG4gICAgICAgICAgICBwYXJzZXIuc2V0VUEodWEpO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHBhcnNlci5nZXRSZXN1bHQoKTtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgJC51YVtwcm9wXSA9IHJlc3VsdFtwcm9wXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbn0pKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnID8gd2luZG93IDogdGhpcyk7XG4iXX0=
|