PluginProbe
Elementor Website Builder – more than just a page builder / 4.1.0-beta1
Elementor Website Builder – more than just a page builder v4.1.0-beta1
4.3.3 4.3.2 4.3.1 4.3.0 4.3.0-beta3 4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 All 456 releases
← All changes | assets/js/atomic-widgets-editor.js +31 -174 4.2.3 → 4.1.0-beta1 View file →
@@ -373,14 +373,13 @@
373 373 }
374 374 }, {
375 375 key: "dispatchEvent",
376 376 value: function dispatchEvent(eventName, payload) {
377 + if (!this.isEventsManagerAvailable() || !this.canSendEvents()) {
378 + return false;
379 + }
377 380 try {
378 - if (!this.isEventsManagerAvailable() || !this.canSendEvents()) {
379 - return false;
380 - }
381 - this.getEventsManager().dispatchEvent(eventName, payload);
382 - return true;
381 + return this.getEventsManager().dispatchEvent(eventName, payload);
383 382 } catch (error) {
384 383 return false;
385 384 }
386 385 }
@@ -684,107 +683,8 @@
684 683 };
685 684 }
686 685 return this.dispatchEvent(config === null || config === void 0 || (_config$names1 = config.names) === null || _config$names1 === void 0 || (_config$names1 = _config$names1.editorOne) === null || _config$names1 === void 0 ? void 0 : _config$names1.widgetPanelSearch, payload);
687 686 }
688 - }, {
689 - key: "createWpDashPayload",
690 - value: function createWpDashPayload() {
691 - var _config$appTypes$wpDa, _config$appTypes5, _config$locations11;
692 - var overrides = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
693 - var config = this.getConfig();
694 - return this.createBasePayload(_objectSpread({
695 - window_name: (_config$appTypes$wpDa = config === null || config === void 0 || (_config$appTypes5 = config.appTypes) === null || _config$appTypes5 === void 0 ? void 0 : _config$appTypes5.wpDash) !== null && _config$appTypes$wpDa !== void 0 ? _config$appTypes$wpDa : 'wpdash',
696 - target_location: this.toLowerSnake(config === null || config === void 0 || (_config$locations11 = config.locations) === null || _config$locations11 === void 0 ? void 0 : _config$locations11.wpDashAdmin),
697 - location_l2: ''
698 - }, overrides));
699 - }
700 - }, {
701 - key: "sendWpDashElementorMenuClick",
702 - value: function sendWpDashElementorMenuClick() {
703 - var _config$names10, _config$triggers10, _config$targetTypes11, _config$interactionRe13, _config$secondaryLoca11;
704 - var config = this.getConfig();
705 - return this.dispatchEvent(config === null || config === void 0 || (_config$names10 = config.names) === null || _config$names10 === void 0 || (_config$names10 = _config$names10.editorOne) === null || _config$names10 === void 0 ? void 0 : _config$names10.wpDashElementorMenuClick, this.createWpDashPayload({
706 - interaction_type: this.toLowerSnake(config === null || config === void 0 || (_config$triggers10 = config.triggers) === null || _config$triggers10 === void 0 ? void 0 : _config$triggers10.click),
707 - target_type: config === null || config === void 0 || (_config$targetTypes11 = config.targetTypes) === null || _config$targetTypes11 === void 0 ? void 0 : _config$targetTypes11.wpDashAdminMenuItem,
708 - target_name: 'elementor_menu_item',
709 - interaction_result: config === null || config === void 0 || (_config$interactionRe13 = config.interactionResults) === null || _config$interactionRe13 === void 0 ? void 0 : _config$interactionRe13.elementorSideMenuOpened,
710 - location_l1: this.toLowerSnake(config === null || config === void 0 || (_config$secondaryLoca11 = config.secondaryLocations) === null || _config$secondaryLoca11 === void 0 ? void 0 : _config$secondaryLoca11.wpDashElementorCoreMenu),
711 - interaction_description: 'core_user_clicked_elementor_menu_item'
712 - }));
713 - }
714 - }, {
715 - key: "sendWpDashEditorSubMenuHover",
716 - value: function sendWpDashEditorSubMenuHover() {
717 - var _config$names11, _config$triggers11, _config$targetTypes12, _config$interactionRe14, _config$secondaryLoca12;
718 - var config = this.getConfig();
719 - return this.dispatchEvent(config === null || config === void 0 || (_config$names11 = config.names) === null || _config$names11 === void 0 || (_config$names11 = _config$names11.editorOne) === null || _config$names11 === void 0 ? void 0 : _config$names11.wpDashEditorSubMenuHover, this.createWpDashPayload({
720 - interaction_type: this.toLowerSnake(config === null || config === void 0 || (_config$triggers11 = config.triggers) === null || _config$triggers11 === void 0 ? void 0 : _config$triggers11.hover),
721 - target_type: config === null || config === void 0 || (_config$targetTypes12 = config.targetTypes) === null || _config$targetTypes12 === void 0 ? void 0 : _config$targetTypes12.wpDashEditorMenu,
722 - target_name: 'wpdash_editor_sub_menu',
723 - interaction_result: config === null || config === void 0 || (_config$interactionRe14 = config.interactionResults) === null || _config$interactionRe14 === void 0 ? void 0 : _config$interactionRe14.editorSubMenuOpened,
724 - location_l1: this.toLowerSnake(config === null || config === void 0 || (_config$secondaryLoca12 = config.secondaryLocations) === null || _config$secondaryLoca12 === void 0 ? void 0 : _config$secondaryLoca12.wpDashElementorCoreSubMenu),
725 - interaction_description: 'core_user_hovered_sub_menu'
726 - }));
727 - }
728 - }, {
729 - key: "sendWpDashThemeBuilderClick",
730 - value: function sendWpDashThemeBuilderClick() {
731 - var _config$names12, _config$triggers12, _config$targetTypes13, _config$interactionRe15, _config$secondaryLoca13;
732 - var config = this.getConfig();
733 - return this.dispatchEvent(config === null || config === void 0 || (_config$names12 = config.names) === null || _config$names12 === void 0 || (_config$names12 = _config$names12.editorOne) === null || _config$names12 === void 0 ? void 0 : _config$names12.wpDashThemeBuilderClick, this.createWpDashPayload({
734 - interaction_type: this.toLowerSnake(config === null || config === void 0 || (_config$triggers12 = config.triggers) === null || _config$triggers12 === void 0 ? void 0 : _config$triggers12.click),
735 - target_type: config === null || config === void 0 || (_config$targetTypes13 = config.targetTypes) === null || _config$targetTypes13 === void 0 ? void 0 : _config$targetTypes13.wpDashSubMenuItem,
736 - target_name: 'theme_builder_menu_item',
737 - interaction_result: config === null || config === void 0 || (_config$interactionRe15 = config.interactionResults) === null || _config$interactionRe15 === void 0 ? void 0 : _config$interactionRe15.themeBuilderPromotionWindow,
738 - location_l1: this.toLowerSnake(config === null || config === void 0 || (_config$secondaryLoca13 = config.secondaryLocations) === null || _config$secondaryLoca13 === void 0 ? void 0 : _config$secondaryLoca13.wpDashThemeBuilder),
739 - interaction_description: 'core_user_clicked_theme_builder_menu_item'
740 - }));
741 - }
742 - }, {
743 - key: "sendSidebarMenuItemClicked",
744 - value: function sendSidebarMenuItemClicked(_ref8) {
745 - var eventId = _ref8.eventId,
746 - groupEventId = _ref8.groupEventId;
747 - try {
748 - var _config$windowNames, _config$triggers13, _config$targetTypes14, _config$interactionRe16, _config$locations12, _config$names13;
749 - var config = this.getConfig();
750 - var payload = this.createBasePayload({
751 - window_name: config === null || config === void 0 || (_config$windowNames = config.windowNames) === null || _config$windowNames === void 0 ? void 0 : _config$windowNames.sidebarMenu,
752 - interaction_type: this.toLowerSnake(config === null || config === void 0 || (_config$triggers13 = config.triggers) === null || _config$triggers13 === void 0 ? void 0 : _config$triggers13.click),
753 - target_type: config === null || config === void 0 || (_config$targetTypes14 = config.targetTypes) === null || _config$targetTypes14 === void 0 ? void 0 : _config$targetTypes14.link,
754 - target_name: eventId,
755 - interaction_result: config === null || config === void 0 || (_config$interactionRe16 = config.interactionResults) === null || _config$interactionRe16 === void 0 ? void 0 : _config$interactionRe16.pageOpened,
756 - target_location: this.toLowerSnake(config === null || config === void 0 || (_config$locations12 = config.locations) === null || _config$locations12 === void 0 ? void 0 : _config$locations12.sidebar)
757 - });
758 - if (groupEventId) {
759 - payload.location_l1 = groupEventId;
760 - }
761 - return this.dispatchEvent(config === null || config === void 0 || (_config$names13 = config.names) === null || _config$names13 === void 0 || (_config$names13 = _config$names13.editorOne) === null || _config$names13 === void 0 ? void 0 : _config$names13.sidebarMenuItemClicked, payload);
762 - } catch (error) {
763 - return false;
764 - }
765 - }
766 - }, {
767 - key: "sendSidebarMenuGroupToggled",
768 - value: function sendSidebarMenuGroupToggled(_ref9) {
769 - var eventId = _ref9.eventId,
770 - isExpanded = _ref9.isExpanded;
771 - try {
772 - var _config$interactionRe17, _config$interactionRe18, _config$names14, _config$windowNames2, _config$triggers14, _config$targetTypes15, _config$locations13;
773 - var config = this.getConfig();
774 - var interactionResult = isExpanded ? config === null || config === void 0 || (_config$interactionRe17 = config.interactionResults) === null || _config$interactionRe17 === void 0 ? void 0 : _config$interactionRe17.expanded : config === null || config === void 0 || (_config$interactionRe18 = config.interactionResults) === null || _config$interactionRe18 === void 0 ? void 0 : _config$interactionRe18.collapsed;
775 - return this.dispatchEvent(config === null || config === void 0 || (_config$names14 = config.names) === null || _config$names14 === void 0 || (_config$names14 = _config$names14.editorOne) === null || _config$names14 === void 0 ? void 0 : _config$names14.sidebarMenuGroupToggled, this.createBasePayload({
776 - window_name: config === null || config === void 0 || (_config$windowNames2 = config.windowNames) === null || _config$windowNames2 === void 0 ? void 0 : _config$windowNames2.sidebarMenu,
777 - interaction_type: this.toLowerSnake(config === null || config === void 0 || (_config$triggers14 = config.triggers) === null || _config$triggers14 === void 0 ? void 0 : _config$triggers14.click),
778 - target_type: config === null || config === void 0 || (_config$targetTypes15 = config.targetTypes) === null || _config$targetTypes15 === void 0 ? void 0 : _config$targetTypes15.toggle,
779 - target_name: eventId,
780 - interaction_result: interactionResult,
781 - target_location: this.toLowerSnake(config === null || config === void 0 || (_config$locations13 = config.locations) === null || _config$locations13 === void 0 ? void 0 : _config$locations13.sidebar)
782 - }));
783 - } catch (error) {
784 - return false;
785 - }
786 - }
787 687 }]);
788 688 }();
789 689 var createDebouncedFinderSearch = exports.createDebouncedFinderSearch = function createDebouncedFinderSearch() {
790 690 var delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 300;
@@ -980,10 +880,9 @@
980 880 id: id,
981 881 settings: (_element$settings = element.settings) !== null && _element$settings !== void 0 ? _element$settings : {},
982 882 elements: elements,
983 883 isLocked: element.isLocked || false,
984 - editor_settings: element.editor_settings || {},
985 - meta: element.meta || {}
884 + editor_settings: element.editor_settings || {}
986 885 };
987 886 }
988 887 }]);
989 888 }(elementor.modules.elements.models.Element);
@@ -1091,29 +990,8 @@
1091 990 var _default = exports["default"] = createFlexboxType;
1092 991
1093 992 /***/ }),
1094 993
1095 -/***/ "../modules/atomic-widgets/assets/js/editor/atomic-element-types/create-grid-type.js":
1096 -/*!*******************************************************************************************!*\
1097 - !*** ../modules/atomic-widgets/assets/js/editor/atomic-element-types/create-grid-type.js ***!
1098 - \*******************************************************************************************/
1099 -/***/ ((__unused_webpack_module, exports) => {
1100 -
1101 -"use strict";
1102 -
1103 -
1104 -Object.defineProperty(exports, "__esModule", ({
1105 - value: true
1106 -}));
1107 -exports["default"] = void 0;
1108 -var createGridType = function createGridType() {
1109 - var GridView = elementor.modules.elements.views.createAtomicElementBase('e-grid');
1110 - return new elementor.modules.elements.types.AtomicElementBase('e-grid', GridView);
1111 -};
1112 -var _default = exports["default"] = createGridType;
1113 -
1114 -/***/ }),
1115 -
1116 994 /***/ "../modules/atomic-widgets/assets/js/editor/component.js":
1117 995 /*!***************************************************************!*\
1118 996 !*** ../modules/atomic-widgets/assets/js/editor/component.js ***!
1119 997 \***************************************************************/
@@ -1387,32 +1265,12 @@
1387 1265 BaseElementView.prototype.onRender.apply(this, arguments);
1388 1266
1389 1267 // Defer to wait for everything to render.
1390 1268 setTimeout(function () {
1391 - if (_this5.isAtomicGridContainer()) {
1392 - _this5.reInitEmptyView();
1393 - }
1394 1269 _this5.droppableInitialize();
1395 1270 _this5.updateHandlesPosition();
1396 1271 });
1397 1272 },
1398 - destroyEmptyView: function destroyEmptyView() {
1399 - if (this.isAtomicGridContainer()) {
1400 - return;
1401 - }
1402 - return Marionette.CompositeView.prototype.destroyEmptyView.apply(this, arguments);
1403 - },
1404 - isAtomicGridContainer: function isAtomicGridContainer() {
1405 - return 'e-grid' === type;
1406 - },
1407 - reInitEmptyView: function reInitEmptyView() {
1408 - var _this$el;
1409 - if ((_this$el = this.el) !== null && _this$el !== void 0 && _this$el.querySelector(':scope > .elementor-empty-view')) {
1410 - return;
1411 - }
1412 - delete this._showingEmptyView;
1413 - this.showEmptyView();
1414 - },
1415 1273 onDestroy: function onDestroy() {
1416 1274 BaseElementView.prototype.onDestroy.apply(this, arguments);
1417 1275 this.dispatchPreviewEvent('elementor/element/destroy');
1418 1276 },
@@ -1550,9 +1408,9 @@
1550 1408 getDroppableOptions: function getDroppableOptions() {
1551 1409 var _this7 = this;
1552 1410 var items = '> .elementor-element, > .elementor-empty-view .elementor-first-add';
1553 1411 return {
1554 - axis: this.isAtomicGridContainer() ? 'vertical' : null,
1412 + axis: null,
1555 1413 items: items,
1556 1414 groups: ['elementor-element'],
1557 1415 horizontalThreshold: 0,
1558 1416 isDroppingAllowed: this.isDroppingAllowed.bind(this),
@@ -1568,26 +1426,41 @@
1568 1426 // Triggering the drag end manually, since it won't fire above the iframe
1569 1427 elementor.getPreviewView().onPanelElementDragEnd();
1570 1428 var draggedView = elementor.channels.editor.request('element:dragged'),
1571 1429 draggedElement = draggedView === null || draggedView === void 0 ? void 0 : draggedView.getContainer().view.el,
1572 - isEmptyViewTarget = _this7.emptyViewIsCurrentlyBeingDraggedOver(),
1573 - containerElement = isEmptyViewTarget ? _this7.el : event.currentTarget.parentElement,
1430 + containerElement = event.currentTarget.parentElement,
1574 1431 elements = Array.from((containerElement === null || containerElement === void 0 ? void 0 : containerElement.querySelectorAll(':scope > .elementor-element')) || []);
1575 - var targetIndex = isEmptyViewTarget ? elements.length : elements.indexOf(event.currentTarget);
1432 + var targetIndex = elements.indexOf(event.currentTarget);
1576 1433 if (_this7.isPanelElement(draggedView, draggedElement)) {
1577 - if (_this7.draggingOnBottomOrRightSide(side) && !isEmptyViewTarget) {
1434 + var _elementorCommon;
1435 + if (_this7.draggingOnBottomOrRightSide(side) && !_this7.emptyViewIsCurrentlyBeingDraggedOver()) {
1578 1436 targetIndex++;
1579 1437 }
1580 1438 _this7.onDrop(event, {
1581 1439 at: targetIndex
1582 1440 });
1441 + if ((_elementorCommon = elementorCommon) !== null && _elementorCommon !== void 0 && (_elementorCommon = _elementorCommon.eventsManager) !== null && _elementorCommon !== void 0 && _elementorCommon.dispatchEvent) {
1442 + var selectedElement = elementor.channels.panelElements.request('element:selected');
1443 + if (selectedElement) {
1444 + var _selectedElement$mode, _selectedElement$mode2, _selectedElement$mode3, _selectedElement$mode4;
1445 + var elType = (_selectedElement$mode = (_selectedElement$mode2 = selectedElement.model) === null || _selectedElement$mode2 === void 0 ? void 0 : _selectedElement$mode2.get('elType')) !== null && _selectedElement$mode !== void 0 ? _selectedElement$mode : '';
1446 + var widgetType = (_selectedElement$mode3 = (_selectedElement$mode4 = selectedElement.model) === null || _selectedElement$mode4 === void 0 ? void 0 : _selectedElement$mode4.get('widgetType')) !== null && _selectedElement$mode3 !== void 0 ? _selectedElement$mode3 : '';
1447 + var elementName = 'widget' === elType ? widgetType : elType;
1448 + elementorCommon.eventsManager.dispatchEvent('add_element', {
1449 + location: 'editor_panel',
1450 + element_name: elementName,
1451 + element_type: elType,
1452 + widget_type: widgetType
1453 + });
1454 + }
1455 + }
1583 1456 return;
1584 1457 }
1585 1458 if (_this7.isParentElement(draggedView.getContainer().id)) {
1586 1459 return;
1587 1460 }
1588 - if (isEmptyViewTarget) {
1589 - _this7.moveDroppedItem(draggedView, targetIndex);
1461 + if (_this7.emptyViewIsCurrentlyBeingDraggedOver()) {
1462 + _this7.moveDroppedItem(draggedView, 0);
1590 1463 return;
1591 1464 }
1592 1465 _this7.moveExistingElement(side, draggedView, containerElement, elements, targetIndex, draggedElement);
1593 1466 }
@@ -1945,12 +1818,9 @@
1945 1818 exports.getElementChildren = getElementChildren;
1946 1819 var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../node_modules/@babel/runtime/helpers/toConsumableArray.js"));
1947 1820 function getElementChildren(model) {
1948 1821 var _model$get$models, _model$get;
1949 - if (!model) {
1950 - return [];
1951 - }
1952 - var childModels = (_model$get$models = (_model$get = model.get('elements')) === null || _model$get === void 0 ? void 0 : _model$get.models) !== null && _model$get$models !== void 0 ? _model$get$models : [];
1822 + var childModels = (_model$get$models = model === null || model === void 0 || (_model$get = model.get('elements')) === null || _model$get === void 0 ? void 0 : _model$get.models) !== null && _model$get$models !== void 0 ? _model$get$models : [];
1953 1823 var children = childModels.flatMap(getElementChildren);
1954 1824 return [model].concat((0, _toConsumableArray2.default)(children));
1955 1825 }
1956 1826
@@ -2009,15 +1879,12 @@
2009 1879 var _getRandomStyleId = __webpack_require__(/*! ./get-random-style-id */ "../modules/atomic-widgets/assets/js/editor/utils/get-random-style-id.js");
2010 1880 function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2011 1881 function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2012 1882 function regenerateLocalStyleIds(container) {
2013 - if (!(container !== null && container !== void 0 && container.model)) {
2014 - return;
2015 - }
2016 1883 var allElements = (0, _getElementChildren.getElementChildren)(container.model);
2017 1884 var styledElements = allElements.filter(function (model) {
2018 1885 var _model$get;
2019 - return model && Object.keys((_model$get = model.get('styles')) !== null && _model$get !== void 0 ? _model$get : {}).length > 0;
1886 + return Object.keys((_model$get = model.get('styles')) !== null && _model$get !== void 0 ? _model$get : {}).length > 0;
2020 1887 });
2021 1888 updateElementsStyleIdsInsideOut(styledElements);
2022 1889 }
2023 1890 function isClassesProp(prop) {
@@ -3033,9 +2900,8 @@
3033 2900 var _createAtomicElementBaseView = _interopRequireDefault(__webpack_require__(/*! ./create-atomic-element-base-view */ "../modules/atomic-widgets/assets/js/editor/create-atomic-element-base-view.js"));
3034 2901 var _atomicElementBaseModel = _interopRequireDefault(__webpack_require__(/*! ./atomic-element-base-model */ "../modules/atomic-widgets/assets/js/editor/atomic-element-base-model.js"));
3035 2902 var _createDivBlockType = _interopRequireDefault(__webpack_require__(/*! ./atomic-element-types/create-div-block-type */ "../modules/atomic-widgets/assets/js/editor/atomic-element-types/create-div-block-type.js"));
3036 2903 var _createFlexboxType = _interopRequireDefault(__webpack_require__(/*! ./atomic-element-types/create-flexbox-type */ "../modules/atomic-widgets/assets/js/editor/atomic-element-types/create-flexbox-type.js"));
3037 -var _createGridType = _interopRequireDefault(__webpack_require__(/*! ./atomic-element-types/create-grid-type */ "../modules/atomic-widgets/assets/js/editor/atomic-element-types/create-grid-type.js"));
3038 2904 function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
3039 2905 function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
3040 2906 var Module = /*#__PURE__*/function (_elementorModules$edi) {
3041 2907 function Module() {
@@ -3059,19 +2925,10 @@
3059 2925 }
3060 2926 }, {
3061 2927 key: "registerAtomicElements",
3062 2928 value: function registerAtomicElements() {
3063 - this.registerAtomicElementTypeIfAbsent((0, _createDivBlockType.default)());
3064 - this.registerAtomicElementTypeIfAbsent((0, _createFlexboxType.default)());
3065 - this.registerAtomicElementTypeIfAbsent((0, _createGridType.default)());
3066 - }
3067 - }, {
3068 - key: "registerAtomicElementTypeIfAbsent",
3069 - value: function registerAtomicElementTypeIfAbsent(elementType) {
3070 - if (elementor.elementsManager.getElementTypeClass(elementType.getType())) {
3071 - return;
3072 - }
3073 - elementor.elementsManager.registerElementType(elementType);
2929 + elementor.elementsManager.registerElementType((0, _createDivBlockType.default)());
2930 + elementor.elementsManager.registerElementType((0, _createFlexboxType.default)());
3074 2931 }
3075 2932 }]);
3076 2933 }(elementorModules.editor.utils.Module);
3077 2934 new Module();