@osimatic/helpers-js 1.0.2
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/array.js +84 -0
- package/bank.js +7 -0
- package/button_loader.js +50 -0
- package/contact_details.js +172 -0
- package/count_down.js +103 -0
- package/data_table.js +419 -0
- package/date_time.js +551 -0
- package/details_sub_array.js +126 -0
- package/duration.js +177 -0
- package/file.js +128 -0
- package/flash_message.js +38 -0
- package/form_date.js +262 -0
- package/form_helper.js +237 -0
- package/google_charts.js +344 -0
- package/google_charts_mytime.js +295 -0
- package/google_maps.js +169 -0
- package/google_recaptcha.js +15 -0
- package/graphiques.js +281 -0
- package/import_from_csv.js +274 -0
- package/index.js +69 -0
- package/jquery.js +5 -0
- package/jwt.js +97 -0
- package/list_box.js +113 -0
- package/location.js +391 -0
- package/media.js +82 -0
- package/multiple_action_in_table.js +229 -0
- package/network.js +554 -0
- package/number.js +90 -0
- package/package.json +12 -0
- package/paging.js +237 -0
- package/php.min.js +4 -0
- package/select_all.js +132 -0
- package/social_network.js +110 -0
- package/string.js +118 -0
- package/tree.js +71 -0
- package/util.js +23 -0
package/array.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
|
|
2
|
+
Array.prototype.unset = function(index) {
|
|
3
|
+
if (index > -1) {
|
|
4
|
+
this.splice(index,1);
|
|
5
|
+
}
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
Array.prototype.unsetVal = function(val) {
|
|
9
|
+
let index = this.indexOf(val);
|
|
10
|
+
if (index > -1) {
|
|
11
|
+
this.splice(index, 1);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
Array.prototype.inArray = function(p_val) {
|
|
16
|
+
return this.indexOf(p_val) > -1;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
Array.prototype.unique = function() {
|
|
20
|
+
return [...new Set(this)];
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
Array.prototype.removeEmptyValues = function() {
|
|
24
|
+
return this.filter(val => val != '');
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
Array.prototype.hasOwnIndex = function(prop) {
|
|
28
|
+
return this.hasOwnProperty(prop) && /^0$|^[1-9]\d*$/.test(prop) && prop <= 4294967294; // 2^32 - 2
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
Array.prototype.cumulativeSum = function() {
|
|
32
|
+
let cumulativeSum = (sum => value => sum += value)(0);
|
|
33
|
+
return this.map(cumulativeSum);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
Array.prototype.intersect = function(array1, array2) {
|
|
37
|
+
return array1.filter(value => array2.includes(value));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
Array.prototype.filterUnique = function() {
|
|
41
|
+
//let onlyUnique = (([value, index, self]) => self.indexOf(value) === index);
|
|
42
|
+
return this.filter((v, i, a) => a.indexOf(v) === i);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
function getValuesByKeyInArrayOfArrays(array, key) {
|
|
46
|
+
let listeValues = [];
|
|
47
|
+
for (let i in array) {
|
|
48
|
+
let subArray = array[i];
|
|
49
|
+
if (typeof(subArray[key]) != 'undefined') {
|
|
50
|
+
listeValues.push(subArray[key]);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return listeValues;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
Object.toArray = (obj) => {
|
|
57
|
+
return Object.keys(obj).map(key => obj[key]);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
Object.filter = (obj, predicate) => {
|
|
61
|
+
return Object.keys(obj)
|
|
62
|
+
.filter( key => predicate(obj[key]) )
|
|
63
|
+
.reduce( (res, key) => (res[key] = obj[key], res), {} );
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
function renameKeys(obj, keysMap) {
|
|
67
|
+
return Object.keys(obj).reduce(
|
|
68
|
+
(acc, key) => ({
|
|
69
|
+
...acc,
|
|
70
|
+
...{ [keysMap[key] || key]: obj[key] }
|
|
71
|
+
}),
|
|
72
|
+
{}
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function renameKeysByCallback(obj, callback) {
|
|
77
|
+
return Object.keys(obj).reduce(
|
|
78
|
+
(acc, key) => ({
|
|
79
|
+
...acc,
|
|
80
|
+
...{[callback(key)]: obj[key]}
|
|
81
|
+
}),
|
|
82
|
+
{}
|
|
83
|
+
);
|
|
84
|
+
}
|
package/bank.js
ADDED
package/button_loader.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
|
|
2
|
+
// Loading button plugin (removed from BS4)
|
|
3
|
+
(function($) {
|
|
4
|
+
"use strict";
|
|
5
|
+
|
|
6
|
+
$.fn.extend({
|
|
7
|
+
/*
|
|
8
|
+
button: function (action) {
|
|
9
|
+
console.log(action);
|
|
10
|
+
if (action === 'loading' && this.data('loading-text')) {
|
|
11
|
+
console.log('loading');
|
|
12
|
+
this.data('original-text', this.html()).html(this.data('loading-text')).prop('disabled', true);
|
|
13
|
+
}
|
|
14
|
+
if (action === 'reset' && this.data('original-text')) {
|
|
15
|
+
console.log('reset');
|
|
16
|
+
this.html(this.data('original-text')).prop('disabled', false);
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
buttonLoader: function (action) {
|
|
22
|
+
//console.log(action);
|
|
23
|
+
var self = $(this);
|
|
24
|
+
if (action === 'start' || action === 'loading') {
|
|
25
|
+
if ($(self).attr('disabled')) {
|
|
26
|
+
return self;
|
|
27
|
+
}
|
|
28
|
+
$(self).attr('disabled', true);
|
|
29
|
+
$(self).attr('data-btn-text', $(self).html());
|
|
30
|
+
//let text = '<span class="spinner"><i class=\'fa fa-circle-notch fa-spin\'></i></span>Traitement en cours…';
|
|
31
|
+
let text = '<i class=\'fa fa-circle-notch fa-spin\'></i> Traitement en cours…';
|
|
32
|
+
if ($(self).data('load-text') != undefined && $(self).data('load-text') != null && $(self).data('load-text') != '') {
|
|
33
|
+
text = $(self).data('load-text');
|
|
34
|
+
}
|
|
35
|
+
if ($(self).data('loading-text') != undefined && $(self).data('loading-text') != null && $(self).data('loading-text') != '') {
|
|
36
|
+
text = $(self).data('loading-text');
|
|
37
|
+
}
|
|
38
|
+
$(self).html(text);
|
|
39
|
+
$(self).addClass('disabled');
|
|
40
|
+
}
|
|
41
|
+
if (action === 'stop' || action === 'reset') {
|
|
42
|
+
$(self).html($(self).attr('data-btn-text'));
|
|
43
|
+
$(self).removeClass('disabled');
|
|
44
|
+
$(self).attr('disabled', false);
|
|
45
|
+
//$(self).removeAttr("disabled");
|
|
46
|
+
}
|
|
47
|
+
return self;
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}(jQuery));
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
|
|
2
|
+
class PersonName {
|
|
3
|
+
|
|
4
|
+
static format(firstName, lastName) {
|
|
5
|
+
var str = '';
|
|
6
|
+
if (firstName != null && firstName != '') {
|
|
7
|
+
str += ' '+firstName;
|
|
8
|
+
}
|
|
9
|
+
if (lastName != null && lastName != '') {
|
|
10
|
+
str += ' '+lastName;
|
|
11
|
+
}
|
|
12
|
+
return str.trim();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
static checkFirstName(firstName) {
|
|
16
|
+
if (firstName.length < 2 || firstName.length > 64) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
var regEx = /^([a-zA-Z'àâäéèêëìîïòôöùûüçÀÂÄÉÈÊËÌÎÏÒÔÖÙÛÜÇ\s-]+)$/;
|
|
21
|
+
if (regEx.exec(firstName) == null) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
static checkLastName(lastName) {
|
|
29
|
+
if (lastName.length < 2 || lastName.length > 64) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
var regEx = /^([a-zA-Z'àâäéèêëìîïòôöùûüçÀÂÄÉÈÊËÌÎÏÒÔÖÙÛÜÇ\s-]+)$/;
|
|
34
|
+
if (regEx.exec(lastName) == null) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
class Email {
|
|
43
|
+
static validateEmail(email) {
|
|
44
|
+
var re = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
|
45
|
+
return re.test(email);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
static checkEmail(email) {
|
|
49
|
+
var regExEmail = /^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,5}$/;
|
|
50
|
+
return (regExEmail.exec(email) != null);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
class TelephoneNumber {
|
|
55
|
+
//this class works with libphonenumber-max.min.js
|
|
56
|
+
|
|
57
|
+
static getCountryIsoCode(phoneNumber, localCountryIsoCode) {
|
|
58
|
+
localCountryIsoCode = (typeof localCountryIsoCode != 'undefined' ? localCountryIsoCode.toUpperCase() : serviceCountry);
|
|
59
|
+
return libphonenumber.parsePhoneNumber(phoneNumber, localCountryIsoCode).country || '';
|
|
60
|
+
}
|
|
61
|
+
static getCountryName(phoneNumber, localCountryIsoCode) {
|
|
62
|
+
return Country.getCountryName(this.getCountryIsoCode(phoneNumber, localCountryIsoCode));
|
|
63
|
+
}
|
|
64
|
+
static getFlagImg(phoneNumber, localCountryIsoCode) {
|
|
65
|
+
return Country.getFlagImg(this.getCountryIsoCode(phoneNumber, localCountryIsoCode));
|
|
66
|
+
}
|
|
67
|
+
static formatNational(phoneNumber, localCountryIsoCode) {
|
|
68
|
+
localCountryIsoCode = (typeof localCountryIsoCode != 'undefined' ? localCountryIsoCode.toUpperCase() : serviceCountry);
|
|
69
|
+
return libphonenumber.parsePhoneNumber(phoneNumber, localCountryIsoCode).formatNational();
|
|
70
|
+
}
|
|
71
|
+
static formatInternational(phoneNumber, localCountryIsoCode) {
|
|
72
|
+
localCountryIsoCode = (typeof localCountryIsoCode != 'undefined' ? localCountryIsoCode.toUpperCase() : serviceCountry);
|
|
73
|
+
return libphonenumber.parsePhoneNumber(phoneNumber, localCountryIsoCode).formatInternational();
|
|
74
|
+
}
|
|
75
|
+
static formatNationalWithFlagImg(phoneNumber, localCountryIsoCode) {
|
|
76
|
+
return TelephoneNumber.getFlagImg(phoneNumber, localCountryIsoCode)+' '+TelephoneNumber.formatNational(phoneNumber);
|
|
77
|
+
}
|
|
78
|
+
static formatNationalWithFlagImgAndTelLink(phoneNumber, localCountryIsoCode) {
|
|
79
|
+
return TelephoneNumber.getFlagImg(phoneNumber, localCountryIsoCode)+' <a href="tel:'+phoneNumber+'">'+TelephoneNumber.formatNational(phoneNumber)+'</a>';
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
static parse(phoneNumber, localCountryIsoCode) {
|
|
83
|
+
localCountryIsoCode = (typeof localCountryIsoCode != 'undefined' ? localCountryIsoCode.toUpperCase() : serviceCountry);
|
|
84
|
+
try {
|
|
85
|
+
const number = libphonenumber.parsePhoneNumber(phoneNumber, localCountryIsoCode);
|
|
86
|
+
return number != null ? number.formatInternational() : null;
|
|
87
|
+
} catch (error) {
|
|
88
|
+
console.log(error);
|
|
89
|
+
}
|
|
90
|
+
return '';
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
static check(phoneNumber, localCountryIsoCode) {
|
|
94
|
+
localCountryIsoCode = (typeof localCountryIsoCode != 'undefined' ? localCountryIsoCode.toUpperCase() : serviceCountry);
|
|
95
|
+
const number = libphonenumber.parsePhoneNumber(phoneNumber, localCountryIsoCode);
|
|
96
|
+
return number != null ? number.isValid() : false;
|
|
97
|
+
//var numberObject = libphonenumber.parse(phoneNumber, localCountryIsoCode);
|
|
98
|
+
//return (typeof numberObject.country !== 'undefined');
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
static checkSyntaxe(phoneNumber) {
|
|
102
|
+
var verifPhoneFr = /^(0)[1-9]{1}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}$/;
|
|
103
|
+
var verifPhoneInt = /^((\+)|(00))[1-9]{1}[0-9]{0,3}([ \.\-\/]?[0-9]{1}){4,20}$/;
|
|
104
|
+
// var verifPhoneInt = /^((\+)|(00))([ \.\-\/]?[0-9]{1}){6-20}$/;
|
|
105
|
+
//var verifPhone = /^[0-9+() .-]{6,32}$/;
|
|
106
|
+
if (verifPhoneFr.exec(phoneNumber) != null) {
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
if (verifPhoneInt.exec(phoneNumber) != null) {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
//console.log(verifPhoneInt);
|
|
113
|
+
// console.log('"'+phoneNumber+'" not valid');
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
static getType(phoneNumber, localCountryIsoCode) {
|
|
118
|
+
localCountryIsoCode = (typeof localCountryIsoCode != 'undefined' ? localCountryIsoCode.toUpperCase() : serviceCountry);
|
|
119
|
+
|
|
120
|
+
if (phoneNumber == null || phoneNumber.length === 0) {
|
|
121
|
+
return 'MASKED';
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
let number = libphonenumber.parsePhoneNumber(phoneNumber, localCountryIsoCode);
|
|
125
|
+
return number != null ? number.getType() : null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
static getTypeLabelList() {
|
|
129
|
+
return {
|
|
130
|
+
FIXED_LINE: 'Fixe',
|
|
131
|
+
MOBILE: 'Mobile',
|
|
132
|
+
FIXED_LINE_OR_MOBILE: 'Fixe ou Mobile',
|
|
133
|
+
TOLL_FREE: 'Vert',
|
|
134
|
+
PREMIUM_RATE: 'Surtaxé',
|
|
135
|
+
SHARED_COST: 'Coût partagé',
|
|
136
|
+
VOIP: 'VOIP',
|
|
137
|
+
PERSONAL_NUMBER: 'Personnel',
|
|
138
|
+
PAGER: 'Pager',
|
|
139
|
+
UAN: 'UAN',
|
|
140
|
+
UNKNOWN: 'Inconnu',
|
|
141
|
+
MASKED: 'Masqué',
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
static getTypeLabel(phoneNumberType) {
|
|
146
|
+
return TelephoneNumber.getTypeLabelList()[phoneNumberType] || 'Inconnu';
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
static setIntlTelInput(input, placeholderNumberType) {
|
|
150
|
+
return window.intlTelInput(input[0], {
|
|
151
|
+
initialCountry: serviceCountry,
|
|
152
|
+
placeholderNumberType: placeholderNumberType || 'FIXED_LINE_OR_MOBILE',
|
|
153
|
+
utilsScript: intlTelInputUtilsPath
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
static getEnteredNumberInInternationalFormat(intlTelInput) {
|
|
158
|
+
return intlTelInput.getNumber(intlTelInputUtils.numberFormat.E164);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
static formatNumberFromIntlTelInput(intlTelInput) {
|
|
162
|
+
var number = intlTelInput.getNumber();
|
|
163
|
+
if (number != '' && number.substr(0, 1) !== '+') {
|
|
164
|
+
number = '+' + intlTelInput.getSelectedCountryData().dialCode + number;
|
|
165
|
+
}
|
|
166
|
+
return number;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
exports.PersonName = PersonName;
|
|
171
|
+
exports.Email = Email;
|
|
172
|
+
exports.TelephoneNumber = TelephoneNumber;
|
package/count_down.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
class CountDown {
|
|
2
|
+
|
|
3
|
+
constructor(div, callbackOnRefreshData) {
|
|
4
|
+
// console.log('constructor');
|
|
5
|
+
if (!div.length) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
div
|
|
10
|
+
.append('<div class="count_down_title">'+labelNextUpdate+'</div>')
|
|
11
|
+
.append('<div class="count_down_progress"><div class="count_down_current"></div></div>')
|
|
12
|
+
.append('<div class="count_down_text"></div>')
|
|
13
|
+
//.append('<div class="cl"></div>')
|
|
14
|
+
.append('<div class="count_down_link"><a href="#" data-loading-text="<i class=\'fa fa-circle-notch fa-spin\'></i>">'+labelDoUpdate+'</a></div>')
|
|
15
|
+
;
|
|
16
|
+
|
|
17
|
+
this.div = div;
|
|
18
|
+
this.callbackOnRefreshData = callbackOnRefreshData;
|
|
19
|
+
|
|
20
|
+
this.alreadyMakingRequest = false;
|
|
21
|
+
this.secondsBefRefresh = 10;
|
|
22
|
+
this.refreshIntervalMillis = 60;
|
|
23
|
+
this.currentMillis = 0;
|
|
24
|
+
this.currentSecond = 0;
|
|
25
|
+
|
|
26
|
+
if (div.find('.count_down_link a').length) {
|
|
27
|
+
div.find('.count_down_link a').click(() => {
|
|
28
|
+
this.refreshData();
|
|
29
|
+
return false;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
setInterval(() => {
|
|
34
|
+
if (!div.find('.count_down_link a').length || !div.find('.count_down_link a').prop('disabled')) {
|
|
35
|
+
this.currentMillis += this.refreshIntervalMillis;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
this.currentMillis = 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
this.currentSecond = parseInt(this.currentMillis / 1000);
|
|
42
|
+
|
|
43
|
+
//countDownRefresh();
|
|
44
|
+
var divCountDownText;
|
|
45
|
+
var divCountDownCurrentSizePx;
|
|
46
|
+
|
|
47
|
+
if (this.currentSecond >= this.secondsBefRefresh) {
|
|
48
|
+
divCountDownCurrentSizePx = 120;
|
|
49
|
+
divCountDownText = '0s';
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
divCountDownCurrentSizePx = Math.round((120/(this.secondsBefRefresh*1000)) * this.currentMillis);
|
|
53
|
+
divCountDownText = (this.secondsBefRefresh-this.currentSecond) + 's';
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (div.find('.count_down_current').length) {
|
|
57
|
+
div.find('.count_down_current').width(divCountDownCurrentSizePx);
|
|
58
|
+
}
|
|
59
|
+
if (div.find('.count_down_text').length) {
|
|
60
|
+
div.find('.count_down_text').html(divCountDownText);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (this.currentSecond >= this.secondsBefRefresh) {
|
|
64
|
+
this.currentMillis = 0;
|
|
65
|
+
setTimeout(() => {
|
|
66
|
+
this.refreshData();
|
|
67
|
+
}, 100);
|
|
68
|
+
}
|
|
69
|
+
}, this.refreshIntervalMillis);
|
|
70
|
+
|
|
71
|
+
this.refreshData();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
setCallbackOnRefreshData(callback) {
|
|
75
|
+
this.callbackOnRefreshData = callback;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
refreshData() {
|
|
79
|
+
this.currentMillis = 0;
|
|
80
|
+
|
|
81
|
+
//Pour ne pas relancer une requête si la précédente n'est pas encore finie
|
|
82
|
+
if (true === this.alreadyMakingRequest) {
|
|
83
|
+
console.log('Already making request, no new request lauched.');
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (typeof this.callbackOnRefreshData == 'function') {
|
|
88
|
+
CountDown.alreadyMakingRequest = true;
|
|
89
|
+
this.div.find('.count_down_link a').attr('disabled', true).button('loading');
|
|
90
|
+
|
|
91
|
+
this.callbackOnRefreshData(
|
|
92
|
+
// completeCallback
|
|
93
|
+
() => {
|
|
94
|
+
this.alreadyMakingRequest = false;
|
|
95
|
+
this.div.find('.count_down_link a').attr('disabled', false).button('reset');
|
|
96
|
+
}
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
exports.CountDown = CountDown;
|