hart-estate-widget 0.0.66 → 0.0.69

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.
Files changed (45) hide show
  1. package/README.md +3 -0
  2. package/build/assets/css/index.css +2 -0
  3. package/build/assets/img/floor-dark.jpg +0 -0
  4. package/build/assets/img/floor-white.jpg +0 -0
  5. package/build/assets/img/grass.jpg +0 -0
  6. package/build/bundle.js +2 -0
  7. package/build/components/Application.js +2 -135
  8. package/build/components/Buttons/FullScreenButton.js +2 -50
  9. package/build/components/Buttons/TabButton.js +2 -24
  10. package/build/components/Instructions.js +2 -54
  11. package/build/components/Loader.js +2 -22
  12. package/build/components/ModelTab.js +2 -213
  13. package/build/components/PanoramaTab.js +2 -620
  14. package/build/components/RotationTab/DefaultView.js +2 -124
  15. package/build/components/RotationTab/ThreesixtyView.js +2 -45
  16. package/build/components/RotationTab/index.js +2 -194
  17. package/build/components/Widget.js +2 -110
  18. package/build/config/defaultConfig.js +2 -32
  19. package/build/enums/deviceOrientationStatuses.js +2 -11
  20. package/build/enums/deviceWidth.js +2 -21
  21. package/build/enums/imageExtentions.js +2 -16
  22. package/build/enums/rotationModes.js +2 -11
  23. package/build/index.css +1 -1
  24. package/build/index.js +2 -75
  25. package/build/locale/index.js +2 -71
  26. package/build/store/apiStore.js +2 -231
  27. package/build/store/deviceStore.js +2 -60
  28. package/build/store/fullScreenStore.js +2 -159
  29. package/build/store/houseStore.js +2 -952
  30. package/build/store/index.js +2 -124
  31. package/build/store/modelStore.js +2 -338
  32. package/build/threesixty/events.js +2 -220
  33. package/build/threesixty/index.js +2 -264
  34. package/build/utils/csg/csg-lib.js +2 -472
  35. package/build/utils/csg/csg-worker.js +2 -84
  36. package/build/utils/csg/three-csg.js +2 -277
  37. package/build/utils/helpers.js +2 -12
  38. package/build/utils/modelHelpers.js +2 -161
  39. package/build/utils/panoramaHelpers.js +2 -117
  40. package/package.json +17 -5
  41. package/build/assets/css/app.css +0 -1
  42. package/build/assets/css/app.css.map +0 -1
  43. package/build/assets/img/floor-dark.png +0 -0
  44. package/build/assets/img/floor-white.png +0 -0
  45. package/build/assets/img/grass.png +0 -0
@@ -1,213 +1,2 @@
1
- "use strict";
2
-
3
- function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.default = void 0;
9
-
10
- var _react = _interopRequireWildcard(require("react"));
11
-
12
- var _mobxReactLite = require("mobx-react-lite");
13
-
14
- var _modelStore = _interopRequireDefault(require("../store/modelStore"));
15
-
16
- var _locale = _interopRequireDefault(require("../locale"));
17
-
18
- var _modelHelpers = require("../utils/modelHelpers");
19
-
20
- var _nipplejs = _interopRequireDefault(require("nipplejs"));
21
-
22
- var _Instructions = _interopRequireDefault(require("./Instructions"));
23
-
24
- var _handMove = _interopRequireDefault(require("../assets/icons/hand-move.svg"));
25
-
26
- var _D = _interopRequireDefault(require("../assets/img/3D.jpg"));
27
-
28
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
-
30
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
31
-
32
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
33
-
34
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
35
-
36
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
37
-
38
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
39
-
40
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
41
-
42
- function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
43
-
44
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
45
-
46
- var ModelTab = (0, _mobxReactLite.observer)(function (_ref) {
47
- var json = _ref.json,
48
- disabled = _ref.disabled;
49
- var instructionSteps = [{
50
- icon: _handMove.default,
51
- text: _locale.default.getLocaleText('rotate-plan')
52
- }];
53
-
54
- var _useState = (0, _react.useState)(true),
55
- _useState2 = _slicedToArray(_useState, 2),
56
- showInstructions = _useState2[0],
57
- setInstructionsState = _useState2[1];
58
-
59
- var _useState3 = (0, _react.useState)(false),
60
- _useState4 = _slicedToArray(_useState3, 2),
61
- menuState = _useState4[0],
62
- setMenuState = _useState4[1];
63
-
64
- var houseStore = _modelStore.default.houseStore;
65
-
66
- var getNextWallsMaterialType = function getNextWallsMaterialType() {
67
- if (houseStore.wallsMaterialType === 'texture') return 'color';
68
- return 'texture';
69
- };
70
-
71
- var onImageUploaded = function onImageUploaded(_ref2) {
72
- var target = _ref2.target;
73
- if (!target.files.length) return;
74
- var reader = new FileReader();
75
-
76
- reader.onload = function (e) {
77
- return houseStore.addWallTexture(e.target.result);
78
- };
79
-
80
- reader.readAsDataURL(target.files[0]);
81
- };
82
-
83
- var initJoystick = function initJoystick() {
84
- var zone = document.querySelector('.widget-tab__model-joystick');
85
-
86
- var joystick = _nipplejs.default.create({
87
- zone: zone,
88
- position: {
89
- left: '50%',
90
- top: '50%'
91
- },
92
- color: '#F4C833',
93
- mode: 'static'
94
- });
95
-
96
- joystick.on('start', function () {
97
- return _modelStore.default.setJoystickState(true);
98
- });
99
- joystick.on('end', function () {
100
- return _modelStore.default.setJoystickState(false);
101
- });
102
- joystick.on('move', function (_, _ref3) {
103
- var angle = _ref3.angle;
104
- var directions = (0, _modelHelpers.getDirectionsFromDegrees)(angle.degree);
105
-
106
- _modelStore.default.setJoystickDirections(directions);
107
- });
108
- };
109
-
110
- var onStart = function onStart() {
111
- setInstructionsState(false);
112
- initJoystick();
113
- var container = document.querySelector('.widget-tab__model-scene');
114
-
115
- _modelStore.default.setContainer(container);
116
-
117
- container.appendChild(_modelStore.default.renderer.domElement);
118
-
119
- _modelStore.default.setCurrentControlsType('orbit');
120
-
121
- if (_modelStore.default.initialized) {
122
- _modelStore.default.houseStore.setDoorsVisibility(true);
123
-
124
- _modelStore.default.houseStore.setFullBuildingVisibility(true);
125
-
126
- _modelStore.default.houseStore.setCurrentWallsMaterialType('texture');
127
-
128
- return;
129
- }
130
-
131
- _modelStore.default.init(json);
132
- };
133
-
134
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
135
- className: "widget-tab__model"
136
- }, /*#__PURE__*/_react.default.createElement("div", {
137
- className: "widget-tab__model-scene"
138
- }), /*#__PURE__*/_react.default.createElement("div", {
139
- className: "widget-tab__model-joystick \n ".concat(_modelStore.default.currentControlsType === 'wasd' ? 'widget-tab__model-joystick--active' : '')
140
- }), /*#__PURE__*/_react.default.createElement("div", {
141
- className: "widget-tab-menu"
142
- }, /*#__PURE__*/_react.default.createElement("ul", null, /*#__PURE__*/_react.default.createElement("li", {
143
- onClick: function onClick() {
144
- return setMenuState(!menuState);
145
- }
146
- }, _locale.default.getLocaleText('menu')), menuState && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("li", {
147
- onClick: function onClick() {
148
- return _modelStore.default.setCurrentControlsType('wasd');
149
- }
150
- }, _locale.default.getLocaleText('wasd')), /*#__PURE__*/_react.default.createElement("li", {
151
- onClick: function onClick() {
152
- return _modelStore.default.setCurrentControlsType('plan');
153
- }
154
- }, _locale.default.getLocaleText('view-from-above')), /*#__PURE__*/_react.default.createElement("li", {
155
- onClick: function onClick() {
156
- return _modelStore.default.setCurrentControlsType('orbit');
157
- }
158
- }, _locale.default.getLocaleText('free-camera')), /*#__PURE__*/_react.default.createElement("li", {
159
- onClick: function onClick() {
160
- return houseStore.setShadowsVisibility(!houseStore.isShadowsVisible);
161
- }
162
- }, _locale.default.getLocaleText('shadows'), ":", houseStore.isShadowsVisible ? _locale.default.getLocaleText('on') : _locale.default.getLocaleText('off')), /*#__PURE__*/_react.default.createElement("li", {
163
- onClick: function onClick() {
164
- return houseStore.setPlanMode();
165
- }
166
- }, _locale.default.getLocaleText('plan')), /*#__PURE__*/_react.default.createElement("li", {
167
- onClick: function onClick() {
168
- return houseStore.setFullBuildingVisibility(!houseStore.isFullBuildingVisible);
169
- }
170
- }, houseStore.isFullBuildingVisible ? _locale.default.getLocaleText('hide-walls') : _locale.default.getLocaleText('show-walls')), /*#__PURE__*/_react.default.createElement("li", {
171
- onClick: function onClick() {
172
- return houseStore.setDoorsVisibility(!houseStore.isDoorsVisible);
173
- }
174
- }, houseStore.isDoorsVisible ? _locale.default.getLocaleText('hide-doors') : _locale.default.getLocaleText('show-doors')), /*#__PURE__*/_react.default.createElement("li", {
175
- onClick: function onClick() {
176
- return houseStore.setCurrentWallsMaterialType(getNextWallsMaterialType());
177
- }
178
- }, _locale.default.getLocaleText('material'), ":", houseStore.wallsMaterialType === 'texture' ? _locale.default.getLocaleText('texture') : _locale.default.getLocaleText('color')), /*#__PURE__*/_react.default.createElement("li", null, /*#__PURE__*/_react.default.createElement("label", null, _locale.default.getLocaleText('wall-color'), ":", /*#__PURE__*/_react.default.createElement("input", {
179
- type: "color",
180
- onChange: function onChange(_ref4) {
181
- var target = _ref4.target;
182
- return houseStore.setCurrentWallColor(target.value);
183
- },
184
- style: {
185
- background: houseStore.wallsColor
186
- },
187
- value: houseStore.wallsColor
188
- }))), /*#__PURE__*/_react.default.createElement("li", null, _locale.default.getLocaleText('wall-texture'), ":", /*#__PURE__*/_react.default.createElement("div", {
189
- className: "widget-tab-menu__wallpapers"
190
- }, houseStore && houseStore.wallsTextures.map(function (_ref5, index) {
191
- var image = _ref5.image,
192
- texture = _ref5.texture;
193
- return /*#__PURE__*/_react.default.createElement("img", {
194
- key: index,
195
- src: image,
196
- onClick: function onClick() {
197
- return houseStore.setCurrentWallTexture(texture);
198
- },
199
- alt: "texture=".concat(index)
200
- });
201
- }))), /*#__PURE__*/_react.default.createElement("li", null, /*#__PURE__*/_react.default.createElement("label", null, _locale.default.getLocaleText('upload-wall-texture'), /*#__PURE__*/_react.default.createElement("input", {
202
- onChange: onImageUploaded,
203
- type: "file",
204
- accept: ".jpg, .jpeg, .png"
205
- }))))))), showInstructions && /*#__PURE__*/_react.default.createElement(_Instructions.default, {
206
- disabled: disabled,
207
- steps: instructionSteps,
208
- onClick: onStart,
209
- background: _D.default
210
- }));
211
- });
212
- var _default = ModelTab;
213
- exports.default = _default;
1
+ "use strict";function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _react=_interopRequireWildcard(require("react")),_mobxReactLite=require("mobx-react-lite"),_modelStore=_interopRequireDefault(require("../store/modelStore")),_locale=_interopRequireDefault(require("../locale")),_modelHelpers=require("../utils/modelHelpers"),_nipplejs=_interopRequireDefault(require("nipplejs")),_Instructions=_interopRequireDefault(require("./Instructions")),_handMove=_interopRequireDefault(require("../assets/icons/hand-move.svg")),_D=_interopRequireDefault(require("../assets/img/3D.jpg"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,l=new WeakMap;return(_getRequireWildcardCache=function(e){return e?l:t})(e)}function _interopRequireWildcard(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!==_typeof(e)&&"function"!=typeof e)return{default:e};t=_getRequireWildcardCache(t);if(t&&t.has(e))return t.get(e);var l,r,a={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(l in e)"default"!==l&&Object.prototype.hasOwnProperty.call(e,l)&&((r=o?Object.getOwnPropertyDescriptor(e,l):null)&&(r.get||r.set)?Object.defineProperty(a,l,r):a[l]=e[l]);return a.default=e,t&&t.set(e,a),a}function _slicedToArray(e,t){return _arrayWithHoles(e)||_iterableToArrayLimit(e,t)||_unsupportedIterableToArray(e,t)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var l=Object.prototype.toString.call(e).slice(8,-1);return"Map"===(l="Object"===l&&e.constructor?e.constructor.name:l)||"Set"===l?Array.from(e):"Arguments"===l||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(l)?_arrayLikeToArray(e,t):void 0}}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var l=0,r=new Array(t);l<t;l++)r[l]=e[l];return r}function _iterableToArrayLimit(e,t){var l=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=l){var r,a,o=[],n=!0,u=!1;try{for(l=l.call(e);!(n=(r=l.next()).done)&&(o.push(r.value),!t||o.length!==t);n=!0);}catch(e){u=!0,a=e}finally{try{n||null==l.return||l.return()}finally{if(u)throw a}}return o}}function _arrayWithHoles(e){if(Array.isArray(e))return e}var ModelTab=(0,_mobxReactLite.observer)(function(e){var t=e.json,e=e.disabled,l=[{icon:_handMove.default,text:_locale.default.getLocaleText("rotate-plan")}],r=_slicedToArray((0,_react.useState)(!0),2),a=r[0],o=r[1],r=_slicedToArray((0,_react.useState)(!1),2),n=r[0],u=r[1],i=_modelStore.default.houseStore;return _react.default.createElement(_react.default.Fragment,null,_react.default.createElement("div",{className:"widget-tab__model"},_react.default.createElement("div",{className:"widget-tab__model-scene"}),_react.default.createElement("div",{className:"widget-tab__model-joystick \n ".concat("wasd"===_modelStore.default.currentControlsType?"widget-tab__model-joystick--active":"")}),_react.default.createElement("div",{className:"widget-tab-menu"},_react.default.createElement("ul",null,_react.default.createElement("li",{onClick:function(){return u(!n)}},_locale.default.getLocaleText("menu")),n&&_react.default.createElement(_react.default.Fragment,null,_react.default.createElement("li",{onClick:function(){return _modelStore.default.setCurrentControlsType("wasd")}},_locale.default.getLocaleText("wasd")),_react.default.createElement("li",{onClick:function(){return _modelStore.default.setCurrentControlsType("plan")}},_locale.default.getLocaleText("view-from-above")),_react.default.createElement("li",{onClick:function(){return _modelStore.default.setCurrentControlsType("orbit")}},_locale.default.getLocaleText("free-camera")),_react.default.createElement("li",{onClick:function(){return i.setShadowsVisibility(!i.isShadowsVisible)}},_locale.default.getLocaleText("shadows"),":",i.isShadowsVisible?_locale.default.getLocaleText("on"):_locale.default.getLocaleText("off")),_react.default.createElement("li",{onClick:function(){return i.setPlanMode()}},_locale.default.getLocaleText("plan")),_react.default.createElement("li",{onClick:function(){return i.setFullBuildingVisibility(!i.isFullBuildingVisible)}},i.isFullBuildingVisible?_locale.default.getLocaleText("hide-walls"):_locale.default.getLocaleText("show-walls")),_react.default.createElement("li",{onClick:function(){return i.setDoorsVisibility(!i.isDoorsVisible)}},i.isDoorsVisible?_locale.default.getLocaleText("hide-doors"):_locale.default.getLocaleText("show-doors")),_react.default.createElement("li",{onClick:function(){return i.setCurrentWallsMaterialType("texture"===i.wallsMaterialType?"color":"texture")}},_locale.default.getLocaleText("material"),":","texture"===i.wallsMaterialType?_locale.default.getLocaleText("texture"):_locale.default.getLocaleText("color")),_react.default.createElement("li",null,_react.default.createElement("label",null,_locale.default.getLocaleText("wall-color"),":",_react.default.createElement("input",{type:"color",onChange:function(e){e=e.target;return i.setCurrentWallColor(e.value)},style:{background:i.wallsColor},value:i.wallsColor}))),_react.default.createElement("li",null,_locale.default.getLocaleText("wall-texture"),":",_react.default.createElement("div",{className:"widget-tab-menu__wallpapers"},i&&i.wallsTextures.map(function(e,t){var l=e.image,r=e.texture;return _react.default.createElement("img",{key:t,src:l,onClick:function(){return i.setCurrentWallTexture(r)},alt:"texture=".concat(t)})}))),_react.default.createElement("li",null,_react.default.createElement("label",null,_locale.default.getLocaleText("upload-wall-texture"),_react.default.createElement("input",{onChange:function(e){var t,e=e.target;e.files.length&&((t=new FileReader).onload=function(e){return i.addWallTexture(e.target.result)},t.readAsDataURL(e.files[0]))},type:"file",accept:".jpg, .jpeg, .png"}))))))),a&&_react.default.createElement(_Instructions.default,{disabled:e,steps:l,onClick:function(){o(!1),e=document.querySelector(".widget-tab__model-joystick"),(e=_nipplejs.default.create({zone:e,position:{left:"50%",top:"50%"},color:"#F4C833",mode:"static"})).on("start",function(){return _modelStore.default.setJoystickState(!0)}),e.on("end",function(){return _modelStore.default.setJoystickState(!1)}),e.on("move",function(e,t){t=t.angle,t=(0,_modelHelpers.getDirectionsFromDegrees)(t.degree);_modelStore.default.setJoystickDirections(t)});var e=document.querySelector(".widget-tab__model-scene");if(_modelStore.default.setContainer(e),e.appendChild(_modelStore.default.renderer.domElement),_modelStore.default.setCurrentControlsType("orbit"),_modelStore.default.initialized)return _modelStore.default.houseStore.setDoorsVisibility(!0),_modelStore.default.houseStore.setFullBuildingVisibility(!0),void _modelStore.default.houseStore.setCurrentWallsMaterialType("texture");_modelStore.default.init(t)},background:_D.default}))}),_default=ModelTab;exports.default=_default;
2
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvTW9kZWxUYWIuanMiXSwibmFtZXMiOlsiX3JlYWN0IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJyZXF1aXJlIiwiX21vYnhSZWFjdExpdGUiLCJfbW9kZWxTdG9yZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbG9jYWxlIiwiX21vZGVsSGVscGVycyIsIl9uaXBwbGVqcyIsIl9JbnN0cnVjdGlvbnMiLCJfaGFuZE1vdmUiLCJfRCIsIk1vZGVsVGFiIiwib2JzZXJ2ZXIiLCJfcmVmIiwianNvbiIsImRpc2FibGVkIiwiaW5zdHJ1Y3Rpb25TdGVwcyIsImljb24iLCJIYW5kTW92ZUljb24iLCJ0ZXh0IiwibG9jYWxlU3RvcmUiLCJnZXRMb2NhbGVUZXh0IiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwidXNlU3RhdGUiLCJzaG93SW5zdHJ1Y3Rpb25zIiwic2V0SW5zdHJ1Y3Rpb25zU3RhdGUiLCJfdXNlU3RhdGU0IiwibWVudVN0YXRlIiwic2V0TWVudVN0YXRlIiwiaG91c2VTdG9yZSIsIm1vZGVsU3RvcmUiLCJkZWZhdWx0IiwiY3JlYXRlRWxlbWVudCIsIkZyYWdtZW50IiwiY2xhc3NOYW1lIiwiZ2V0TmV4dFdhbGxzTWF0ZXJpYWxUeXBlIiwiY29uY2F0Iiwib25JbWFnZVVwbG9hZGVkIiwiY3VycmVudENvbnRyb2xzVHlwZSIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJvbmxvYWQiLCJhZGRXYWxsVGV4dHVyZSIsInRhcmdldCIsInJlYWRBc0RhdGFVUkwiLCJvbkNsaWNrIiwic2V0Q3VycmVudENvbnRyb2xzVHlwZSIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsInNldFNoYWRvd3NWaXNpYmlsaXR5IiwiaXNTaGFkb3dzVmlzaWJsZSIsInNldFBsYW5Nb2RlIiwic2V0Sm95c3RpY2tTdGF0ZSIsImlzRnVsbEJ1aWxkaW5nVmlzaWJsZSIsInNldERvb3JzVmlzaWJpbGl0eSIsImlzRG9vcnNWaXNpYmxlIiwic2V0Q3VycmVudFdhbGxzTWF0ZXJpYWxUeXBlIiwid2FsbHNNYXRlcmlhbFR5cGUiLCJzZXRKb3lzdGlja0RpcmVjdGlvbnMiLCJ0eXBlIiwic2V0Q29udGFpbmVyIiwic2V0Q3VycmVudFdhbGxDb2xvciIsInZhbHVlIiwic3R5bGUiLCJiYWNrZ3JvdW5kIiwid2FsbHNDb2xvciIsImFwcGVuZENoaWxkIiwiaW5pdGlhbGl6ZWQiLCJ3YWxsc1RleHR1cmVzIiwibWFwIiwiX3JlZjUiLCJpbmRleCIsImltYWdlIiwidGV4dHVyZSIsImtleSIsInNldEN1cnJlbnRXYWxsVGV4dHVyZSIsImFsdCIsIm9uQ2hhbmdlIiwiX3JlZjIiLCJmaWxlcyIsImxlbmd0aCIsImUiLCJyZXN1bHQiLCJhY2NlcHQiLCJzdGVwcyIsInpvbmUiLCJqb3lzdGljayIsIm5pcHBsZWpzIiwiY3JlYXRlIiwicG9zaXRpb24iLCJsZWZ0IiwidG9wIiwiY29sb3IiLCJtb2RlIiwib24iLCJfIiwiX3JlZjMiLCJhbmdsZSIsImRpcmVjdGlvbnMiLCJnZXREaXJlY3Rpb25zRnJvbURlZ3JlZXMiLCJkZWdyZWUiLCJjb250YWluZXIiLCJyZW5kZXJlciIsImRvbUVsZW1lbnQiLCJzZXRGdWxsQnVpbGRpbmdWaXNpYmlsaXR5IiwiaW5pdCIsIkJhY2tncm91bmRJbWFnZSJdLCJtYXBwaW5ncyI6IjRVQUFBLElBQUFBLE9BQUFDLHdCQUFBQyxRQUFBLFVBQ0FDLGVBQUFELFFBQUEsbUJBQ0FFLFlBQUFDLHVCQUFBSCxRQUFBLHdCQUNBSSxRQUFBRCx1QkFBQUgsUUFBQSxjQUNBSyxjQUFBTCxRQUFBLHlCQUNBTSxVQUFBSCx1QkFBQUgsUUFBQSxhQUVBTyxjQUFBSix1QkFBQUgsUUFBQSxtQkFQQVEsVUFBQUwsdUJBQUFILFFBQUEsa0NBVUFTLEdBQUFOLHVCQUFBSCxRQUFBLHlCLHMzREFFQSxJQUFNVSxVQUFXLEVBQUFDLGVBQUFBLFVBQVMsU0FBQUMsR0FBd0IsSUFBckJDLEVBQXFCRCxFQUFyQkMsS0FBTUMsRUFBZUYsRUFB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RSxNQUFTckUsRUFBQThCLFFBdENYLFdBQ2RwQixHQUFxQixHQVhmNEQsRUFBT3RDLFNBQVNDLGNBQWMsZ0NBQzlCc0MsRUFBV0MsVUFBQUEsUUFBU0MsT0FBTyxDQUFFSCxLQUFBQSxFQUFNSSxTQUFVLENBQUVDLEtBQU0sTUFBT0MsSUFBSyxPQUFTQyxNQUFPLFVBQVdDLEtBQU0sWUFDL0ZDLEdBQUcsUUFBUyxXQUFBLE9BQU1oRSxZQUFBQSxRQUFXc0Isa0JBQWlCLEtBQ3ZEa0MsRUFBU1EsR0FBRyxNQUFPLFdBQUEsT0FBTWhFLFlBQUFBLFFBQVdzQixrQkFBaUIsS0FDckRrQyxFQUFTUSxHQUFHLE9BQVEsU0FBQ0MsRUFBREMsR0FBTUMsRUFBWUQsRUFBWkMsTUFDbEJDLEdBQWEsRUFBQUMsY0FBQUEsMEJBQXlCRixFQUFNRyxRQUNsRHRFLFlBQUFBLFFBQVc0QixzQkFBc0J3QyxLQVBoQixJQW5CWXBGLEVBQUFBLFNBQWVrQyxjQUFBLDRCQXdDOUMsR0F2Q0ZsQixZQUFBQSxRQUFNZixhQUFvQnNGLEdBQUVyRixFQUFNQyxZQUFBQSxZQUFBQSxRQUFScUYsU0FBQUMsWUFBc0JyRixZQUFBQSxRQUFNQyx1QkFBWUMsU0F1QzVEVSxZQUFBQSxRQUFXcUMsWUFyQ1ExQyxPQUF6QkssWUFBQUEsUUFBQUQsV0FBaUROLG9CQUFqRCxHQUFBTyxZQUFBQSxRQUFBRCxXQUFBMkUsMkJBQUEsUUFBT2hGLFlBQUFBLFFBQUFBLFdBQVBnQyw0QkFBQSxXQUNBMUIsWUFBQUEsUUFBQTJFLEtBQUE1RixJQWdFMkJtRCxXQUFBMEMsR0FBQUEsYSxTQU1BaEciLCJmaWxlIjoiY29tcG9uZW50cy9Nb2RlbFRhYi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IG9ic2VydmVyIH0gZnJvbSAnbW9ieC1yZWFjdC1saXRlJztcbmltcG9ydCBtb2RlbFN0b3JlIGZyb20gJy4uL3N0b3JlL21vZGVsU3RvcmUnO1xuaW1wb3J0IGxvY2FsZVN0b3JlIGZyb20gJy4uL2xvY2FsZSc7XG5pbXBvcnQgeyBnZXREaXJlY3Rpb25zRnJvbURlZ3JlZXMgfSBmcm9tICcuLi91dGlscy9tb2RlbEhlbHBlcnMnO1xuaW1wb3J0IG5pcHBsZWpzIGZyb20gJ25pcHBsZWpzJztcblxuaW1wb3J0IEluc3RydWN0aW9ucyBmcm9tICcuL0luc3RydWN0aW9ucyc7XG5cbmltcG9ydCBIYW5kTW92ZUljb24gZnJvbSAnLi4vYXNzZXRzL2ljb25zL2hhbmQtbW92ZS5zdmcnO1xuaW1wb3J0IEJhY2tncm91bmRJbWFnZSBmcm9tICcuLi9hc3NldHMvaW1nLzNELmpwZyc7XG5cbmNvbnN0IE1vZGVsVGFiID0gb2JzZXJ2ZXIoKHsganNvbiwgZGlzYWJsZWQgfSkgPT4ge1xuICBjb25zdCBpbnN0cnVjdGlvblN0ZXBzID0gW3sgaWNvbjogSGFuZE1vdmVJY29uLCB0ZXh0OiBsb2NhbGVTdG9yZS5nZXRMb2NhbGVUZXh0KCdyb3RhdGUtcGxhbicpIH1dO1xuXG4gIGNvbnN0IFtzaG93SW5zdHJ1Y3Rpb25zLCBzZXRJbnN0cnVjdGlvbnNTdGF0ZV0gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgY29uc3QgW21lbnVTdGF0ZSwgc2V0TWVudVN0YXRlXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgeyBob3VzZVN0b3JlIH0gPSBtb2RlbFN0b3JlO1xuXG4gIGNvbnN0IGdldE5leHRXYWxsc01hdGVyaWFsVHlwZSA9ICgpID0+IHtcbiAgICBpZiAoaG91c2VTdG9yZS53YWxsc01hdGVyaWFsVHlwZSA9PT0gJ3RleHR1cmUnKSByZXR1cm4gJ2NvbG9yJztcbiAgICByZXR1cm4gJ3RleHR1cmUnO1xuICB9O1xuXG4gIGNvbnN0IG9uSW1hZ2VVcGxvYWRlZCA9ICh7IHRhcmdldCB9KSA9PiB7XG4gICAgaWYgKCF0YXJnZXQuZmlsZXMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKGUpID0+IGhvdXNlU3RvcmUuYWRkV2FsbFRleHR1cmUoZS50YXJnZXQucmVzdWx0KTtcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTCh0YXJnZXQuZmlsZXNbMF0pO1xuICB9O1xuXG4gIGNvbnN0IGluaXRKb3lzdGljayA9ICgpID0+IHtcbiAgICBjb25zdCB6b25lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndpZGdldC10YWJfX21vZGVsLWpveXN0aWNrJyk7XG4gICAgY29uc3Qgam95c3RpY2sgPSBuaXBwbGVqcy5jcmVhdGUoeyB6b25lLCBwb3NpdGlvbjogeyBsZWZ0OiAnNTAlJywgdG9wOiAnNTAlJyB9LCBjb2xvcjogJyNGNEM4MzMnLCBtb2RlOiAnc3RhdGljJyB9KTtcbiAgICBqb3lzdGljay5vbignc3RhcnQnLCAoKSA9PiBtb2RlbFN0b3JlLnNldEpveXN0aWNrU3RhdGUodHJ1ZSkpO1xuICAgIGpveXN0aWNrLm9uKCdlbmQnLCAoKSA9PiBtb2RlbFN0b3JlLnNldEpveXN0aWNrU3RhdGUoZmFsc2UpKTtcbiAgICBqb3lzdGljay5vbignbW92ZScsIChfLCB7IGFuZ2xlIH0pID0+IHtcbiAgICAgIGNvbnN0IGRpcmVjdGlvbnMgPSBnZXREaXJlY3Rpb25zRnJvbURlZ3JlZXMoYW5nbGUuZGVncmVlKTtcbiAgICAgIG1vZGVsU3RvcmUuc2V0Sm95c3RpY2tEaXJlY3Rpb25zKGRpcmVjdGlvbnMpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IG9uU3RhcnQgPSAoKSA9PiB7XG4gICAgc2V0SW5zdHJ1Y3Rpb25zU3RhdGUoZmFsc2UpO1xuXG4gICAgaW5pdEpveXN0aWNrKCk7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud2lkZ2V0LXRhYl9fbW9kZWwtc2NlbmUnKTtcbiAgICBtb2RlbFN0b3JlLnNldENvbnRhaW5lcihjb250YWluZXIpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChtb2RlbFN0b3JlLnJlbmRlcmVyLmRvbUVsZW1lbnQpO1xuICAgIG1vZGVsU3RvcmUuc2V0Q3VycmVudENvbnRyb2xzVHlwZSgnb3JiaXQnKTtcblxuICAgIGlmIChtb2RlbFN0b3JlLmluaXRpYWxpemVkKSB7XG4gICAgICBtb2RlbFN0b3JlLmhvdXNlU3RvcmUuc2V0RG9vcnNWaXNpYmlsaXR5KHRydWUpO1xuICAgICAgbW9kZWxTdG9yZS5ob3VzZVN0b3JlLnNldEZ1bGxCdWlsZGluZ1Zpc2liaWxpdHkodHJ1ZSk7XG4gICAgICBtb2RlbFN0b3JlLmhvdXNlU3RvcmUuc2V0Q3VycmVudFdhbGxzTWF0ZXJpYWxUeXBlKCd0ZXh0dXJlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbW9kZWxTdG9yZS5pbml0KGpzb24pO1xuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2lkZ2V0LXRhYl9fbW9kZWxcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3aWRnZXQtdGFiX19tb2RlbC1zY2VuZVwiIC8+XG5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT17XG4gICAgICAgICAgICBgd2lkZ2V0LXRhYl9fbW9kZWwtam95c3RpY2sgXG4gICAgICAgICAgICAke21vZGVsU3RvcmUuY3VycmVudENvbnRyb2xzVHlwZSA9PT0gJ3dhc2QnID8gJ3dpZGdldC10YWJfX21vZGVsLWpveXN0aWNrLS1hY3RpdmUnIDogJyd9YFxuICAgICAgICAgIH0gLz5cblxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndpZGdldC10YWItbWVudVwiPlxuICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgIDxsaSBvbkNsaWNrPXsoKSA9PiBzZXRNZW51U3RhdGUoIW1lbnVTdGF0ZSl9PlxuICAgICAgICAgICAgICB7bG9jYWxlU3RvcmUuZ2V0TG9jYWxlVGV4dCgnbWVudScpfVxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIHttZW51U3RhdGUgJiYgKFxuICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIDxsaSBvbkNsaWNrPXsoKSA9PiBtb2RlbFN0b3JlLnNldEN1cnJlbnRDb250cm9sc1R5cGUoJ3dhc2QnKX0+XG4gICAgICAgICAgICAgICAgICB7bG9jYWxlU3RvcmUuZ2V0TG9jYWxlVGV4dCgnd2FzZCcpfVxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIG9uQ2xpY2s9eygpID0+IG1vZGVsU3RvcmUuc2V0Q3VycmVudENvbnRyb2xzVHlwZSgncGxhbicpfT5cbiAgICAgICAgICAgICAgICAgIHtsb2NhbGVTdG9yZS5nZXRMb2NhbGVUZXh0KCd2aWV3LWZyb20tYWJvdmUnKX1cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBvbkNsaWNrPXsoKSA9PiBtb2RlbFN0b3JlLnNldEN1cnJlbnRDb250cm9sc1R5cGUoJ29yYml0Jyl9PlxuICAgICAgICAgICAgICAgICAge2xvY2FsZVN0b3JlLmdldExvY2FsZVRleHQoJ2ZyZWUtY2FtZXJhJyl9XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgb25DbGljaz17KCkgPT4gaG91c2VTdG9yZS5zZXRTaGFkb3dzVmlzaWJpbGl0eSghaG91c2VTdG9yZS5pc1NoYWRvd3NWaXNpYmxlKX0+XG4gICAgICAgICAgICAgICAgICB7bG9jYWxlU3RvcmUuZ2V0TG9jYWxlVGV4dCgnc2hhZG93cycpfTogXG4gICAgICAgICAgICAgICAgICB7aG91c2VTdG9yZS5pc1NoYWRvd3NWaXNpYmxlID8gbG9jYWxlU3RvcmUuZ2V0TG9jYWxlVGV4dCgnb24nKSA6IGxvY2FsZVN0b3JlLmdldExvY2FsZVRleHQoJ29mZicpfVxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIG9uQ2xpY2s9eygpID0+IGhvdXNlU3RvcmUuc2V0UGxhbk1vZGUoKX0+XG4gICAgICAgICAgICAgICAgICB7bG9jYWxlU3RvcmUuZ2V0TG9jYWxlVGV4dCgncGxhbicpfVxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIG9uQ2xpY2s9eygpID0+IGhvdXNlU3RvcmUuc2V0RnVsbEJ1aWxkaW5nVmlzaWJpbGl0eSghaG91c2VTdG9yZS5pc0Z1bGxCdWlsZGluZ1Zpc2libGUpfT5cbiAgICAgICAgICAgICAgICAgIHtob3VzZVN0b3JlLmlzRnVsbEJ1aWxkaW5nVmlzaWJsZSA/IFxuICAgICAgICAgICAgICAgICAgICBsb2NhbGVTdG9yZS5nZXRMb2NhbGVUZXh0KCdoaWRlLXdhbGxzJykgOiBsb2NhbGVTdG9yZS5nZXRMb2NhbGVUZXh0KCdzaG93LXdhbGxzJyl9XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgb25DbGljaz17KCkgPT4gaG91c2VTdG9yZS5zZXREb29yc1Zpc2liaWxpdHkoIWhvdXNlU3RvcmUuaXNEb29yc1Zpc2libGUpfT5cbiAgICAgICAgICAgICAgICAgIHtob3VzZVN0b3JlLmlzRG9vcnNWaXNpYmxlID8gXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZVN0b3JlLmdldExvY2FsZVRleHQoJ2hpZGUtZG9vcnMnKSA6IGxvY2FsZVN0b3JlLmdldExvY2FsZVRleHQoJ3Nob3ctZG9vcnMnKX1cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBvbkNsaWNrPXsoKSA9PiBob3VzZVN0b3JlLnNldEN1cnJlbnRXYWxsc01hdGVyaWFsVHlwZShnZXROZXh0V2FsbHNNYXRlcmlhbFR5cGUoKSl9PlxuICAgICAgICAgICAgICAgICAge2xvY2FsZVN0b3JlLmdldExvY2FsZVRleHQoJ21hdGVyaWFsJyl9OiBcbiAgICAgICAgICAgICAgICAgIHtob3VzZVN0b3JlLndhbGxzTWF0ZXJpYWxUeXBlID09PSAndGV4dHVyZScgP1xuICAgICAgICAgICAgICAgICAgICBsb2NhbGVTdG9yZS5nZXRMb2NhbGVUZXh0KCd0ZXh0dXJlJykgOiBsb2NhbGVTdG9yZS5nZXRMb2NhbGVUZXh0KCdjb2xvcicpfVxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsPlxuICAgICAgICAgICAgICAgICAgICB7bG9jYWxlU3RvcmUuZ2V0TG9jYWxlVGV4dCgnd2FsbC1jb2xvcicpfTpcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KHsgdGFyZ2V0IH0pID0+IGhvdXNlU3RvcmUuc2V0Q3VycmVudFdhbGxDb2xvcih0YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmQ6IGhvdXNlU3RvcmUud2FsbHNDb2xvciB9fVxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtob3VzZVN0b3JlLndhbGxzQ29sb3J9IC8+XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgICAge2xvY2FsZVN0b3JlLmdldExvY2FsZVRleHQoJ3dhbGwtdGV4dHVyZScpfTpcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2lkZ2V0LXRhYi1tZW51X193YWxscGFwZXJzXCI+XG4gICAgICAgICAgICAgICAgICAgIHtob3VzZVN0b3JlICYmIGhvdXNlU3RvcmUud2FsbHNUZXh0dXJlcy5tYXAoKHsgaW1hZ2UsIHRleHR1cmUgfSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgICAgICAgc3JjPXtpbWFnZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhvdXNlU3RvcmUuc2V0Q3VycmVudFdhbGxUZXh0dXJlKHRleHR1cmUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0PXtgdGV4dHVyZT0ke2luZGV4fWB9IC8+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIHtsb2NhbGVTdG9yZS5nZXRMb2NhbGVUZXh0KCd1cGxvYWQtd2FsbC10ZXh0dXJlJyl9XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBvbkNoYW5nZT17b25JbWFnZVVwbG9hZGVkfSB0eXBlPVwiZmlsZVwiIGFjY2VwdD1cIi5qcGcsIC5qcGVnLCAucG5nXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHtzaG93SW5zdHJ1Y3Rpb25zICYmIChcbiAgICAgICAgPEluc3RydWN0aW9uc1xuICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICBzdGVwcz17aW5zdHJ1Y3Rpb25TdGVwc31cbiAgICAgICAgICBvbkNsaWNrPXtvblN0YXJ0fVxuICAgICAgICAgIGJhY2tncm91bmQ9e0JhY2tncm91bmRJbWFnZX0gLz5cbiAgICAgICl9XG4gICAgPC8+XG4gICk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgTW9kZWxUYWI7XG4iXX0=