formiojs-eorion 0.1.1 → 0.1.3

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 (36) hide show
  1. package/Formio.js +1 -1
  2. package/components/DataChinaGrid/Data.js +33 -17
  3. package/components/DataChinaGrid/editForm/Data.edit.display.js +6 -0
  4. package/components/DataChinaGridRow/Data.js +36 -15
  5. package/components/DataChinaGridRow/editForm/Data.edit.display.js +8 -2
  6. package/components/Flex/editForm/Flex.edit.display.js +12 -0
  7. package/components/index.js +1 -0
  8. package/components/progress/Progress.form.js +19 -0
  9. package/components/progress/Progress.js +129 -0
  10. package/components/progress/editForm/Progress.edit.display.js +76 -0
  11. package/dist/formio.builder.css +1 -0
  12. package/dist/formio.builder.min.css +1 -1
  13. package/dist/formio.contrib.js +27 -6
  14. package/dist/formio.contrib.min.js +1 -1
  15. package/dist/formio.contrib.min.js.LICENSE.txt +1 -1
  16. package/dist/formio.embed.min.js.LICENSE.txt +1 -1
  17. package/dist/formio.form.js +66 -12
  18. package/dist/formio.form.min.js +1 -1
  19. package/dist/formio.form.min.js.LICENSE.txt +1 -1
  20. package/dist/formio.full.css +1 -0
  21. package/dist/formio.full.js +66 -12
  22. package/dist/formio.full.min.css +1 -1
  23. package/dist/formio.full.min.js +1 -1
  24. package/dist/formio.full.min.js.LICENSE.txt +1 -1
  25. package/dist/formio.js +1 -1
  26. package/dist/formio.min.js +1 -1
  27. package/dist/formio.min.js.LICENSE.txt +1 -1
  28. package/dist/formio.utils.min.js.LICENSE.txt +1 -1
  29. package/package.json +1 -1
  30. package/templates/bootstrap/customTab/form.ejs.js +1 -1
  31. package/templates/bootstrap/dataChinaGrid/form.ejs.js +8 -4
  32. package/templates/bootstrap/dataChinaGridRow/form.ejs.js +10 -6
  33. package/templates/bootstrap/flex/form.ejs.js +27 -3
  34. package/templates/bootstrap/index.js +3 -1
  35. package/templates/bootstrap/progress/form.ejs.js +8 -0
  36. package/templates/bootstrap/progress/index.js +12 -0
package/Formio.js CHANGED
@@ -1724,7 +1724,7 @@ Formio.projectUrlSet = false;
1724
1724
  Formio.plugins = [];
1725
1725
  Formio.cache = {};
1726
1726
  Formio.Providers = _providers.default;
1727
- Formio.version = '0.1.1';
1727
+ Formio.version = '0.1.3';
1728
1728
  Formio.pathType = '';
1729
1729
  Formio.events = new _EventEmitter.default();
1730
1730
  Formio.cdn = new _CDN.default();
@@ -22,10 +22,10 @@ require("core-js/modules/es.string.replace.js");
22
22
  require("core-js/modules/es.string.trim.js");
23
23
  require("core-js/modules/es.array.find.js");
24
24
  require("core-js/modules/es.object.to-string.js");
25
+ require("core-js/modules/web.dom-collections.for-each.js");
25
26
  require("core-js/modules/es.array.concat.js");
26
27
  require("core-js/modules/es.object.get-prototype-of.js");
27
28
  var _Field = _interopRequireDefault(require("../_classes/field/Field"));
28
- var _jquery = _interopRequireDefault(require("jquery"));
29
29
  require("peity");
30
30
  var _lodash = _interopRequireDefault(require("lodash"));
31
31
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -195,17 +195,32 @@ var DataChinaGrid = /*#__PURE__*/function (_Component) {
195
195
  container.querySelector('.sparkline-container').innerHTML = "<span class=\"line\">".concat(self.parseTpl(self.component['sparkLine-value'], {
196
196
  data: self.rootValue
197
197
  }), "</span>");
198
- // @ts-ignore
199
- (0, _jquery.default)(container).find('.line').peity(sparkLineType, {
200
- fill: fillColor,
201
- height: self.component['sparkLine-height'],
202
- max: self.component['sparkLine-max-value-count'],
203
- min: 0,
204
- stroke: self.component['sparkLine-stroke-color'],
205
- strokeWidth: 2,
206
- width: self.component['sparkLine-width']
207
- });
208
- self.isLoadingSparkLine = false;
198
+ try {
199
+ // @ts-ignore
200
+ $(container).find('.line').peity(sparkLineType, {
201
+ fill: fillColor,
202
+ height: self.component['sparkLine-height'],
203
+ max: self.component['sparkLine-max-value-count'],
204
+ min: 0,
205
+ stroke: self.component['sparkLine-stroke-color'],
206
+ strokeWidth: 2,
207
+ width: self.component['sparkLine-width']
208
+ });
209
+ self.isLoadingSparkLine = false;
210
+ } catch (e) {
211
+ container.querySelectorAll(".line").forEach(function (e) {
212
+ return peity(e, sparkLineType, {
213
+ fill: fillColor,
214
+ height: self.component['sparkLine-height'],
215
+ max: self.component['sparkLine-max-value-count'],
216
+ min: 0,
217
+ stroke: self.component['sparkLine-stroke-color'],
218
+ strokeWidth: 2,
219
+ width: self.component['sparkLine-width']
220
+ });
221
+ });
222
+ self.isLoadingSparkLine = false;
223
+ }
209
224
  }
210
225
  } catch (e) {
211
226
  console.log(e);
@@ -220,11 +235,12 @@ var DataChinaGrid = /*#__PURE__*/function (_Component) {
220
235
  }
221
236
  return _Field.default.schema.apply(_Field.default, [{
222
237
  type: 'data_china_grid',
223
- icon: '',
224
- color: '#ff7754',
225
- header: '',
226
- url: '',
227
- field: ''
238
+ "title-content": "低压问题综合治理率 <i class=\"fa fa-info-circle\" aria-hidden=\"true\"></i>",
239
+ "value-content": "160 <i style='font-size: 10px;color: #0a6ebd'>%</i>",
240
+ "footer-content1": "name",
241
+ "footer-content2": "<div style='color:red'>up</div>",
242
+ "footer-content3": "info",
243
+ "footer-content": "开始时间"
228
244
  }].concat(extend));
229
245
  }
230
246
  }, {
@@ -99,6 +99,12 @@ var _default = [{
99
99
  input: true,
100
100
  defaultValue: '#000000',
101
101
  label: '字体大小'
102
+ }, {
103
+ key: 'value-font-weight',
104
+ type: 'input',
105
+ input: true,
106
+ defaultValue: 'bold',
107
+ label: '字体粗细'
102
108
  }]
103
109
  }, {
104
110
  type: 'panel',
@@ -22,6 +22,7 @@ require("core-js/modules/es.string.replace.js");
22
22
  require("core-js/modules/es.string.trim.js");
23
23
  require("core-js/modules/es.array.find.js");
24
24
  require("core-js/modules/es.object.to-string.js");
25
+ require("core-js/modules/web.dom-collections.for-each.js");
25
26
  require("core-js/modules/es.array.concat.js");
26
27
  require("core-js/modules/es.object.get-prototype-of.js");
27
28
  var _Field = _interopRequireDefault(require("../_classes/field/Field"));
@@ -195,17 +196,35 @@ var DataChinaGridRow = /*#__PURE__*/function (_Component) {
195
196
  container.querySelector('.sparkline-container').innerHTML = "<span class=\"line\">".concat(self.parseTpl(self.component['sparkLine-value'], {
196
197
  data: self.rootValue
197
198
  }), "</span>");
198
- // @ts-ignore
199
- (0, _jquery.default)(container).find('.line').peity(sparkLineType, {
200
- fill: fillColor,
201
- height: self.component['sparkLine-height'],
202
- max: self.component['sparkLine-max-value-count'],
203
- min: 0,
204
- stroke: self.component['sparkLine-stroke-color'],
205
- strokeWidth: 2,
206
- width: self.component['sparkLine-width']
207
- });
208
- self.isLoadingSparkLine = false;
199
+ // 宽度计算
200
+ var parentWidth = container.querySelector('#sparkline-container-parent').offsetWidth;
201
+ parentWidth = parentWidth * self.component['sparkLine-width'];
202
+ try {
203
+ // @ts-ignore
204
+ (0, _jquery.default)(container).find('.line').peity(sparkLineType, {
205
+ fill: fillColor,
206
+ height: self.component['sparkLine-height'],
207
+ max: self.component['sparkLine-max-value-count'],
208
+ min: 0,
209
+ stroke: self.component['sparkLine-stroke-color'],
210
+ strokeWidth: 2,
211
+ width: parentWidth
212
+ });
213
+ self.isLoadingSparkLine = false;
214
+ } catch (e) {
215
+ container.querySelectorAll(".line").forEach(function (e) {
216
+ return peity(e, sparkLineType, {
217
+ fill: fillColor,
218
+ height: self.component['sparkLine-height'],
219
+ max: self.component['sparkLine-max-value-count'],
220
+ min: 0,
221
+ stroke: self.component['sparkLine-stroke-color'],
222
+ strokeWidth: 2,
223
+ width: parentWidth
224
+ });
225
+ });
226
+ self.isLoadingSparkLine = false;
227
+ }
209
228
  }
210
229
  } catch (e) {
211
230
  console.log(e);
@@ -220,11 +239,13 @@ var DataChinaGridRow = /*#__PURE__*/function (_Component) {
220
239
  }
221
240
  return _Field.default.schema.apply(_Field.default, [{
222
241
  type: 'data_china_grid_row',
223
- icon: '',
224
242
  color: '#ff7754',
225
- header: '',
226
- url: '',
227
- field: ''
243
+ "title-content": "低压问题综合治理率 <i class=\"fa fa-info-circle\" aria-hidden=\"true\"></i>",
244
+ "value-content": "160 <i style='font-size: 10px;color: #0a6ebd'>%</i>",
245
+ "footer-content1": "name",
246
+ "footer-content2": "<div style='color:red'>up</div>",
247
+ "footer-content3": "info",
248
+ "footer-content": "开始时间"
228
249
  }].concat(extend));
229
250
  }
230
251
  }, {
@@ -99,6 +99,12 @@ var _default = [{
99
99
  input: true,
100
100
  defaultValue: '#000000',
101
101
  label: '字体大小'
102
+ }, {
103
+ key: 'value-font-weight',
104
+ type: 'input',
105
+ input: true,
106
+ defaultValue: 'bold',
107
+ label: '字体粗细'
102
108
  }]
103
109
  }, {
104
110
  type: 'panel',
@@ -240,8 +246,8 @@ var _default = [{
240
246
  label: 'width',
241
247
  key: 'sparkLine-width',
242
248
  input: true,
243
- tooltip: '',
244
- defaultValue: 32
249
+ defaultValue: 0.8,
250
+ tooltip: '占剩余空间所占比例,0-1.0'
245
251
  }, {
246
252
  type: 'number',
247
253
  label: 'height',
@@ -35,6 +35,18 @@ var _default = [{
35
35
  defaultValue: '11',
36
36
  tooltip: 'Unit:rem',
37
37
  label: 'Column Height'
38
+ }, {
39
+ weight: 150,
40
+ type: 'checkbox',
41
+ key: 'flex-wrap',
42
+ defaultValue: false,
43
+ label: '可换行'
44
+ }, {
45
+ weight: 150,
46
+ type: 'checkbox',
47
+ key: 'flex-scrollable',
48
+ defaultValue: false,
49
+ label: '可滚动'
38
50
  }, {
39
51
  weight: 150,
40
52
  type: 'datagrid',
@@ -80,6 +80,7 @@ var _NocodbFile = _interopRequireDefault(require("./NocodbFile/NocodbFile"));
80
80
  var _Data2 = _interopRequireDefault(require("./DataChinaGrid/Data"));
81
81
  var _Data3 = _interopRequireDefault(require("./DataChinaGridRow/Data"));
82
82
  var _Tabs2 = _interopRequireDefault(require("./CustomTabs/Tabs"));
83
+ var _Progress = _interopRequireDefault(require("./progress/Progress"));
83
84
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
84
85
  var _default = {
85
86
  map: _Map.default,
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ require("core-js/modules/es.array.concat.js");
8
+ var _NestedComponent = _interopRequireDefault(require("../_classes/nested/NestedComponent.form"));
9
+ var _ProgressEdit = _interopRequireDefault(require("./editForm/Progress.edit.display"));
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+ function _default() {
12
+ for (var _len = arguments.length, extend = new Array(_len), _key = 0; _key < _len; _key++) {
13
+ extend[_key] = arguments[_key];
14
+ }
15
+ return _NestedComponent.default.apply(void 0, [[{
16
+ key: 'display',
17
+ components: _ProgressEdit.default
18
+ }]].concat(extend));
19
+ }
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.object.get-prototype-of.js");
4
+ require("core-js/modules/es.reflect.construct.js");
5
+ require("core-js/modules/es.reflect.get.js");
6
+ require("core-js/modules/es.object.get-own-property-descriptor.js");
7
+ require("core-js/modules/es.symbol.iterator.js");
8
+ require("core-js/modules/es.array.iterator.js");
9
+ require("core-js/modules/es.string.iterator.js");
10
+ require("core-js/modules/web.dom-collections.iterator.js");
11
+ Object.defineProperty(exports, "__esModule", {
12
+ value: true
13
+ });
14
+ exports.default = void 0;
15
+ require("core-js/modules/es.regexp.exec.js");
16
+ require("core-js/modules/es.string.replace.js");
17
+ require("core-js/modules/es.string.trim.js");
18
+ require("core-js/modules/es.array.concat.js");
19
+ require("core-js/modules/es.symbol.to-primitive.js");
20
+ require("core-js/modules/es.date.to-primitive.js");
21
+ require("core-js/modules/es.symbol.js");
22
+ require("core-js/modules/es.symbol.description.js");
23
+ require("core-js/modules/es.object.to-string.js");
24
+ require("core-js/modules/es.number.constructor.js");
25
+ var _Field = _interopRequireDefault(require("../_classes/field/Field"));
26
+ var _Progress = _interopRequireDefault(require("./Progress.form"));
27
+ var _lodash = _interopRequireDefault(require("lodash"));
28
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
+ 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); }
30
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
31
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
32
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
33
+ function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get.bind(); } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }
34
+ function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
35
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
36
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
37
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
38
+ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
39
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
40
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
41
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
42
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
43
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
44
+ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
45
+ var Progress = /*#__PURE__*/function (_FieldComponent) {
46
+ _inherits(Progress, _FieldComponent);
47
+ var _super = _createSuper(Progress);
48
+ function Progress(component, options, data) {
49
+ _classCallCheck(this, Progress);
50
+ return _super.call(this, component, options, data);
51
+ }
52
+ _createClass(Progress, [{
53
+ key: "render",
54
+ value: function render(children) {
55
+ return _get(_getPrototypeOf(Progress.prototype), "render", this).call(this, this.renderTemplate('progress'));
56
+ }
57
+
58
+ /**
59
+ * After the html string has been mounted into the dom, the dom element is returned here. Use refs to find specific
60
+ * elements to attach functionality to.
61
+ *
62
+ * @param element
63
+ * @returns {Promise}
64
+ */
65
+ }, {
66
+ key: "attach",
67
+ value: function attach(element) {
68
+ var refs = {};
69
+ this.loadRefs(element, refs);
70
+
71
+ // Allow basic component functionality to attach like field logic and tooltips.
72
+ return _get(_getPrototypeOf(Progress.prototype), "attach", this).call(this, element);
73
+ }
74
+
75
+ /**
76
+ * Get the value of the component from the dom elements.
77
+ *
78
+ * @returns {Array}
79
+ */
80
+ }, {
81
+ key: "getValue",
82
+ value: function getValue() {
83
+ return this.component.value;
84
+ }
85
+ }, {
86
+ key: "parseTpl",
87
+ value: function parseTpl(template, map) {
88
+ return template.replace(/\$\{.+?}/g, function (match) {
89
+ var path = match.substr(2, match.length - 3).trim();
90
+ return _lodash.default.get(map, path);
91
+ });
92
+ }
93
+
94
+ /**
95
+ * Set the value of the component into the dom elements.
96
+ *
97
+ * @param value
98
+ * @returns {boolean}
99
+ */
100
+ }, {
101
+ key: "setValue",
102
+ value: function setValue(value) {
103
+ return true;
104
+ }
105
+ }], [{
106
+ key: "schema",
107
+ value: function schema() {
108
+ for (var _len = arguments.length, extend = new Array(_len), _key = 0; _key < _len; _key++) {
109
+ extend[_key] = arguments[_key];
110
+ }
111
+ return _Field.default.schema.apply(_Field.default, [{
112
+ label: 'Progress',
113
+ key: 'progress',
114
+ type: 'progress'
115
+ }].concat(extend));
116
+ }
117
+ }]);
118
+ return Progress;
119
+ }(_Field.default);
120
+ exports.default = Progress;
121
+ _defineProperty(Progress, "builderInfo", {
122
+ title: 'Progress',
123
+ group: 'advanced',
124
+ icon: 'qrcode',
125
+ weight: 70,
126
+ documentation: 'http://help.form.io/userguide/#progress',
127
+ schema: Progress.schema()
128
+ });
129
+ Progress.editForm = _Progress.default;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _default = [{
8
+ type: 'number',
9
+ label: 'Size',
10
+ key: 'width',
11
+ input: true,
12
+ weight: 1,
13
+ defaultValue: 128,
14
+ placeholder: 'Size of Qr Code',
15
+ tooltip: 'Enter the size that should be displayed by this Qr Code.'
16
+ }, {
17
+ type: 'select',
18
+ label: '对齐方式',
19
+ key: 'align',
20
+ weight: 2,
21
+ defaultValue: "start",
22
+ data: {
23
+ values: [{
24
+ label: 'left',
25
+ value: 'start'
26
+ }, {
27
+ label: 'right',
28
+ value: 'end'
29
+ }, {
30
+ label: 'mid',
31
+ value: 'center'
32
+ }]
33
+ }
34
+ }, {
35
+ type: 'input',
36
+ label: 'Value',
37
+ key: 'value',
38
+ input: true,
39
+ placeholder: "https://${data.name}-hh.com",
40
+ tooltip: 'Value',
41
+ weight: 3
42
+ }, {
43
+ key: 'labelPosition',
44
+ ignore: true
45
+ }, {
46
+ key: 'customClass',
47
+ ignore: false
48
+ }, {
49
+ key: 'placeholder',
50
+ ignore: true
51
+ }, {
52
+ key: 'hidden',
53
+ ignore: true
54
+ }, {
55
+ key: 'modalEdit',
56
+ ignore: true
57
+ }, {
58
+ key: 'tableView',
59
+ ignore: true
60
+ }, {
61
+ key: 'description',
62
+ ignore: true
63
+ }, {
64
+ key: 'autofocus',
65
+ ignore: true
66
+ }, {
67
+ key: 'tooltip',
68
+ ignore: true
69
+ }, {
70
+ key: 'tabindex',
71
+ ignore: true
72
+ }, {
73
+ key: 'disabled',
74
+ ignore: true
75
+ }];
76
+ exports.default = _default;
@@ -2646,6 +2646,7 @@ span[role=link] {
2646
2646
  .formio-component-customTabs .tab-header .tab-line {
2647
2647
  position: absolute;
2648
2648
  height: 2px;
2649
+ top: 40px;
2649
2650
  transition: all 0.3s;
2650
2651
  }
2651
2652