@c8y/ng1-modules 1017.0.378 → 1017.0.382
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/dataPointExplorer/controllers/dataPointExplorer.js +1 -1
- package/dataPointExplorer/controllers/dataPointWidget.js +1 -1
- package/dataPointExplorer/views/widget.html +2 -1
- package/measurements/fragmentChart/fragmentChart.component.js +1 -1
- package/measurements/measurements2/chart.directive.js +1 -1
- package/measurements/measurements2/chart.html +1 -0
- package/measurements/measurements2/iconBar.js +1 -1
- package/measurements/views/iconBar.html +10 -5
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";function _toConsumableArray(t){return _arrayWithoutHoles(t)||_iterableToArray(t)||_unsupportedIterableToArray(t)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(t,a){if(t){if("string"==typeof t)return _arrayLikeToArray(t,a);var e=Object.prototype.toString.call(t).slice(8,-1);return"Object"===e&&t.constructor&&(e=t.constructor.name),"Map"===e||"Set"===e?Array.from(t):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?_arrayLikeToArray(t,a):void 0}}function _iterableToArray(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}function _arrayWithoutHoles(t){if(Array.isArray(t))return _arrayLikeToArray(t)}function _arrayLikeToArray(t,a){(null==a||a>t.length)&&(a=t.length);for(var e=0,n=new Array(a);e<a;e++)n[e]=t[e];return n}!function(){function t(o,t,n,a,e,r,i,d,c,s,l,u,f,m){var g,p;function h(t,a){var e;t&&a&&(o.data.datapoints.length=0,(e=o.data.datapoints).push.apply(e,_toConsumableArray(t)));o.data.graphDataPoints=t;var n=v(_.filter(t,"__active"));o.channel=n?"/measurements/".concat(n):""}function y(t){o.data.graphAlarmsEventsConfigs=t;var a=v(_.filter(t,"__active"));o.alarmsChannel=a?"/alarms/".concat(a):"",o.eventsChannel=a?"/events/".concat(a):""}function v(t){return _(t).map(function(t){return t.__target.id}).uniq().value().join(",")}function A(){var t=a.getContext();t.context&&(g="".concat(t.context,"_").concat(t.id)),function(){if(o.disableLocalStorage)return;var a=_.throttle(function(t,a){t!==a&&function(){if(!o.dontSave&&!o.disableLocalStorage){var t=_.pick(o.data,["dateFrom","dateTo","interval","aggregation","realtime","alarmsEventsConfigs"]);r.setSavedFilters(t,g)}}()},500,{leading:!1,trailing:!0});r.getSavedFilters(g).then(function(t){_.assign(o.data,t),o.$watch("data.realtime",a),o.$watch("data.dateFrom",a),o.$watch("data.dateTo",a),o.$watch("data.interval",a),o.$watch("data.aggregation",a),o.$watch("data.alarmsEventsConfigs",a,!0)})}()}function b(){var t,a=b._hasDashboard,e=a;if(_.isUndefined(a))try{2===(t=n.get("dashboardSvc")).VERSION&&(e=t)}catch(t){e=!1}return b._hasDashboard=e}function T(t){var a=b();a&&a[t]({name:"Data points graph",title:l.getString("Data points"),_width:12,_height:5,config:{datapoints:o.data.graphDataPoints,alarmsEventsConfigs:o.data.graphAlarmsEventsConfigs,dateTo:o.data.dateTo,dateFrom:o.data.dateFrom,aggregation:o.data.aggregation,realtime:o.data.realtime}}).then(S)}function S(){d.success(s("Widget created."))}function D(){T("addWidgetToSelectedDashboardInContext")}function w(){T("addWidgetToSelectedReport")}function F(t){o.chartBox=t}function C(){o.$watch("data.datapoints",function(){r.saveLocal(o.data.datapoints,g)},!0)}o.onRealtimeAlarmFn=function(t){o.onAlarm=t},o.onRealtimeEventFn=function(t){o.onEvent=t},!a.getContext().context&&t.path().match(/datapoint/)&&e.changeTitle({title:s("Data explorer")}),A(),p={text:s(g?"Send as widget to dashboard":"Send as widget to report"),action:g?D:w},b()&&!o.noActions&&i.addAction(p),_.get(o,"data.datapoints.length")||r.listLocal(g).then(function(t){t&&t.length&&h(t,!0)}).then(C),o.noActions||function(){function t(t,a){i.addAction({text:t,action:function(){var t={dateFrom:moment(o.data.dateFrom).format(c.dateFullFormat),dateTo:moment(o.data.dateTo).format(c.dateFullFormat)};f.downloadReportForDatapoints(a,o.data.graphDataPoints,t).catch(function(t){t&&t.message&&d.warning(t.message)})}})}t(s("Download as CSV"),u.format.csv),t(s("Download as Excel"),u.format.xlsx)}(),$(window).resize(function(){o.$broadcast("dashboardResize"),o.$apply()}),o.onBoxChanged=F,o.onUpdateDates=function(t,a){o.data.dateFrom=t;var e=moment().diff(moment(a),"seconds")<
|
|
1
|
+
"use strict";function _toConsumableArray(t){return _arrayWithoutHoles(t)||_iterableToArray(t)||_unsupportedIterableToArray(t)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(t,a){if(t){if("string"==typeof t)return _arrayLikeToArray(t,a);var e=Object.prototype.toString.call(t).slice(8,-1);return"Object"===e&&t.constructor&&(e=t.constructor.name),"Map"===e||"Set"===e?Array.from(t):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?_arrayLikeToArray(t,a):void 0}}function _iterableToArray(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}function _arrayWithoutHoles(t){if(Array.isArray(t))return _arrayLikeToArray(t)}function _arrayLikeToArray(t,a){(null==a||a>t.length)&&(a=t.length);for(var e=0,n=new Array(a);e<a;e++)n[e]=t[e];return n}!function(){function t(o,t,n,a,e,r,i,d,c,s,l,u,f,m){var g,p;function h(t,a){var e;t&&a&&(o.data.datapoints.length=0,(e=o.data.datapoints).push.apply(e,_toConsumableArray(t)));o.data.graphDataPoints=t;var n=v(_.filter(t,"__active"));o.channel=n?"/measurements/".concat(n):""}function y(t){o.data.graphAlarmsEventsConfigs=t;var a=v(_.filter(t,"__active"));o.alarmsChannel=a?"/alarms/".concat(a):"",o.eventsChannel=a?"/events/".concat(a):""}function v(t){return _(t).map(function(t){return t.__target.id}).uniq().value().join(",")}function A(){var t=a.getContext();t.context&&(g="".concat(t.context,"_").concat(t.id)),function(){if(o.disableLocalStorage)return;var a=_.throttle(function(t,a){t!==a&&function(){if(!o.dontSave&&!o.disableLocalStorage){var t=_.pick(o.data,["dateFrom","dateTo","interval","aggregation","realtime","alarmsEventsConfigs"]);r.setSavedFilters(t,g)}}()},500,{leading:!1,trailing:!0});r.getSavedFilters(g).then(function(t){_.assign(o.data,t),o.$watch("data.realtime",a),o.$watch("data.dateFrom",a),o.$watch("data.dateTo",a),o.$watch("data.interval",a),o.$watch("data.aggregation",a),o.$watch("data.alarmsEventsConfigs",a,!0)})}()}function b(){var t,a=b._hasDashboard,e=a;if(_.isUndefined(a))try{2===(t=n.get("dashboardSvc")).VERSION&&(e=t)}catch(t){e=!1}return b._hasDashboard=e}function T(t){var a=b();a&&a[t]({name:"Data points graph",title:l.getString("Data points"),_width:12,_height:5,config:{datapoints:o.data.graphDataPoints,alarmsEventsConfigs:o.data.graphAlarmsEventsConfigs,dateTo:o.data.dateTo,dateFrom:o.data.dateFrom,aggregation:o.data.aggregation,realtime:o.data.realtime}}).then(S)}function S(){d.success(s("Widget created."))}function D(){T("addWidgetToSelectedDashboardInContext")}function w(){T("addWidgetToSelectedReport")}function F(t){o.chartBox=t}function C(){o.$watch("data.datapoints",function(){r.saveLocal(o.data.datapoints,g)},!0)}o.onRealtimeAlarmFn=function(t){o.onAlarm=t},o.onRealtimeEventFn=function(t){o.onEvent=t},!a.getContext().context&&t.path().match(/datapoint/)&&e.changeTitle({title:s("Data explorer")}),A(),p={text:s(g?"Send as widget to dashboard":"Send as widget to report"),action:g?D:w},b()&&!o.noActions&&i.addAction(p),_.get(o,"data.datapoints.length")||r.listLocal(g).then(function(t){t&&t.length&&h(t,!0)}).then(C),o.noActions||function(){function t(t,a){i.addAction({text:t,action:function(){var t={dateFrom:moment(o.data.dateFrom).format(c.dateFullFormat),dateTo:moment(o.data.dateTo).format(c.dateFullFormat)};f.downloadReportForDatapoints(a,o.data.graphDataPoints,t).catch(function(t){t&&t.message&&d.warning(t.message)})}})}t(s("Download as CSV"),u.format.csv),t(s("Download as Excel"),u.format.xlsx)}(),$(window).resize(function(){o.$broadcast("dashboardResize"),o.$apply()}),o.onBoxChanged=F,o.onUpdateDates=function(t,a){o.data.dateFrom=t;var e=moment().diff(moment(a),"seconds")<5;o.data.realtime&&!e&&(o.data.realtime=!1),o.data.dateTo=a},o.onUpdateDisplayedDates=function(t,a){o.data.displayedDateFrom=t,o.data.displayedDateTo=a},o.savedFilter={config:{},datapoints:[]},o.data=o.data||_.cloneDeep(o.savedFilter),function(){var a=o.data.interval;if(a&&"custom"!==a){var t=_.find(m.intervals,function(t){return t.id===a})||{};t.qty&&(o.data.dateFrom=moment().subtract(t.qty,t.unit).toDate(),o.data.dateTo=moment().toDate())}}(),o.$watch("data.datapoints",function(){return h(o.data.datapoints)},!0),o.$watch("data.alarmsEventsConfigs",y,!0)}t.$inject=["$scope","$location","$injector","c8yUiUtil","c8yTitle","c8yDataPointSvc","c8yActions","c8yAlert","c8yBase","gettext","gettextCatalog","c8yMeasurements","MeasurementsReportSvc","INTERVAL_CONSTANTS"],angular.module("c8y.cockpit.dataPointExplorer").controller("c8yDataPointExplorerCtrl",t)}();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";!function(){function
|
|
1
|
+
"use strict";!function(){function i(n,i,t,a){n.onRealtimeAlarmFn=function(i){n.onAlarm=i},n.onRealtimeEventFn=function(i){n.onEvent=i};var e,o=200;function c(){if(n.child&&n.child.config){var i=n.child.config,t=i.interval,e=i.realtime;t&&(t!==a.custom.id||e)&&(t===a.custom.id&&e?function(){var i=new Date(n.child.config.dateFrom),t=new Date(n.child.config.dateTo)-i,e=moment();n.child.config.dateTo=e.toDate(),n.child.config.dateFrom=e.subtract(t,"milliseconds").toDate()}():function(t){var i=_.find(a.intervals,function(i){return i.id===t})||{};i.qty&&(n.child.config.dateFrom=moment().subtract(i.qty,i.unit).toDate(),n.child.config.dateTo=moment().toDate())}(t))}}function l(){var i=t.height();_.isUndefined(_.get(e,"height"))||(i-=e.height),n.dataPointsGraphHeight=_.max([o,i])}function d(){i(function(){n.$broadcast("dashboardResize")},500)}function r(i,t){n.alarmsEventsTimeline=n.alarmsEventsTimeline||{},n.alarmsEventsTimeline.displayedDateFrom=i,n.alarmsEventsTimeline.displayedDateTo=t}function m(i){return _(i).map(function(i){return i.__target.id}).uniq().value().join(",")}n.onUpdateDates=function(i,t){if(!1===n.child.config.updateDates)return;n.child.config.dateFrom=i;var e=moment().diff(moment(t),"seconds")<5;n.viewRealtime&&!e&&(n.viewRealtime=!1);n.child.config.dateTo=t},n.onUpdateDisplayedDates=r,n.onBoxChanged=function(i){n.chartBox=i},n.onTimelinesChartSizeChanged=function(i){e=i,l(),d()},n.dataPointsGraphHeight=t.height(),n.viewRealtime=n.child&&n.child.config&&n.child.config.realtime,n.onRealtimeToggle=function(){n.viewRealtime=!n.viewRealtime},(n.recalculate=c)(),n.$watch("child.config.datapoints",function(i){var t=m(i);n.channel=t?"/measurements/".concat(t):""}),n.$watch("child.config.alarmsEventsConfigs",function(i){var t=m(i);n.alarmsChannel=t?"/alarms/".concat(t):"",n.eventsChannel=t?"/events/".concat(t):""}),n.$watchCollection(["child.config.dateFrom","child.config.dateTo"],function(){r(n.child.config.dateFrom,n.child.config.dateTo)}),n.$watch("child.config.realtime",function(){n.viewRealtime=n.child&&n.child.config&&n.child.config.realtime}),n.$on("dashboardResize",function(i){i.targetScope!==n&&(l(),d())})}i.$inject=["$scope","$timeout","$element","INTERVAL_CONSTANTS"],angular.module("c8y.cockpit.dataPointExplorer").controller("DataPointWidgetCtrl",i)}();
|
|
@@ -39,12 +39,13 @@
|
|
|
39
39
|
datapoints-initial-display-limit="child.config.datapointsInitialDisplayLimit"
|
|
40
40
|
date-from="child.config.dateFrom"
|
|
41
41
|
date-to="child.config.dateTo"
|
|
42
|
-
realtime="
|
|
42
|
+
realtime="viewRealtime"
|
|
43
43
|
aggregation="child.config.aggregation"
|
|
44
44
|
show-time="child.config.displayDateSelection"
|
|
45
45
|
on-data="onData"
|
|
46
46
|
on-update-dates="onUpdateDates($dateFrom, $dateTo)"
|
|
47
47
|
on-update-displayed-dates="onUpdateDisplayedDates($dateFrom, $dateTo)"
|
|
48
|
+
on-realtime-toggle="onRealtimeToggle()"
|
|
48
49
|
on-box-changed="onBoxChanged(box)"
|
|
49
50
|
selectable="child.config.selectable"
|
|
50
51
|
selected="child.config.selected"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";function _defineProperty(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}!function(){function e(i,a,e){var o,u=this,m=d3.scale.category10();function r(e){var n=e.currentValue,t=e.previousValue;return!_.isEmpty(n)&&!_.isEmpty(t)&&!_.isEqual(n,t)}function c(e){u.fragmentSeriesPairs=_.groupBy(e,"fragment")}function s(){u.channel="/measurements/".concat(o)}function f(){var e=function(e){var t=0,a=u.fragment,r={__target:{id:o},fragment:a,lineType:"line",renderType:"area"};return _.map(e,function(e,n){return _.assign({series:n,unit:e.unit,label:i.humanizeFragment("".concat(a," => ").concat(n)),color:m(t++),__active:!0},r)})}(function(e){return _.reduce(e,function(e,n){var t=n.series,a=n.unit;return _.assign(e,_defineProperty({},t,{unit:a}))},{})}(_.get(u.fragmentSeriesPairs,u.fragment)));_.set(u,"dataPoints",e)}u.aggregation="MINUTELY",u.interval=e._defaultDuration,_.assign(u,{$onChanges:function(e){var n=e.device,t=e.fragment;u.device&&u.fragment&&((r(n)||r(t))&&(u.fragmentSeriesPairs=void 0),o=i.getId(u.device),u.fragmentSeriesPairs?(s(),f()):a.getSupportedSeries(o).then(c).then(function(){s(),f()}))},$onInit:function(){u.dateFrom=moment().subtract(1,"hour").toDate(),u.dateTo=new Date},onUpdateDates:function(e,n){u.dateFrom=e;var t=moment().diff(moment(n),"seconds")<
|
|
1
|
+
"use strict";function _defineProperty(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}!function(){function e(i,a,e){var o,u=this,m=d3.scale.category10();function r(e){var n=e.currentValue,t=e.previousValue;return!_.isEmpty(n)&&!_.isEmpty(t)&&!_.isEqual(n,t)}function c(e){u.fragmentSeriesPairs=_.groupBy(e,"fragment")}function s(){u.channel="/measurements/".concat(o)}function f(){var e=function(e){var t=0,a=u.fragment,r={__target:{id:o},fragment:a,lineType:"line",renderType:"area"};return _.map(e,function(e,n){return _.assign({series:n,unit:e.unit,label:i.humanizeFragment("".concat(a," => ").concat(n)),color:m(t++),__active:!0},r)})}(function(e){return _.reduce(e,function(e,n){var t=n.series,a=n.unit;return _.assign(e,_defineProperty({},t,{unit:a}))},{})}(_.get(u.fragmentSeriesPairs,u.fragment)));_.set(u,"dataPoints",e)}u.aggregation="MINUTELY",u.interval=e._defaultDuration,_.assign(u,{$onChanges:function(e){var n=e.device,t=e.fragment;u.device&&u.fragment&&((r(n)||r(t))&&(u.fragmentSeriesPairs=void 0),o=i.getId(u.device),u.fragmentSeriesPairs?(s(),f()):a.getSupportedSeries(o).then(c).then(function(){s(),f()}))},$onInit:function(){u.dateFrom=moment().subtract(1,"hour").toDate(),u.dateTo=new Date},onUpdateDates:function(e,n){u.dateFrom=e;var t=moment().diff(moment(n),"seconds")<5;u.realtime&&!t&&(u.realtime=!1);u.dateTo=n},updateScale:function(e){_.forEach(e.series,function(e){var n=e.dataPoint,t=_.find(u.dataPoints,function(e){return e.fragment===n.fragment&&e.series===n.series});if(t){var a=e.values,r=_.minBy(a,"val.min").val.min,i=_.maxBy(a,"val.max").val.max;r===i&&(r-=1,i+=1),t.min=r,t.max=i}})}})}e.$inject=["c8yBase","c8yDevices","INTERVAL_CONSTANTS"],angular.module("c8y.core.measurements2").component("c8yMeasurementsFragmentChart",{templateUrl:":::PLUGIN_PATH:::/fragmentChart/fragmentChart.html",controllerAs:"vm",controller:e,bindings:{fragment:"<",device:"<",dateFrom:"=",dateTo:"=",realtime:"=?",hideRealtimeButton:"=?"}})}();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";angular.module("c8y.core.measurements2").directive("c8yChart",["c8yChart",function(
|
|
1
|
+
"use strict";angular.module("c8y.core.measurements2").directive("c8yChart",["c8yChart",function(r){return{restrict:"E",link:function(e,t,a,o){var n=new r.Chart(t,{showTime:e.showTime()});o.init(n),e.$on("$destroy",function(){n.destroy()})},controller:"c8yChartCtrl",controllerAs:"ctrl",templateUrl:":::PLUGIN_PATH:::/measurements2/chart.html",scope:{dateFrom:"=?",dateTo:"=?",aggregation:"=?",realtime:"=?",datapoints:"=",datapointsInitialDisplayLimit:"<",onData:"=?",onUpdateDates:"&",onUpdateDisplayedDates:"&",onRealtimeToggle:"&",onBoxChanged:"&",showTime:"&",selectable:"&",selected:"=?",onDataChange:"&"}}}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";angular.module("c8y.core.measurements2").directive("c8yMeasurementsIconBar",function(){return{restrict:"E",templateUrl:":::PLUGIN_PATH:::/views/iconBar.html",scope:{realtime:"=",aggregation:"=",showAggregation:"=",showLoading:"=",showRealtime:"=",showTruncated:"="},controller:["$scope","gettext",function(e,t){var n={undefined:t("No aggregation"),MINUTELY:t("Minutely aggregation"),HOURLY:t("Hourly aggregation"),DAILY:t("Daily aggregation")},a={undefined:"line-chart",MINUTELY:"hourglass",HOURLY:"clock-o",DAILY:"calendar-o"};e.getRealtimeIconName=function(){return e.realtime?"check-circle-o":"circle-o"},e.getRealtimeIconText=function(){return e.realtime?t("Realtime active"):t("Realtime inactive")},e.getRealtimeClassName=function(){return e.realtime?"text-success":""},e.getAggregationIconName=function(){return a[e.aggregation]},e.getAggregationIconText=function(){return n[e.aggregation]}}]}});
|
|
1
|
+
"use strict";angular.module("c8y.core.measurements2").directive("c8yMeasurementsIconBar",function(){return{restrict:"E",templateUrl:":::PLUGIN_PATH:::/views/iconBar.html",scope:{realtime:"=",onRealtimeToggle:"&",aggregation:"=",showAggregation:"=",showLoading:"=",showRealtime:"=",showTruncated:"="},controller:["$scope","gettext",function(e,t){var n={undefined:t("No aggregation"),MINUTELY:t("Minutely aggregation"),HOURLY:t("Hourly aggregation"),DAILY:t("Daily aggregation")},a={undefined:"line-chart",MINUTELY:"hourglass",HOURLY:"clock-o",DAILY:"calendar-o"};e.getRealtimeIconName=function(){return e.realtime?"check-circle-o":"circle-o"},e.getRealtimeIconText=function(){return e.realtime?t("Realtime active"):t("Realtime inactive")},e.getRealtimeClassName=function(){return e.realtime?"text-success":""},e.getAggregationIconName=function(){return a[e.aggregation]},e.getAggregationIconText=function(){return n[e.aggregation]}}]}});
|
|
@@ -8,13 +8,18 @@
|
|
|
8
8
|
</div>
|
|
9
9
|
</div>
|
|
10
10
|
|
|
11
|
-
<
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
<button
|
|
12
|
+
class=" btn btn-link measurement-icon c8y-realtime asurement-realtime {{
|
|
13
|
+
getRealtimeClassName()
|
|
14
|
+
}}"
|
|
15
|
+
type="button"
|
|
16
|
+
aria-label="{{ getRealtimeIconText() | translate }}"
|
|
15
17
|
uib-tooltip="{{ getRealtimeIconText() | translate }}"
|
|
18
|
+
tooltip-placement="right"
|
|
16
19
|
tooltip-popup-delay="500"
|
|
17
20
|
tooltip-append-to-body="true"
|
|
21
|
+
ng-show="showRealtime"
|
|
22
|
+
ng-click="onRealtimeToggle()"
|
|
18
23
|
>
|
|
19
24
|
<!-- TODO: Fix hack
|
|
20
25
|
change the function getRealtimeIconName to return 'active : inactive ' instead of icon name
|
|
@@ -26,7 +31,7 @@
|
|
|
26
31
|
inactive: getRealtimeIconName() != 'check-circle-o'
|
|
27
32
|
}"
|
|
28
33
|
></span>
|
|
29
|
-
</
|
|
34
|
+
</button>
|
|
30
35
|
|
|
31
36
|
<span ng-show="showAggregation" class="measurement-icon measurement-aggregation">
|
|
32
37
|
<i
|