mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-22 23:05:15 +00:00
1080 lines
11 KiB
Go
1080 lines
11 KiB
Go
package indicator
|
|
|
|
import (
|
|
"encoding/json"
|
|
"math"
|
|
"testing"
|
|
|
|
"github.com/c9s/bbgo/pkg/fixedpoint"
|
|
"github.com/c9s/bbgo/pkg/types"
|
|
)
|
|
|
|
// generated from:
|
|
// 2020/12/05 10:25
|
|
// curl -s 'https://www.binance.com/api/v3/klines?symbol=ETHUSDT&interval=5m&endTime=1607135400000&limit=1000' | jq '. | map({ closePrice: (.[4] | tonumber), openTime: .[0] })'
|
|
// curl -s 'https://www.binance.com/api/v3/klines?symbol=ETHUSDT&interval=5m&endTime=1607135400000&limit=1000' | jq '. | map(.[4] | tonumber)'
|
|
var ethusdt5m = []byte(`[
|
|
614.36,
|
|
613.62,
|
|
611.68,
|
|
614.7,
|
|
607.69,
|
|
606.82,
|
|
602.91,
|
|
606.35,
|
|
606.04,
|
|
603.94,
|
|
607.37,
|
|
599.72,
|
|
597.77,
|
|
594.36,
|
|
595.18,
|
|
592.65,
|
|
595.44,
|
|
595.08,
|
|
595.82,
|
|
596.31,
|
|
592.47,
|
|
594.19,
|
|
590.71,
|
|
586.77,
|
|
589.74,
|
|
592.33,
|
|
593.44,
|
|
594.34,
|
|
593.89,
|
|
594,
|
|
590.81,
|
|
595.51,
|
|
594.08,
|
|
596.58,
|
|
592.97,
|
|
593.3,
|
|
590.89,
|
|
591.9,
|
|
589.67,
|
|
590.25,
|
|
592.53,
|
|
594.01,
|
|
591.46,
|
|
588.5,
|
|
591.34,
|
|
589.24,
|
|
592,
|
|
594.57,
|
|
593.98,
|
|
593.93,
|
|
593.46,
|
|
594.22,
|
|
595.57,
|
|
595.81,
|
|
595.44,
|
|
599.65,
|
|
600.3,
|
|
599.5,
|
|
601,
|
|
598.24,
|
|
596.56,
|
|
596.55,
|
|
595.61,
|
|
596.91,
|
|
593.49,
|
|
592.03,
|
|
592.56,
|
|
592.95,
|
|
593.56,
|
|
593.78,
|
|
594.69,
|
|
594.17,
|
|
595.62,
|
|
596.06,
|
|
595.83,
|
|
598.51,
|
|
598.29,
|
|
596.94,
|
|
597.87,
|
|
598.02,
|
|
595.13,
|
|
594.87,
|
|
597,
|
|
599.89,
|
|
599.49,
|
|
599.32,
|
|
598.82,
|
|
597.26,
|
|
597.46,
|
|
593.32,
|
|
592.69,
|
|
589.42,
|
|
590.39,
|
|
589.91,
|
|
586.83,
|
|
586.53,
|
|
588.85,
|
|
589.44,
|
|
584.95,
|
|
584.06,
|
|
588.99,
|
|
588.75,
|
|
588.62,
|
|
589.61,
|
|
589.27,
|
|
585.26,
|
|
582.06,
|
|
577.06,
|
|
583.13,
|
|
588.01,
|
|
589.25,
|
|
589.42,
|
|
591.03,
|
|
590.99,
|
|
592.33,
|
|
593.86,
|
|
592.12,
|
|
593.21,
|
|
592.4,
|
|
590.86,
|
|
590.1,
|
|
592.32,
|
|
590.79,
|
|
592.01,
|
|
592.07,
|
|
596.66,
|
|
595.63,
|
|
595.76,
|
|
594.8,
|
|
594.21,
|
|
592.58,
|
|
592.19,
|
|
592.6,
|
|
591.29,
|
|
591.89,
|
|
590.03,
|
|
590.33,
|
|
588.53,
|
|
589.26,
|
|
587.18,
|
|
589.03,
|
|
587.49,
|
|
590.83,
|
|
590.63,
|
|
587.13,
|
|
584.86,
|
|
584.86,
|
|
584,
|
|
587.95,
|
|
589.48,
|
|
589.31,
|
|
586.96,
|
|
584.29,
|
|
585.68,
|
|
587.57,
|
|
582.19,
|
|
580.7,
|
|
580.01,
|
|
580.83,
|
|
578.84,
|
|
578.97,
|
|
582.23,
|
|
581.45,
|
|
582,
|
|
582.69,
|
|
582.68,
|
|
581.54,
|
|
581.32,
|
|
584.95,
|
|
582.57,
|
|
580.75,
|
|
579.58,
|
|
580.13,
|
|
582.42,
|
|
582.85,
|
|
585.5,
|
|
584.87,
|
|
586.1,
|
|
585.39,
|
|
587.32,
|
|
587.83,
|
|
590.11,
|
|
589.84,
|
|
589.78,
|
|
592.13,
|
|
590.5,
|
|
589.54,
|
|
589.01,
|
|
590.7,
|
|
592.73,
|
|
593.54,
|
|
591.56,
|
|
591.32,
|
|
590.49,
|
|
590.64,
|
|
591.43,
|
|
591.94,
|
|
593.12,
|
|
593.97,
|
|
595.47,
|
|
596.23,
|
|
597.63,
|
|
595.06,
|
|
595,
|
|
594.88,
|
|
597.61,
|
|
596.67,
|
|
600.23,
|
|
599.22,
|
|
596.36,
|
|
597.75,
|
|
596.34,
|
|
596.05,
|
|
595.9,
|
|
595.8,
|
|
596.33,
|
|
597.31,
|
|
598.82,
|
|
603.56,
|
|
602.33,
|
|
599.58,
|
|
598.7,
|
|
598.41,
|
|
596.14,
|
|
596.21,
|
|
595.13,
|
|
596.47,
|
|
595.81,
|
|
594.36,
|
|
595.78,
|
|
594.66,
|
|
596,
|
|
597.95,
|
|
597.77,
|
|
597.57,
|
|
598.43,
|
|
597.99,
|
|
598.4,
|
|
600.05,
|
|
597.81,
|
|
596.52,
|
|
597.04,
|
|
598.86,
|
|
600.16,
|
|
601.05,
|
|
600.3,
|
|
599.6,
|
|
597.42,
|
|
598.49,
|
|
598.62,
|
|
589.69,
|
|
591.62,
|
|
592.73,
|
|
593.15,
|
|
593.62,
|
|
593.77,
|
|
592.34,
|
|
592.54,
|
|
588.71,
|
|
591.31,
|
|
593.5,
|
|
593.36,
|
|
593.49,
|
|
593.63,
|
|
593.62,
|
|
593.37,
|
|
596.52,
|
|
597.04,
|
|
597.59,
|
|
596.94,
|
|
596.09,
|
|
595.51,
|
|
595.13,
|
|
593.1,
|
|
594.48,
|
|
594.61,
|
|
596.8,
|
|
595.36,
|
|
593.32,
|
|
593.58,
|
|
593,
|
|
591.84,
|
|
590.61,
|
|
592.27,
|
|
591.81,
|
|
590.27,
|
|
587.59,
|
|
587.96,
|
|
591.07,
|
|
591.86,
|
|
589.61,
|
|
588.16,
|
|
588.08,
|
|
585.46,
|
|
586.69,
|
|
588.21,
|
|
588.7,
|
|
589.51,
|
|
585.28,
|
|
586.27,
|
|
589.88,
|
|
590.97,
|
|
590.92,
|
|
590.7,
|
|
590.09,
|
|
589.38,
|
|
588.51,
|
|
586.69,
|
|
585.33,
|
|
584.32,
|
|
585.42,
|
|
586.3,
|
|
586.08,
|
|
587.32,
|
|
587.55,
|
|
587.31,
|
|
587.07,
|
|
587.57,
|
|
587.44,
|
|
588.56,
|
|
588.91,
|
|
589.13,
|
|
591.17,
|
|
594.2,
|
|
593.36,
|
|
595.75,
|
|
596.29,
|
|
596.78,
|
|
596.82,
|
|
596.39,
|
|
596.31,
|
|
595.77,
|
|
595.95,
|
|
594.09,
|
|
596.86,
|
|
595.64,
|
|
595.41,
|
|
592.67,
|
|
594,
|
|
594.42,
|
|
594.92,
|
|
595,
|
|
596.46,
|
|
596.5,
|
|
596.98,
|
|
596.57,
|
|
599.27,
|
|
596.93,
|
|
596.47,
|
|
596.59,
|
|
595.8,
|
|
596.01,
|
|
596.38,
|
|
598.19,
|
|
598.72,
|
|
598.13,
|
|
596.83,
|
|
596.36,
|
|
597.12,
|
|
597.95,
|
|
596.02,
|
|
596,
|
|
596.33,
|
|
594.97,
|
|
595.82,
|
|
596.58,
|
|
596.37,
|
|
597.88,
|
|
598.5,
|
|
598.06,
|
|
599.71,
|
|
599.97,
|
|
600.7,
|
|
601.44,
|
|
599.72,
|
|
597.62,
|
|
597.24,
|
|
597.7,
|
|
597.67,
|
|
599.85,
|
|
599.43,
|
|
596.28,
|
|
596.21,
|
|
597.68,
|
|
597.75,
|
|
597.35,
|
|
598.18,
|
|
598.39,
|
|
598.54,
|
|
599.73,
|
|
600.1,
|
|
598.7,
|
|
597.96,
|
|
596.89,
|
|
598.8,
|
|
599.57,
|
|
598.4,
|
|
598.12,
|
|
597.39,
|
|
597.64,
|
|
594.69,
|
|
595.61,
|
|
595.82,
|
|
595.97,
|
|
596.71,
|
|
596,
|
|
592.87,
|
|
592.94,
|
|
591.5,
|
|
591.81,
|
|
592.02,
|
|
593.01,
|
|
591.34,
|
|
590.34,
|
|
590.27,
|
|
591.48,
|
|
591.92,
|
|
591.87,
|
|
592.07,
|
|
592.43,
|
|
592.79,
|
|
592.25,
|
|
591.28,
|
|
591.18,
|
|
592,
|
|
592.73,
|
|
593.61,
|
|
592.93,
|
|
592.61,
|
|
592.68,
|
|
593.84,
|
|
594.28,
|
|
595.41,
|
|
595.17,
|
|
594.8,
|
|
594.67,
|
|
595.99,
|
|
596.16,
|
|
597.58,
|
|
596.63,
|
|
596.06,
|
|
595.24,
|
|
595.17,
|
|
595.69,
|
|
596.51,
|
|
596.5,
|
|
595.56,
|
|
594.47,
|
|
593.49,
|
|
593.47,
|
|
593.81,
|
|
593.93,
|
|
594,
|
|
592.85,
|
|
593.04,
|
|
593.88,
|
|
593.78,
|
|
593.16,
|
|
594.9,
|
|
594.99,
|
|
593.91,
|
|
591.28,
|
|
588.23,
|
|
589.01,
|
|
589.12,
|
|
588.28,
|
|
589.36,
|
|
589.94,
|
|
589.6,
|
|
589.77,
|
|
590.36,
|
|
590.85,
|
|
590.18,
|
|
590.01,
|
|
590.77,
|
|
589.97,
|
|
590.78,
|
|
590.99,
|
|
588.95,
|
|
588.9,
|
|
588.02,
|
|
590.51,
|
|
592.01,
|
|
591.8,
|
|
596.14,
|
|
595.68,
|
|
595.72,
|
|
598.47,
|
|
598.1,
|
|
598.47,
|
|
597.27,
|
|
595.94,
|
|
596.43,
|
|
602.8,
|
|
607.08,
|
|
606.03,
|
|
605.98,
|
|
603.91,
|
|
604.5,
|
|
604.19,
|
|
604.98,
|
|
605.25,
|
|
606.41,
|
|
599.67,
|
|
601.87,
|
|
603.85,
|
|
603.18,
|
|
602.31,
|
|
602.5,
|
|
603.02,
|
|
603.84,
|
|
605.19,
|
|
605.29,
|
|
606.56,
|
|
605.54,
|
|
605.36,
|
|
605.11,
|
|
609.64,
|
|
608.82,
|
|
610.79,
|
|
609.74,
|
|
612.51,
|
|
614.67,
|
|
614.8,
|
|
613.42,
|
|
612.79,
|
|
614.4,
|
|
610.96,
|
|
610.57,
|
|
612.19,
|
|
613.22,
|
|
614.24,
|
|
612.67,
|
|
612.4,
|
|
611.6,
|
|
610.69,
|
|
611.5,
|
|
613.6,
|
|
610.99,
|
|
611.22,
|
|
610.54,
|
|
607.53,
|
|
608.7,
|
|
608.98,
|
|
608.4,
|
|
608.72,
|
|
609.35,
|
|
609.84,
|
|
608.5,
|
|
609.27,
|
|
611.71,
|
|
610.67,
|
|
611.18,
|
|
610.87,
|
|
612.38,
|
|
611.53,
|
|
610.7,
|
|
610.08,
|
|
609,
|
|
609.51,
|
|
608.16,
|
|
609.17,
|
|
611.02,
|
|
612.63,
|
|
612.25,
|
|
612.71,
|
|
613.27,
|
|
612.47,
|
|
611.12,
|
|
611.34,
|
|
611.14,
|
|
610.58,
|
|
610.01,
|
|
610.64,
|
|
610.07,
|
|
609.73,
|
|
610.85,
|
|
611.75,
|
|
612.76,
|
|
612.51,
|
|
613.12,
|
|
613.03,
|
|
614.49,
|
|
615.24,
|
|
617.37,
|
|
618.92,
|
|
621.61,
|
|
618.66,
|
|
608.37,
|
|
609.37,
|
|
612.48,
|
|
614.14,
|
|
616.23,
|
|
615.57,
|
|
615.53,
|
|
613.25,
|
|
614.73,
|
|
614.2,
|
|
615.19,
|
|
612.99,
|
|
609.91,
|
|
610.28,
|
|
611.5,
|
|
612.55,
|
|
613.21,
|
|
612.74,
|
|
611.8,
|
|
612.18,
|
|
612.2,
|
|
612.56,
|
|
614.05,
|
|
614.67,
|
|
614.45,
|
|
614.46,
|
|
614.16,
|
|
614.22,
|
|
615.62,
|
|
614.73,
|
|
614.56,
|
|
613.89,
|
|
613.38,
|
|
614.12,
|
|
612.24,
|
|
612.39,
|
|
611.83,
|
|
611.83,
|
|
611.24,
|
|
611.62,
|
|
611.44,
|
|
612.21,
|
|
612.12,
|
|
613.14,
|
|
613.53,
|
|
613.76,
|
|
613.38,
|
|
612.76,
|
|
613.31,
|
|
613.19,
|
|
613.71,
|
|
613.89,
|
|
613.52,
|
|
612.32,
|
|
611.39,
|
|
610.82,
|
|
611.03,
|
|
611.33,
|
|
611.52,
|
|
612.69,
|
|
612.63,
|
|
612.9,
|
|
613.25,
|
|
612.92,
|
|
613.35,
|
|
614.23,
|
|
614.66,
|
|
615.71,
|
|
615.39,
|
|
614.95,
|
|
614.74,
|
|
614.84,
|
|
615.27,
|
|
615.41,
|
|
615.74,
|
|
615.99,
|
|
615.22,
|
|
615.22,
|
|
614.99,
|
|
614.43,
|
|
614.7,
|
|
616.13,
|
|
616.78,
|
|
618.41,
|
|
618.35,
|
|
618.02,
|
|
615.89,
|
|
616.52,
|
|
617.12,
|
|
617.46,
|
|
616.88,
|
|
616.67,
|
|
616.9,
|
|
615.85,
|
|
614.86,
|
|
614.16,
|
|
614.95,
|
|
615.19,
|
|
615.17,
|
|
615.61,
|
|
617.79,
|
|
619.39,
|
|
618.27,
|
|
618.25,
|
|
617.81,
|
|
617.36,
|
|
617.22,
|
|
614.3,
|
|
613.67,
|
|
613.7,
|
|
613.79,
|
|
614.07,
|
|
612.17,
|
|
613.29,
|
|
612.94,
|
|
612.8,
|
|
613.1,
|
|
611.32,
|
|
612.93,
|
|
612.42,
|
|
611.86,
|
|
611.16,
|
|
609.93,
|
|
610.95,
|
|
610.16,
|
|
603.83,
|
|
606.02,
|
|
606.72,
|
|
604.39,
|
|
604.26,
|
|
607,
|
|
606.84,
|
|
607.84,
|
|
607.8,
|
|
605.64,
|
|
604.26,
|
|
605.22,
|
|
605.08,
|
|
606.01,
|
|
605.48,
|
|
604.73,
|
|
602.64,
|
|
604.64,
|
|
605.7,
|
|
605.58,
|
|
605.68,
|
|
606.05,
|
|
606.2,
|
|
606.62,
|
|
606.16,
|
|
607.36,
|
|
606.38,
|
|
605.48,
|
|
606.12,
|
|
607.16,
|
|
607.51,
|
|
607.4,
|
|
607.27,
|
|
606.66,
|
|
607.21,
|
|
606.1,
|
|
606.66,
|
|
605.73,
|
|
605.29,
|
|
603.52,
|
|
603.46,
|
|
604.73,
|
|
605.57,
|
|
606.04,
|
|
606.05,
|
|
607.02,
|
|
608.31,
|
|
607.69,
|
|
607.68,
|
|
607.45,
|
|
607.36,
|
|
607.18,
|
|
606.89,
|
|
605.9,
|
|
605.03,
|
|
604.85,
|
|
604.16,
|
|
604.49,
|
|
604.43,
|
|
604.94,
|
|
606.74,
|
|
606.51,
|
|
606.44,
|
|
605.03,
|
|
604.28,
|
|
606.71,
|
|
608.23,
|
|
609.64,
|
|
611.5,
|
|
611.6,
|
|
612.57,
|
|
611.81,
|
|
612.12,
|
|
611.87,
|
|
610.47,
|
|
611.22,
|
|
610.86,
|
|
609.75,
|
|
609.76,
|
|
609.06,
|
|
609.52,
|
|
607.76,
|
|
608.81,
|
|
609.2,
|
|
608.17,
|
|
607.88,
|
|
608.37,
|
|
609.27,
|
|
608.69,
|
|
608.33,
|
|
603.37,
|
|
600.33,
|
|
592.31,
|
|
592.43,
|
|
592.5,
|
|
591.56,
|
|
592.21,
|
|
594.3,
|
|
594.29,
|
|
593.4,
|
|
593.25,
|
|
594.53,
|
|
594.85,
|
|
597.23,
|
|
596.2,
|
|
595.5,
|
|
593.74,
|
|
591.08,
|
|
594.12,
|
|
595,
|
|
591.83,
|
|
590.93,
|
|
585.57,
|
|
588.02,
|
|
587.75,
|
|
584.22,
|
|
583.38,
|
|
586.86,
|
|
587.51,
|
|
589.39,
|
|
589.98,
|
|
591.01,
|
|
590.7,
|
|
591.73,
|
|
592.09,
|
|
590.98,
|
|
591.22,
|
|
591.04,
|
|
590.08,
|
|
588.41,
|
|
590.28,
|
|
590.95,
|
|
589.63,
|
|
591.09,
|
|
591.04,
|
|
590.03,
|
|
590.92,
|
|
589.92,
|
|
589.77,
|
|
587.7,
|
|
589.1,
|
|
591.42,
|
|
595.3,
|
|
594.44,
|
|
593.91,
|
|
593.85,
|
|
593.08,
|
|
592.17,
|
|
591.94,
|
|
592.46,
|
|
591.24,
|
|
590.66,
|
|
590.42,
|
|
590.24,
|
|
589.58,
|
|
589.38,
|
|
590.48,
|
|
590,
|
|
589.55,
|
|
589.3,
|
|
586.89,
|
|
584.95,
|
|
588.32,
|
|
583.45,
|
|
586.51,
|
|
586.6,
|
|
586.03,
|
|
584.14,
|
|
583.92,
|
|
585.94,
|
|
584.76,
|
|
587.6,
|
|
588.47,
|
|
589.39,
|
|
588.17,
|
|
588.99,
|
|
588.52,
|
|
589.23,
|
|
589.61,
|
|
590.62,
|
|
589.68,
|
|
589.88,
|
|
590.22,
|
|
589.78,
|
|
589.34,
|
|
588.11,
|
|
588.63,
|
|
588.27,
|
|
588.8,
|
|
587.96,
|
|
589.45,
|
|
589.99,
|
|
591,
|
|
590.82,
|
|
591.62,
|
|
591.17,
|
|
591.14,
|
|
590.68,
|
|
590.78,
|
|
591.87,
|
|
591.02,
|
|
590.61,
|
|
589.85,
|
|
589.66,
|
|
589.83,
|
|
591.09,
|
|
589.6,
|
|
590.89,
|
|
590.83,
|
|
589.29,
|
|
588.84,
|
|
588.51,
|
|
588.56,
|
|
588.26,
|
|
588.83,
|
|
587.95,
|
|
587.32,
|
|
588.3,
|
|
588.96,
|
|
588.54,
|
|
588.87,
|
|
589.12,
|
|
589.01,
|
|
587.54,
|
|
585.49,
|
|
584.81,
|
|
584.11,
|
|
584.77,
|
|
584.68,
|
|
585.07,
|
|
582.69,
|
|
580.38,
|
|
580.83,
|
|
580.53,
|
|
577.67,
|
|
582.09,
|
|
579.3,
|
|
578.17,
|
|
575.88,
|
|
576.2,
|
|
577.53,
|
|
572.94,
|
|
572.63,
|
|
570.55,
|
|
569.16,
|
|
573.56,
|
|
573.78,
|
|
574.3,
|
|
574.69,
|
|
575.85,
|
|
575.59,
|
|
574.36,
|
|
571.4,
|
|
571.9,
|
|
569.9,
|
|
571.62,
|
|
567.24,
|
|
563.9,
|
|
564.1,
|
|
565.2,
|
|
567.49,
|
|
567.81,
|
|
568.34,
|
|
570.68,
|
|
571.31,
|
|
570.79,
|
|
571.36,
|
|
572.66,
|
|
571.79,
|
|
570.58,
|
|
570.63,
|
|
572.96,
|
|
572.04,
|
|
571.64,
|
|
570.91,
|
|
570.17,
|
|
570.94,
|
|
572.12,
|
|
572.18,
|
|
569.6,
|
|
567.31,
|
|
568.21,
|
|
570.32,
|
|
572.85,
|
|
572.21,
|
|
572.63,
|
|
572.74
|
|
]`)
|
|
|
|
func buildKLines(prices []fixedpoint.Value) (klines []types.KLine) {
|
|
for _, p := range prices {
|
|
klines = append(klines, types.KLine{Close: p})
|
|
}
|
|
|
|
return klines
|
|
}
|
|
|
|
func Test_calculateEWMA(t *testing.T) {
|
|
type args struct {
|
|
allKLines []types.KLine
|
|
priceF types.KLineValueMapper
|
|
window int
|
|
}
|
|
var input []fixedpoint.Value
|
|
if err := json.Unmarshal(ethusdt5m, &input); err != nil {
|
|
panic(err)
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
want float64
|
|
}{
|
|
{
|
|
name: "ETHUSDT EMA 7",
|
|
args: args{
|
|
allKLines: buildKLines(input),
|
|
priceF: types.KLineClosePriceMapper,
|
|
window: 7,
|
|
},
|
|
want: 571.72, // with open price, binance desktop returns 571.45, trading view returns 570.8957, for close price, binance mobile returns 571.72
|
|
},
|
|
{
|
|
name: "ETHUSDT EMA 25",
|
|
args: args{
|
|
allKLines: buildKLines(input),
|
|
priceF: types.KLineClosePriceMapper,
|
|
window: 25,
|
|
},
|
|
want: 571.30,
|
|
},
|
|
{
|
|
name: "ETHUSDT EMA 99",
|
|
args: args{
|
|
allKLines: buildKLines(input),
|
|
priceF: types.KLineClosePriceMapper,
|
|
window: 99,
|
|
},
|
|
want: 577.62, // binance mobile uses 577.58
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got := CalculateKLinesEMA(tt.args.allKLines, tt.args.priceF, tt.args.window)
|
|
got = math.Trunc(got*100.0) / 100.0
|
|
if got != tt.want {
|
|
t.Errorf("CalculateKLinesEMA() = %v, want %v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|