From 71cb9f3ac675feb0d88b6b7d9e10709f13e33ad0 Mon Sep 17 00:00:00 2001 From: Chengxun Lee <24319042+bclswl0827@users.noreply.github.com> Date: Tue, 26 Sep 2023 13:41:46 +0800 Subject: [PATCH] Prepare for compensation, fix velocity unit --- .github/workflows/release.yml | 2 +- VERSION | 2 +- app/station/geophone.go | 6 ++--- build/assets/config.json | 26 ++++++++++++++----- config/types.go | 12 ++++++--- feature/geophone/callbacks.go | 4 +-- feature/geophone/daemon.go | 11 +++++++- feature/geophone/filter.go | 25 ++++++++++++++++++ feature/geophone/read.go | 14 ++++------ feature/geophone/size.go | 6 +++++ feature/geophone/types.go | 15 +++++++++++ frontend/dist/asset-manifest.json | 4 +-- frontend/dist/i18n/en-US.json | 6 ++--- frontend/dist/i18n/zh-CN.json | 6 ++--- frontend/dist/i18n/zh-TW.json | 6 ++--- frontend/dist/index.html | 2 +- .../js/{main.8eb19dec.js => main.373d84f0.js} | 4 +-- ...CENSE.txt => main.373d84f0.js.LICENSE.txt} | 0 frontend/src/.env | 4 +-- frontend/src/public/i18n/en-US.json | 6 ++--- frontend/src/public/i18n/zh-CN.json | 6 ++--- frontend/src/public/i18n/zh-TW.json | 6 ++--- 22 files changed, 121 insertions(+), 52 deletions(-) create mode 100644 feature/geophone/filter.go create mode 100644 feature/geophone/size.go rename frontend/dist/static/js/{main.8eb19dec.js => main.373d84f0.js} (99%) rename frontend/dist/static/js/{main.8eb19dec.js.LICENSE.txt => main.373d84f0.js.LICENSE.txt} (100%) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bea7a034..bd1ef2cb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,7 +2,7 @@ name: Publish release on: push: - tags: + branches: - master workflow_dispatch: diff --git a/VERSION b/VERSION index 04007c9a..83b3384b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v2.1.5p +v2.1.6p diff --git a/app/station/geophone.go b/app/station/geophone.go index 89ecf1cd..1acc20fa 100644 --- a/app/station/geophone.go +++ b/app/station/geophone.go @@ -4,8 +4,8 @@ import "github.com/bclswl0827/observer/config" func getGeophone(conf *config.Conf) Geophone { return Geophone{ - EHZ: conf.Geophone.EHZ, - EHE: conf.Geophone.EHE, - EHN: conf.Geophone.EHN, + EHZ: conf.Geophone.EHZ.Sensitivity, + EHE: conf.Geophone.EHE.Sensitivity, + EHN: conf.Geophone.EHN.Sensitivity, } } diff --git a/build/assets/config.json b/build/assets/config.json index 34f91343..cd497f4e 100644 --- a/build/assets/config.json +++ b/build/assets/config.json @@ -6,19 +6,31 @@ "longitude": 1.0, "altitude": 0 }, + "geophone_settings": { + "ehz": { + "sensitivity": 0.288, + "damping": 0.6, + "frequency": 4.5 + }, + "ehe": { + "sensitivity": 0.288, + "damping": 0.6, + "frequency": 4.5 + }, + "ehn": { + "sensitivity": 0.288, + "damping": 0.6, + "frequency": 4.5 + } + }, "adc_settings": { "resolution": 24, "fullscale": 5.0 }, "serial_settings": { - "packet": 2, + "packet": 4, "baud": 19200, - "device": "/dev/ttyUSB0" - }, - "geophone_settings": { - "ehz": 0.288, - "ehe": 0.288, - "ehn": 0.288 + "device": "/dev/ttyS4" }, "ntpclient_settings": { "host": "0.pool.ntp.org", diff --git a/config/types.go b/config/types.go index 5e7d29ea..0c35b874 100644 --- a/config/types.go +++ b/config/types.go @@ -19,10 +19,16 @@ type adc struct { Resolution int `json:"resolution"` } +type channel struct { + Damping float64 `json:"damping"` + Frequency float64 `json:"frequency"` + Sensitivity float64 `json:"sensitivity"` +} + type geophone struct { - EHZ float64 `json:"ehz"` - EHE float64 `json:"ehe"` - EHN float64 `json:"ehn"` + EHZ channel `json:"ehz"` + EHE channel `json:"ehe"` + EHN channel `json:"ehn"` } type ntpclient struct { diff --git a/feature/geophone/callbacks.go b/feature/geophone/callbacks.go index 8f097b90..ae124ed8 100644 --- a/feature/geophone/callbacks.go +++ b/feature/geophone/callbacks.go @@ -18,7 +18,7 @@ func (g *Geophone) OnStop(options *feature.FeatureOptions, v ...any) { logger.Print(MODULE, text.Concat(v...), color.FgBlue) } -func (a *Geophone) OnReady(options *feature.FeatureOptions, v ...any) { +func (g *Geophone) OnReady(options *feature.FeatureOptions, v ...any) { if options.Status.IsReady { var ( packet = v[0].(Packet) @@ -39,12 +39,12 @@ func (a *Geophone) OnReady(options *feature.FeatureOptions, v ...any) { // Set packet timestamp options.Status.System.Messages++ options.Status.Buffer.TS = currentTime.UnixMilli() - logger.Print(MODULE, "1 full packet received", color.FgGreen) // Copy buffer and reset options.Status.Geophone = *options.Status.Buffer options.Status.Buffer.EHZ = []int32{} options.Status.Buffer.EHE = []int32{} options.Status.Buffer.EHN = []int32{} + logger.Print(MODULE, "1 full packet received", color.FgGreen) } } else { logger.Print(MODULE, "waiting for time alignment", color.FgYellow) diff --git a/feature/geophone/daemon.go b/feature/geophone/daemon.go index 4b8d0ad1..bd816b1c 100644 --- a/feature/geophone/daemon.go +++ b/feature/geophone/daemon.go @@ -12,6 +12,9 @@ import ( func (g *Geophone) Start(options *feature.FeatureOptions) { var ( + ehz = options.Config.Geophone.EHZ + ehe = options.Config.Geophone.EHE + ehn = options.Config.Geophone.EHN device = options.Config.Serial.Device baud = options.Config.Serial.Baud packetLen = options.Config.Serial.Packet @@ -24,12 +27,18 @@ func (g *Geophone) Start(options *feature.FeatureOptions) { } defer serial.Close(port) + var ( + ehzFilter = g.getFilter(ehz.Sensitivity, ehz.Frequency, ehz.Damping) + eheFilter = g.getFilter(ehe.Sensitivity, ehe.Frequency, ehe.Damping) + ehnFilter = g.getFilter(ehn.Sensitivity, ehn.Frequency, ehn.Damping) + ) + var packet Packet g.OnStart(options, "service has started") lastRead := time.Now().UTC() for { - err := g.Read(port, &packet, packetLen) + err := g.Read(port, &packet, packetLen, ehzFilter, eheFilter, ehnFilter) if err != nil { serial.Close(port) g.OnError(options, err) diff --git a/feature/geophone/filter.go b/feature/geophone/filter.go new file mode 100644 index 00000000..80edd204 --- /dev/null +++ b/feature/geophone/filter.go @@ -0,0 +1,25 @@ +package geophone + +func (g *Geophone) getFilter(sensitivity, frequency, damping float64) *Filter { + return nil +} + +func (g *Geophone) Filter(xValues []int32, filter *Filter) []int32 { + x := make([]float64, len(xValues)) + for i, v := range xValues { + x[i] = float64(v) + } + + y := []float64{x[0], x[1]} + for i := 2; i < len(xValues); i++ { + yNext := filter.a1*y[i-1] + filter.a2*y[i-2] + filter.b0*x[i] + filter.b1*x[i-1] + filter.b2*x[i-2] + y = append(y, yNext) + } + + yValues := make([]int32, len(y)) + for i, v := range y { + yValues[i] = int32(v) + } + + return yValues +} diff --git a/feature/geophone/read.go b/feature/geophone/read.go index 36211d5d..f0996192 100644 --- a/feature/geophone/read.go +++ b/feature/geophone/read.go @@ -4,25 +4,21 @@ import ( "bytes" "encoding/binary" "io" - "time" "github.com/bclswl0827/observer/driver/serial" ) -func (g *Geophone) Read(port io.ReadWriteCloser, packet *Packet, packetLen int) error { +func (g *Geophone) Read(port io.ReadWriteCloser, packet *Packet, packetLen int, ehzFilter, eheFilter, ehnFilter *Filter) error { // Filter frame header - _, err := serial.Filter(port, SYNC_WORD[:], 16) + _, err := serial.Filter(port, SYNC_WORD[:], 128) if err != nil { return err } - // checksumLen * (uint8 + int32 * packetLen) + uint8 - checksumLen := len(packet.Checksum) - packetSize := checksumLen*(1+4*packetLen) + 1 - // Read data frame - buf := make([]byte, packetSize) - n, err := serial.Read(port, buf, 5*time.Second) + checksumLen := len(packet.Checksum) + buf := make([]byte, g.getSize(packetLen, checksumLen)) + n, err := serial.Read(port, buf, TIMEOUT_THRESHOLD) if err != nil { return err } diff --git a/feature/geophone/size.go b/feature/geophone/size.go new file mode 100644 index 00000000..ae91c06f --- /dev/null +++ b/feature/geophone/size.go @@ -0,0 +1,6 @@ +package geophone + +func (g *Geophone) getSize(packetLen, checksumLen int) int { + // channelLen*packetLen*int32 + checksumLen + 1 + return checksumLen*packetLen*4 + checksumLen + 1 +} diff --git a/feature/geophone/types.go b/feature/geophone/types.go index 1c0496e1..62819888 100644 --- a/feature/geophone/types.go +++ b/feature/geophone/types.go @@ -11,6 +11,13 @@ const ( TIMEOUT_THRESHOLD time.Duration = 3 * time.Second ) +const ( + // TARGET_DAMPING is the target damping ratio + TARGET_DAMPING float64 = 0.707 + // TARGET_FREQUENCY is the target frequency + TARGET_FREQUENCY float64 = 0.1 +) + var ( // RESET_WORD resets geophone ADC module RESET_WORD = [...]byte{0x61} @@ -28,3 +35,11 @@ type Packet struct { EHN []int32 // North-South Checksum [3]uint8 } + +type Filter struct { + a1 float64 + a2 float64 + b0 float64 + b1 float64 + b2 float64 +} diff --git a/frontend/dist/asset-manifest.json b/frontend/dist/asset-manifest.json index 81957cdb..ddbac9ae 100644 --- a/frontend/dist/asset-manifest.json +++ b/frontend/dist/asset-manifest.json @@ -1,7 +1,7 @@ { "files": { "main.css": "/static/css/main.6306a3a5.css", - "main.js": "/static/js/main.8eb19dec.js", + "main.js": "/static/js/main.373d84f0.js", "static/css/10.525e2941.chunk.css": "/static/css/10.525e2941.chunk.css", "static/js/10.acbbbcaf.chunk.js": "/static/js/10.acbbbcaf.chunk.js", "static/js/311.a3ecb2f6.chunk.js": "/static/js/311.a3ecb2f6.chunk.js", @@ -41,6 +41,6 @@ }, "entrypoints": [ "static/css/main.6306a3a5.css", - "static/js/main.8eb19dec.js" + "static/js/main.373d84f0.js" ] } \ No newline at end of file diff --git a/frontend/dist/i18n/en-US.json b/frontend/dist/i18n/en-US.json index aa221cdf..725ffdf8 100644 --- a/frontend/dist/i18n/en-US.json +++ b/frontend/dist/i18n/en-US.json @@ -106,15 +106,15 @@ "areas": { "ehz": { "label": "EHZ Channel Waveform Count", - "text": "PGA: {{ pga }} gal\nPGV: {{ pgv }} cm/s\nIntensity: {{ intensity }}" + "text": "PGA: {{ pga }} gal\nPGV: {{ pgv }} kine\nIntensity: {{ intensity }}" }, "ehe": { "label": "EHE Channel Waveform Count", - "text": "PGA: {{ pga }} gal\nPGV: {{ pgv }} cm/s\nIntensity: {{ intensity }}" + "text": "PGA: {{ pga }} gal\nPGV: {{ pgv }} kine\nIntensity: {{ intensity }}" }, "ehn": { "label": "EHN Channel Waveform Count", - "text": "PGA: {{ pga }} gal\nPGV: {{ pgv }} cm/s\nIntensity: {{ intensity }}" + "text": "PGA: {{ pga }} gal\nPGV: {{ pgv }} kine\nIntensity: {{ intensity }}" } }, "toasts": { diff --git a/frontend/dist/i18n/zh-CN.json b/frontend/dist/i18n/zh-CN.json index 539a556f..900198ec 100644 --- a/frontend/dist/i18n/zh-CN.json +++ b/frontend/dist/i18n/zh-CN.json @@ -106,15 +106,15 @@ "areas": { "ehz": { "label": "EHZ 通道波形计数", - "text": "PGA:{{ pga }} gal\nPGV:{{ pgv }} cm/s\n震度:{{ intensity }}" + "text": "PGA:{{ pga }} gal\nPGV:{{ pgv }} kine\n震度:{{ intensity }}" }, "ehe": { "label": "EHE 通道波形计数", - "text": "PGA:{{ pga }} gal\nPGV:{{ pgv }} cm/s\n震度:{{ intensity }}" + "text": "PGA:{{ pga }} gal\nPGV:{{ pgv }} kine\n震度:{{ intensity }}" }, "ehn": { "label": "EHN 通道波形计数", - "text": "PGA:{{ pga }} gal\nPGV:{{ pgv }} cm/s\n震度:{{ intensity }}" + "text": "PGA:{{ pga }} gal\nPGV:{{ pgv }} kine\n震度:{{ intensity }}" } }, "toasts": { diff --git a/frontend/dist/i18n/zh-TW.json b/frontend/dist/i18n/zh-TW.json index c129c10e..c643071a 100644 --- a/frontend/dist/i18n/zh-TW.json +++ b/frontend/dist/i18n/zh-TW.json @@ -106,15 +106,15 @@ "areas": { "ehz": { "label": "EHZ 通道波形計數", - "text": "PGA:{{ pga }} gal\nPGV:{{ pgv }} cm/s\n震度:{{ intensity }}" + "text": "PGA:{{ pga }} gal\nPGV:{{ pgv }} kine\n震度:{{ intensity }}" }, "ehe": { "label": "EHE 通道波形計數", - "text": "PGA:{{ pga }} gal\nPGV:{{ pgv }} cm/s\n震度:{{ intensity }}" + "text": "PGA:{{ pga }} gal\nPGV:{{ pgv }} kine\n震度:{{ intensity }}" }, "ehn": { "label": "EHN 通道波形計數", - "text": "PGA:{{ pga }} gal\nPGV:{{ pgv }} cm/s\n震度:{{ intensity }}" + "text": "PGA:{{ pga }} gal\nPGV:{{ pgv }} kine\n震度:{{ intensity }}" } }, "toasts": { diff --git a/frontend/dist/index.html b/frontend/dist/index.html index af3ee3e8..37b1c89f 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/frontend/dist/static/js/main.8eb19dec.js b/frontend/dist/static/js/main.373d84f0.js similarity index 99% rename from frontend/dist/static/js/main.8eb19dec.js rename to frontend/dist/static/js/main.373d84f0.js index 0ec90b76..8d141939 100644 --- a/frontend/dist/static/js/main.8eb19dec.js +++ b/frontend/dist/static/js/main.373d84f0.js @@ -1,2 +1,2 @@ -/*! For license information please see main.8eb19dec.js.LICENSE.txt */ -!function(){"use strict";var e={5827:function(e,t,n){n.d(t,{Z:function(){return v},m:function(){return y}});var r=n(1061),o=n(5671),a=n(3144),i=function(){function e(){(0,o.Z)(this,e)}return(0,a.Z)(e,[{key:"property",value:function(){return{name:"\u65e5\u672c\u6c17\u8c61\u5e81\u9707\u5ea6",value:"JMA"}}},{key:"intensity",value:function(e,t){var n=parseFloat((2*Math.log10(t)+.94).toFixed(3));switch(n=parseFloat(n.toFixed(2)),!0){case n<.5:return"0";case n<1.5:return"1";case n<2.5:return"2";case n<3.5:return"3";case n<4.5:return"4";case n<5:return"5 \u5f31";case n<5.5:return"5 \u5f37";case n<6:return"6 \u5f31";case n<6.5:return"6 \u5f37";default:return"7"}}}]),e}(),u=function(){function e(){(0,o.Z)(this,e)}return(0,a.Z)(e,[{key:"property",value:function(){return{name:"\u53f0\u6e7e\u4e2d\u592e\u6c23\u8c61\u5c40\u65b0\u9707\u5ea6",value:"CWB"}}},{key:"intensity",value:function(e,t){if(t<80)switch(!0){case t<.8:return"0 \u7d1a";case t<2.5:return"1 \u7d1a";case t<8:return"2 \u7d1a";case t<25:return"3 \u7d1a";case t<80:return"4 \u7d1a"}else switch(!0){case e<15:return"4 \u7d1a";case e<30:return"5 \u5f31";case e<50:return"5 \u5f37";case e<80:return"6 \u5f31";case e<140:return"6 \u5f37"}return"7 \u7d1a"}}]),e}(),l=function(){function e(){(0,o.Z)(this,e)}return(0,a.Z)(e,[{key:"property",value:function(){return{name:"\u4fee\u8a02\u9ea5\u52a0\u5229\u5730\u9707\u9707\u5ea6\u8868",value:"MMI"}}},{key:"intensity",value:function(e,t){switch(!0){case t<1:return"1 \u5ea6";case t<2.1:return"2 \u5ea6";case t<5:return"3 \u5ea6";case t<10:return"4 \u5ea6";case t<21:return"5 \u5ea6";case t<44:return"6 \u5ea6";case t<94:return"7 \u5ea6";case t<202:return"8 \u5ea6";case t<432:return"9 \u5ea6"}return t>=432&&e>116?"10 \u5ea6":t>=432?"11 \u5ea6":"12 \u5ea6"}}]),e}(),c=function(){function e(){(0,o.Z)(this,e)}return(0,a.Z)(e,[{key:"property",value:function(){return{name:"\u4e2d\u56fd\u5730\u9707\u5c40\u5730\u9707\u9707\u5ea6",value:"CSIS"}}},{key:"intensity",value:function(e,t){var n=3.17*Math.log10(t)+6.59,r=3*Math.log10(e)+9.77,o=1;return(o=n>=6&&r>=6?r:(n+r)/2)<1?o=1:o>12&&(o=12),"".concat(o.toFixed(1)," \u7ea7")}}]),e}(),s=function(){return"9365d454-20230924200350"},f=function(){return"v2.1.5p"}(),d=s(),p=(0,r.Z)(),h=[new i,new u,new l,new c],v={app_settings:{version:f,release:d,scales:h,router:"hash",name:"config.global.name",author:"config.global.author",title:"config.global.title",description:"config.global.description"},api_settings:{backend:p,version:"v1",prefix:"/api",types:["http","ws"]}},y=h[0]},7902:function(e,t,n){var r=n(7313),o=n(6417),a=(0,r.lazy)((function(){return Promise.all([n.e(377),n.e(493),n.e(822),n.e(439),n.e(730),n.e(10)]).then(n.bind(n,4447))})),i=(0,r.lazy)((function(){return Promise.all([n.e(377),n.e(493),n.e(59),n.e(439),n.e(730),n.e(311)]).then(n.bind(n,3311))})),u=(0,r.lazy)((function(){return Promise.all([n.e(377),n.e(493),n.e(59),n.e(954),n.e(528),n.e(439),n.e(923)]).then(n.bind(n,6923))})),l=(0,r.lazy)((function(){return Promise.all([n.e(377),n.e(59),n.e(954),n.e(439),n.e(419)]).then(n.bind(n,2419))})),c=[{uri:"/",title:"config.router.index",node:(0,o.jsx)(a,{})},{uri:"/realtime",title:"config.router.realtime",node:(0,o.jsx)(i,{})},{uri:"/history",title:"config.router.history",node:(0,o.jsx)(u,{})},{uri:"/setting",title:"config.router.setting",node:(0,o.jsx)(l,{})}];t.Z=c},1061:function(e,t){t.Z=function(){return"//".concat(window.location.host)}},7703:function(e,t,n){n.d(t,{V:function(){return a}});var r=(0,n(827).oM)({name:"adc",initialState:{adc:{fullscale:0,resolution:-1}},reducers:{onUpdate:function(e,t){var n=t.payload;e.adc=n}}}),o=r.actions.onUpdate,a=function(e){return function(t){t(o(e))}};t.Z=r.reducer},8146:function(e,t,n){n.d(t,{V:function(){return a}});var r=(0,n(827).oM)({name:"geophone",initialState:{geophone:{ehz:0,ehe:0,ehn:0}},reducers:{onUpdate:function(e,t){var n=t.payload;e.geophone=n}}}),o=r.actions.onUpdate,a=function(e){return function(t){t(o(e))}};t.Z=r.reducer},1236:function(e,t,n){n.d(t,{V:function(){return u}});var r=n(827),o=n(5827).m.property(),a=(0,r.oM)({name:"scale",initialState:{scale:o},reducers:{onUpdate:function(e,t){var n=t.payload;e.scale=n}}}),i=a.actions.onUpdate,u=function(e){return function(t){t(i(e))}};t.Z=a.reducer},5296:function(e,t,n){n.d(t,{Z:function(){return oe}});var r=function(){function e(e){var t=this;this._insertTag=function(e){var n;n=0===t.tags.length?t.insertionPoint?t.insertionPoint.nextSibling:t.prepend?t.container.firstChild:t.before:t.tags[t.tags.length-1].nextSibling,t.container.insertBefore(e,n),t.tags.push(e)},this.isSpeedy=void 0===e.speedy||e.speedy,this.tags=[],this.ctr=0,this.nonce=e.nonce,this.key=e.key,this.container=e.container,this.prepend=e.prepend,this.insertionPoint=e.insertionPoint,this.before=null}var t=e.prototype;return t.hydrate=function(e){e.forEach(this._insertTag)},t.insert=function(e){this.ctr%(this.isSpeedy?65e3:1)===0&&this._insertTag(function(e){var t=document.createElement("style");return t.setAttribute("data-emotion",e.key),void 0!==e.nonce&&t.setAttribute("nonce",e.nonce),t.appendChild(document.createTextNode("")),t.setAttribute("data-s",""),t}(this));var t=this.tags[this.tags.length-1];if(this.isSpeedy){var n=function(e){if(e.sheet)return e.sheet;for(var t=0;t0?s(w,--g):0,y--,10===b&&(y=1,v--),b}function E(){return b=g2||C(b)>3?"":" "}function z(e,t){for(;--t&&E()&&!(b<48||b>102||b>57&&b<65||b>70&&b<97););return O(e,P()+(t<6&&32==_()&&32==E()))}function L(e){for(;E();)switch(b){case e:return g;case 34:case 39:34!==e&&39!==e&&L(b);break;case 40:41===e&&L(e);break;case 92:E()}return g}function M(e,t){for(;E()&&e+b!==57&&(e+b!==84||47!==_()););return"/*"+O(t,g-1)+"*"+a(47===e?e:E())}function I(e){for(;!C(_());)E();return O(e,g)}var D="-ms-",A="-moz-",F="-webkit-",U="comm",$="rule",Z="decl",B="@keyframes";function W(e,t){for(var n="",r=p(e),o=0;o0&&d(A)-m&&h(b>32?J(A+";",r,n,m-1):J(l(A," ","")+";",r,n,m-2),p);break;case 59:A+=";";default:if(h(D=Q(A,t,n,v,y,o,f,j,N=[],L=[],m),i),123===C)if(0===y)q(A,t,D,D,N,i,m,f,L);else switch(99===g&&110===s(A,3)?100:g){case 100:case 108:case 109:case 115:q(e,D,D,r&&h(Q(e,D,D,0,0,o,f,j,o,N=[],m),L),o,L,m,f,r?N:L);break;default:q(A,D,D,D,[""],L,0,f,L)}}v=y=b=0,S=O=1,j=A="",m=u;break;case 58:m=1+d(A),b=w;default:if(S<1)if(123==C)--S;else if(125==C&&0==S++&&125==x())continue;switch(A+=a(C),C*S){case 38:O=y>0?1:(A+="\f",-1);break;case 44:f[v++]=(d(A)-1)*O,O=1;break;case 64:45===_()&&(A+=T(E())),g=_(),y=m=d(j=A+=I(P())),C++;break;case 45:45===w&&2==d(A)&&(S=0)}}return i}function Q(e,t,n,r,a,i,c,s,d,h,v){for(var y=a-1,m=0===a?i:[""],g=p(m),b=0,w=0,k=0;b0?m[x]+" "+E:l(E,/&\f/g,m[x])))&&(d[k++]=_);return S(e,t,n,0===a?$:s,d,h,v)}function K(e,t,n){return S(e,t,n,U,a(b),f(e,2,-2),0)}function J(e,t,n,r){return S(e,t,n,Z,f(e,0,r),f(e,r+1,-1),r)}var X=function(e,t,n){for(var r=0,o=0;r=o,o=_(),38===r&&12===o&&(t[n]=1),!C(o);)E();return O(e,g)},Y=function(e,t){return N(function(e,t){var n=-1,r=44;do{switch(C(r)){case 0:38===r&&12===_()&&(t[n]=1),e[n]+=X(g-1,t,n);break;case 2:e[n]+=T(r);break;case 4:if(44===r){e[++n]=58===_()?"&\f":"",t[n]=e[n].length;break}default:e[n]+=a(r)}}while(r=E());return e}(j(e),t))},G=new WeakMap,ee=function(e){if("rule"===e.type&&e.parent&&!(e.length<1)){for(var t=e.value,n=e.parent,r=e.column===n.column&&e.line===n.line;"rule"!==n.type;)if(!(n=n.parent))return;if((1!==e.props.length||58===t.charCodeAt(0)||G.get(n))&&!r){G.set(e,!0);for(var o=[],a=Y(t,o),i=n.props,u=0,l=0;u6)switch(s(e,t+1)){case 109:if(45!==s(e,t+4))break;case 102:return l(e,/(.+:)(.+)-([^]+)/,"$1"+F+"$2-$3$1"+A+(108==s(e,t+3)?"$3":"$2-$3"))+e;case 115:return~c(e,"stretch")?ne(l(e,"stretch","fill-available"),t)+e:e}break;case 4949:if(115!==s(e,t+1))break;case 6444:switch(s(e,d(e)-3-(~c(e,"!important")&&10))){case 107:return l(e,":",":"+F)+e;case 101:return l(e,/(.+:)([^;!]+)(;|!.+)?/,"$1"+F+(45===s(e,14)?"inline-":"")+"box$3$1"+F+"$2$3$1"+D+"$2box$3")+e}break;case 5936:switch(s(e,t+11)){case 114:return F+e+D+l(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return F+e+D+l(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return F+e+D+l(e,/[svh]\w+-[tblr]{2}/,"lr")+e}return F+e+D+e+e}return e}var re=[function(e,t,n,r){if(e.length>-1&&!e.return)switch(e.type){case Z:e.return=ne(e.value,e.length);break;case B:return W([k(e,{value:l(e.value,"@","@"+F)})],r);case $:if(e.length)return function(e,t){return e.map(t).join("")}(e.props,(function(t){switch(function(e,t){return(e=t.exec(e))?e[0]:e}(t,/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":return W([k(e,{props:[l(t,/:(read-\w+)/,":-moz-$1")]})],r);case"::placeholder":return W([k(e,{props:[l(t,/:(plac\w+)/,":"+F+"input-$1")]}),k(e,{props:[l(t,/:(plac\w+)/,":-moz-$1")]}),k(e,{props:[l(t,/:(plac\w+)/,D+"input-$1")]})],r)}return""}))}}],oe=function(e){var t=e.key;if("css"===t){var n=document.querySelectorAll("style[data-emotion]:not([data-s])");Array.prototype.forEach.call(n,(function(e){-1!==e.getAttribute("data-emotion").indexOf(" ")&&(document.head.appendChild(e),e.setAttribute("data-s",""))}))}var o=e.stylisPlugins||re;var a,i,u={},l=[];a=e.container||document.head,Array.prototype.forEach.call(document.querySelectorAll('style[data-emotion^="'+t+' "]'),(function(e){for(var t=e.getAttribute("data-emotion").split(" "),n=1;n=4;++r,o-=4)t=1540483477*(65535&(t=255&e.charCodeAt(r)|(255&e.charCodeAt(++r))<<8|(255&e.charCodeAt(++r))<<16|(255&e.charCodeAt(++r))<<24))+(59797*(t>>>16)<<16),n=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&n)+(59797*(n>>>16)<<16);switch(o){case 3:n^=(255&e.charCodeAt(r+2))<<16;case 2:n^=(255&e.charCodeAt(r+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(r)))+(59797*(n>>>16)<<16)}return(((n=1540483477*(65535&(n^=n>>>13))+(59797*(n>>>16)<<16))^n>>>15)>>>0).toString(36)}(o)+l;return{name:c,styles:o,next:d}}},5696:function(e,t,n){var r;n.d(t,{L:function(){return i},j:function(){return u}});var o=n(7313),a=!!(r||(r=n.t(o,2))).useInsertionEffect&&(r||(r=n.t(o,2))).useInsertionEffect,i=a||function(e){return e()},u=a||o.useLayoutEffect},827:function(e,t,n){function r(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r3?t.i-4:t.i:Array.isArray(e)?1:d(e)?2:p(e)?3:0}function l(e,t){return 2===u(e)?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function c(e,t){return 2===u(e)?e.get(t):e[t]}function s(e,t,n){var r=u(e);2===r?e.set(t,n):3===r?e.add(n):e[t]=n}function f(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}function d(e){return Z&&e instanceof Map}function p(e){return B&&e instanceof Set}function h(e){return e.o||e.t}function v(e){if(Array.isArray(e))return Array.prototype.slice.call(e);var t=J(e);delete t[q];for(var n=K(t),r=0;r1&&(e.set=e.add=e.clear=e.delete=m),Object.freeze(e),t&&i(e,(function(e,t){return y(t,!0)}),!0)),e}function m(){r(2)}function g(e){return null==e||"object"!=typeof e||Object.isFrozen(e)}function b(e){var t=X[e];return t||r(18,e),t}function w(e,t){X[e]||(X[e]=t)}function S(){return U}function k(e,t){t&&(b("Patches"),e.u=[],e.s=[],e.v=t)}function x(e){E(e),e.p.forEach(P),e.p=null}function E(e){e===U&&(U=e.l)}function _(e){return U={p:[],l:U,h:e,m:!0,_:0}}function P(e){var t=e[q];0===t.i||1===t.i?t.j():t.g=!0}function O(e,t){t._=t.p.length;var n=t.p[0],o=void 0!==e&&e!==n;return t.h.O||b("ES5").S(t,e,o),o?(n[q].P&&(x(t),r(4)),a(e)&&(e=C(t,e),t.l||N(t,e)),t.u&&b("Patches").M(n[q].t,e,t.u,t.s)):e=C(t,n,[]),x(t),t.u&&t.v(t.u,t.s),e!==V?e:void 0}function C(e,t,n){if(g(t))return t;var r=t[q];if(!r)return i(t,(function(o,a){return j(e,r,t,o,a,n)}),!0),t;if(r.A!==e)return t;if(!r.P)return N(e,r.t,!0),r.t;if(!r.I){r.I=!0,r.A._--;var o=4===r.i||5===r.i?r.o=v(r.k):r.o,a=o,u=!1;3===r.i&&(a=new Set(o),o.clear(),u=!0),i(a,(function(t,a){return j(e,r,o,t,a,n,u)})),N(e,o,!1),n&&e.u&&b("Patches").N(r,n,e.u,e.s)}return r.o}function j(e,t,n,r,i,u,c){if(o(i)){var f=C(e,i,u&&t&&3!==t.i&&!l(t.R,r)?u.concat(r):void 0);if(s(n,r,f),!o(f))return;e.m=!1}else c&&n.add(i);if(a(i)&&!g(i)){if(!e.h.D&&e._<1)return;C(e,i),t&&t.A.l||N(e,i)}}function N(e,t,n){void 0===n&&(n=!1),!e.l&&e.h.D&&e.m&&y(t,n)}function T(e,t){var n=e[q];return(n?h(n):e)[t]}function R(e,t){if(t in e)for(var n=Object.getPrototypeOf(e);n;){var r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=Object.getPrototypeOf(n)}}function z(e){e.P||(e.P=!0,e.l&&z(e.l))}function L(e){e.o||(e.o=v(e.t))}function M(e,t,n){var r=d(t)?b("MapSet").F(t,n):p(t)?b("MapSet").T(t,n):e.O?function(e,t){var n=Array.isArray(e),r={i:n?1:0,A:t?t.A:S(),P:!1,I:!1,R:{},l:t,t:e,k:null,o:null,j:null,C:!1},o=r,a=Y;n&&(o=[r],a=G);var i=Proxy.revocable(o,a),u=i.revoke,l=i.proxy;return r.k=l,r.j=u,l}(t,n):b("ES5").J(t,n);return(n?n.A:S()).p.push(r),r}function I(e){return o(e)||r(22,e),function e(t){if(!a(t))return t;var n,r=t[q],o=u(t);if(r){if(!r.P&&(r.i<4||!b("ES5").K(r)))return r.t;r.I=!0,n=D(t,o),r.I=!1}else n=D(t,o);return i(n,(function(t,o){r&&c(r.t,t)===o||s(n,t,e(o))})),3===o?new Set(n):n}(e)}function D(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return v(e)}function A(){function e(e,t){var n=a[e];return n?n.enumerable=t:a[e]=n={configurable:!0,enumerable:t,get:function(){var t=this[q];return Y.get(t,e)},set:function(t){var n=this[q];Y.set(n,e,t)}},n}function t(e){for(var t=e.length-1;t>=0;t--){var o=e[t][q];if(!o.P)switch(o.i){case 5:r(o)&&z(o);break;case 4:n(o)&&z(o)}}}function n(e){for(var t=e.t,n=e.k,r=K(n),o=r.length-1;o>=0;o--){var a=r[o];if(a!==q){var i=t[a];if(void 0===i&&!l(t,a))return!0;var u=n[a],c=u&&u[q];if(c?c.t!==i:!f(u,i))return!0}}var s=!!t[q];return r.length!==K(t).length+(s?0:1)}function r(e){var t=e.k;if(t.length!==e.t.length)return!0;var n=Object.getOwnPropertyDescriptor(t,t.length-1);if(n&&!n.get)return!0;for(var r=0;r1?r-1:0),a=1;a1?r-1:0),a=1;a=0;n--){var r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}n>-1&&(t=t.slice(n+1));var a=b("Patches").$;return o(e)?a(e,t):this.produce(e,(function(e){return a(e,t)}))},e}(),te=new ee,ne=te.produce,re=(te.produceWithPatches.bind(te),te.setAutoFreeze.bind(te),te.setUseProxies.bind(te),te.applyPatches.bind(te),te.createDraft.bind(te),te.finishDraft.bind(te),ne),oe=n(9038);function ae(e){return function(t){var n=t.dispatch,r=t.getState;return function(t){return function(o){return"function"===typeof o?o(n,r,e):t(o)}}}}var ie=ae();ie.withExtraArgument=ae;var ue=ie,le=function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},e(t,n)};return function(t,n){if("function"!==typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),ce=function(e,t){var n,r,o,a,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return a={next:u(0),throw:u(1),return:u(2)},"function"===typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function u(a){return function(u){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(o=2&a[0]?r.return:a[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,r=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!(o=(o=i.trys).length>0&&o[o.length-1])&&(6===a[0]||2===a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]=0&&(t.hash=e.substr(n),e=e.substr(0,n));var r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function C(e,t,n,r){void 0===r&&(r={});var o=r,a=o.window,i=void 0===a?document.defaultView:a,u=o.v5Compat,l=void 0!==u&&u,c=i.history,s=d.Pop,f=null,p=h();function h(){return(c.state||{idx:null}).idx}function v(){s=d.Pop;var e=h(),t=null==e?null:e-p;p=e,f&&f({action:s,location:g.location,delta:t})}function y(e){var t="null"!==i.location.origin?i.location.origin:i.location.href,n="string"===typeof e?e:P(e);return k(t,"No window.location.(origin|href) available to create URL for href: "+n),new URL(n,t)}null==p&&(p=0,c.replaceState(m({},c.state,{idx:p}),""));var g={get action(){return s},get location(){return e(i,c)},listen:function(e){if(f)throw new Error("A history only accepts one active listener");return i.addEventListener(b,v),f=e,function(){i.removeEventListener(b,v),f=null}},createHref:function(e){return t(i,e)},createURL:y,encodeLocation:function(e){var t=y(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:function(e,t){s=d.Push;var r=_(g.location,e,t);n&&n(r,e);var o=E(r,p=h()+1),a=g.createHref(r);try{c.pushState(o,"",a)}catch(u){if(u instanceof DOMException&&"DataCloneError"===u.name)throw u;i.location.assign(a)}l&&f&&f({action:s,location:g.location,delta:1})},replace:function(e,t){s=d.Replace;var r=_(g.location,e,t);n&&n(r,e);var o=E(r,p=h()),a=g.createHref(r);c.replaceState(o,"",a),l&&f&&f({action:s,location:g.location,delta:0})},go:function(e){return c.go(e)}};return g}!function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(g||(g={}));new Set(["lazy","caseSensitive","path","id","index","children"]);function j(e,t,n){void 0===n&&(n="/");var r=B(("string"===typeof t?O(t):t).pathname||"/",n);if(null==r)return null;var o=N(e);!function(e){e.sort((function(e,t){return e.score!==t.score?t.score-e.score:function(e,t){var n=e.length===t.length&&e.slice(0,-1).every((function(e,n){return e===t[n]}));return n?e[e.length-1]-t[t.length-1]:0}(e.routesMeta.map((function(e){return e.childrenIndex})),t.routesMeta.map((function(e){return e.childrenIndex})))}))}(o);for(var a=null,i=0;null==a&&i0&&(k(!0!==e.index,'Index routes must not have child routes. Please remove all child routes from route path "'+u+'".'),N(e.children,t,l,u)),(null!=e.path||e.index)&&t.push({path:u,score:F(u,e.index),routesMeta:l})};return e.forEach((function(e,t){var n;if(""!==e.path&&null!=(n=e.path)&&n.includes("?")){var r,a=(0,v.Z)(T(e.path));try{for(a.s();!(r=a.n()).done;){var i=r.value;o(e,t,i)}}catch(u){a.e(u)}finally{a.f()}}else o(e,t)})),t}function T(e){var t=e.split("/");if(0===t.length)return[];var n=(0,h.Z)(t),r=n[0],o=n.slice(1),a=r.endsWith("?"),i=r.replace(/\?$/,"");if(0===o.length)return a?[i,""]:[i];var u=T(o.join("/")),l=[];return l.push.apply(l,(0,y.Z)(u.map((function(e){return""===e?i:[i,e].join("/")})))),a&&l.push.apply(l,(0,y.Z)(u)),l.map((function(t){return e.startsWith("/")&&""===t?"/":t}))}var R=/^:\w+$/,z=3,L=2,M=1,I=10,D=-2,A=function(e){return"*"===e};function F(e,t){var n=e.split("/"),r=n.length;return n.some(A)&&(r+=D),t&&(r+=L),n.filter((function(e){return!A(e)})).reduce((function(e,t){return e+(R.test(t)?z:""===t?M:I)}),r)}function U(e,t){for(var n=e.routesMeta,r={},o="/",a=[],i=0;i and the router will parse it for you.'}function V(e){return e.filter((function(e,t){return 0===t||e.route.path&&e.route.path.length>0}))}function H(e,t,n,r){var o;void 0===r&&(r=!1),"string"===typeof e?o=O(e):(k(!(o=m({},e)).pathname||!o.pathname.includes("?"),W("?","pathname","search",o)),k(!o.pathname||!o.pathname.includes("#"),W("#","pathname","hash",o)),k(!o.search||!o.search.includes("#"),W("#","search","hash",o)));var a,i=""===e||""===o.pathname,u=i?"/":o.pathname;if(r||null==u)a=n;else{var l=t.length-1;if(u.startsWith("..")){for(var c=u.split("/");".."===c[0];)c.shift(),l-=1;o.pathname=c.join("/")}a=l>=0?t[l]:"/"}var s=function(e,t){void 0===t&&(t="/");var n="string"===typeof e?O(e):e,r=n.pathname,o=n.search,a=void 0===o?"":o,i=n.hash,u=void 0===i?"":i,l=r?r.startsWith("/")?r:function(e,t){var n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach((function(e){".."===e?n.length>1&&n.pop():"."!==e&&n.push(e)})),n.length>1?n.join("/"):"/"}(r,t):t;return{pathname:l,search:K(a),hash:J(u)}}(o,a),f=u&&"/"!==u&&u.endsWith("/"),d=(i||"."===u)&&n.endsWith("/");return s.pathname.endsWith("/")||!f&&!d||(s.pathname+="/"),s}var q=function(e){return e.join("/").replace(/\/\/+/g,"/")},Q=function(e){return e.replace(/\/+$/,"").replace(/^\/*/,"/")},K=function(e){return e&&"?"!==e?e.startsWith("?")?e:"?"+e:""},J=function(e){return e&&"#"!==e?e.startsWith("#")?e:"#"+e:""},X=function(e){(0,a.Z)(n,e);var t=(0,i.Z)(n);function n(){return(0,o.Z)(this,n),t.apply(this,arguments)}return(0,r.Z)(n)}(f(Error));function Y(e){return null!=e&&"number"===typeof e.status&&"string"===typeof e.statusText&&"boolean"===typeof e.internal&&"data"in e}var G=["post","put","patch","delete"],ee=(new Set(G),["get"].concat(G));new Set(ee),new Set([301,302,303,307,308]),new Set([307,308]);Symbol("deferred")},7861:function(e,t,n){var r=n(9456),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},u={};function l(e){return r.isMemo(e)?i:u[e.$$typeof]||o}u[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},u[r.Memo]=i;var c=Object.defineProperty,s=Object.getOwnPropertyNames,f=Object.getOwnPropertySymbols,d=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!==typeof n){if(h){var o=p(n);o&&o!==h&&e(t,o,r)}var i=s(n);f&&(i=i.concat(f(n)));for(var u=l(t),v=l(n),y=0;y