├── 2022
├── skattemelding.xml
└── naeringsspesifikasjon.xml
├── 2023
├── skattemelding.xml
└── naeringsspesifikasjon.xml
├── 2024
├── skattemelding.xml
└── naeringsspesifikasjon.xml
├── .gitignore
├── templates
├── guest.html
├── altinn.html
└── validation.html
├── src
├── file.rs
├── base64.rs
├── jwt.rs
├── http.rs
├── error.rs
├── xml.rs
└── main.rs
├── Cargo.toml
├── LICENSE
├── README.md
└── Cargo.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | /result
2 | /target
3 | *secret*
4 |
--------------------------------------------------------------------------------
/templates/guest.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Skattemelding innlogging
4 |
5 |
6 | Logg inn
7 |
8 |
9 |
--------------------------------------------------------------------------------
/templates/altinn.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Skattemelding levering
4 |
8 |
9 |
10 |
11 |
12 | Du er logga inn i Altinn som {{pid}}.
13 |
14 |
15 |
--------------------------------------------------------------------------------
/src/file.rs:
--------------------------------------------------------------------------------
1 | use std::fs;
2 |
3 | use anyhow::Result;
4 |
5 | pub fn read_skattemelding(year: i32) -> Result {
6 | read_file("skattemelding.xml", year)
7 | }
8 |
9 | pub fn read_naeringsspesifikasjon(year: i32) -> Result {
10 | read_file("naeringsspesifikasjon.xml", year)
11 | }
12 |
13 | fn read_file(name: &str, year: i32) -> Result {
14 | Ok(fs::read_to_string(format!("{}/{}", year, name))?)
15 | }
16 |
--------------------------------------------------------------------------------
/src/base64.rs:
--------------------------------------------------------------------------------
1 | use anyhow::Result;
2 | use data_encoding::{Encoding, BASE64, BASE64_NOPAD};
3 |
4 | use std::str;
5 |
6 | pub fn decode(s: &str) -> Result {
7 | decode_inner(&BASE64, s)
8 | }
9 |
10 | pub fn decode_nopad(s: &str) -> Result {
11 | decode_inner(&BASE64_NOPAD, s)
12 | }
13 |
14 | pub fn encode(s: &str) -> String {
15 | BASE64.encode(s.as_bytes())
16 | }
17 |
18 | fn decode_inner(encoding: &Encoding, s: &str) -> Result {
19 | Ok(str::from_utf8(&encoding.decode(s.as_bytes())?)?.to_string())
20 | }
21 |
--------------------------------------------------------------------------------
/src/jwt.rs:
--------------------------------------------------------------------------------
1 | use anyhow::Result;
2 | use serde::Deserialize;
3 |
4 | use std::str;
5 |
6 | use crate::base64::decode_nopad;
7 |
8 | #[derive(Deserialize)]
9 | pub struct TokenResponse {
10 | pub access_token: String,
11 | pub id_token: String,
12 | }
13 |
14 | #[derive(Deserialize)]
15 | pub struct IdToken {
16 | pub pid: String,
17 | }
18 |
19 | impl IdToken {
20 | pub fn from_str(value: &str) -> Result {
21 | let claims: IdToken =
22 | serde_json::from_str(&decode_nopad(value.split('.').collect::>()[1])?)?;
23 |
24 | Ok(Self { pid: claims.pid })
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Cargo.toml:
--------------------------------------------------------------------------------
1 | [package]
2 | name = "skattemelding"
3 | version = "0.1.0"
4 | edition = "2021"
5 |
6 | [dependencies]
7 | anyhow = "1.0.81"
8 | axum = { version = "0.7.4", features = ["macros"] }
9 | axum-server = { version = "0.6", features = ["tls-rustls"] }
10 | chrono = "0.4.35"
11 | data-encoding = "2.5.0"
12 | reqwest = { version = "0.11.26", features = ["json", "stream"] }
13 | serde = { version = "1.0.197", features = ["derive"] }
14 | serde_json = "1.0.114"
15 | tera = { version = "1.19.1", default-features = false }
16 | tokio = { version = "1.36.0", features = ["fs", "macros", "rt-multi-thread"] }
17 | tokio-util = "0.7.10"
18 | tower-sessions = "0.11.0"
19 | tracing = "0.1"
20 | tracing-subscriber = { version = "0.3", features = ["env-filter"] }
21 | xmltree = "0.10.3"
22 |
--------------------------------------------------------------------------------
/templates/validation.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Skattemelding validering
4 |
8 |
9 |
10 |
11 |
12 | Du er logga inn i ID-porten som {{pid}}.
13 | Dokumentreferanse:
14 | {{dok_ref}}
15 | Partsnummer:
16 | {{partsnummer}}
17 | Valideringsresultat:
18 | {{validation}}
19 |
20 | {% for dokument in dokumenter -%}
21 | Dokument:
22 | {{dokument}}
23 | {%- endfor %}
24 |
25 | Fastsatt skattemelding hos Skatteetaten?
26 | {{er_fastsatt}}
27 |
28 | Altinn
29 |
30 |
31 |
--------------------------------------------------------------------------------
/src/http.rs:
--------------------------------------------------------------------------------
1 | use anyhow::Result;
2 | use reqwest::{Client, RequestBuilder};
3 |
4 | pub async fn get_text(url: &str, token: &str) -> Result {
5 | Ok(get(url, Some(token))
6 | .send()
7 | .await?
8 | .error_for_status()?
9 | .text()
10 | .await?)
11 | }
12 |
13 | pub fn delete(url: &str, token: Option<&str>) -> RequestBuilder {
14 | let request = Client::new().delete(url);
15 | maybe_with_token(request, token)
16 | }
17 |
18 | pub fn get(url: &str, token: Option<&str>) -> RequestBuilder {
19 | let request = Client::new().get(url);
20 | maybe_with_token(request, token)
21 | }
22 |
23 | pub fn post(url: &str, token: Option<&str>) -> RequestBuilder {
24 | let request = Client::new().post(url);
25 | maybe_with_token(request, token)
26 | }
27 |
28 | pub fn put(url: &str, token: Option<&str>) -> RequestBuilder {
29 | let request = Client::new().put(url);
30 | maybe_with_token(request, token)
31 | }
32 |
33 | fn maybe_with_token(request: RequestBuilder, token: Option<&str>) -> RequestBuilder {
34 | if let Some(token) = token {
35 | request.header("Authorization", format!("Bearer {token}"))
36 | } else {
37 | request
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/error.rs:
--------------------------------------------------------------------------------
1 | use axum::http::StatusCode;
2 | use axum::response::{Html, IntoResponse, Response};
3 | use serde::Deserialize;
4 |
5 | #[derive(Deserialize)]
6 | pub struct ErrorResponse {
7 | pub error: String,
8 | pub error_description: String,
9 | }
10 |
11 | impl IntoResponse for AppError {
12 | fn into_response(self) -> Response {
13 | (
14 | StatusCode::INTERNAL_SERVER_ERROR,
15 | Html(format!(
16 | r#"
17 |
18 | Skattemelding feil
19 |
23 |
24 |
25 |
26 |
27 | Ein feil oppstod:
28 | {}
29 | Tilbake til start
30 |
31 |
32 | "#,
33 | self.0,
34 | )),
35 | )
36 | .into_response()
37 | }
38 | }
39 |
40 | pub struct AppError(anyhow::Error);
41 |
42 | impl From for AppError
43 | where
44 | E: Into,
45 | {
46 | fn from(err: E) -> Self {
47 | Self(err.into())
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/src/xml.rs:
--------------------------------------------------------------------------------
1 | use std::{borrow::Cow, io::BufWriter};
2 |
3 | use anyhow::{anyhow, Result};
4 | use xmltree::{Element, EmitterConfig, XMLNode};
5 |
6 | pub trait XmlElement {
7 | fn child(&self, name: &str) -> Result<&Element>;
8 | fn format(&self) -> Result;
9 | fn text(&self) -> Result>;
10 | }
11 |
12 | impl XmlElement for Element {
13 | fn child(&self, name: &str) -> Result<&Element> {
14 | tracing::debug!("Looking for {name} in: {self:?}");
15 |
16 | self.get_child(name)
17 | .ok_or_else(|| anyhow!(format!("Did not find {name} in XML element")))
18 | }
19 |
20 | fn format(&self) -> Result {
21 | let mut cfg = EmitterConfig::new();
22 | cfg.perform_indent = true;
23 |
24 | let mut buf = BufWriter::new(Vec::new());
25 | self.write_with_config(&mut buf, cfg)?;
26 | let bytes = buf.into_inner()?;
27 | Ok(String::from_utf8(bytes)?)
28 | }
29 |
30 | fn text(&self) -> Result> {
31 | self.get_text()
32 | .ok_or_else(|| anyhow!("Did not find text in XML element"))
33 | }
34 | }
35 |
36 | pub trait XmlNode {
37 | fn element(&self) -> Result<&Element>;
38 | }
39 |
40 | impl XmlNode for XMLNode {
41 | fn element(&self) -> Result<&Element> {
42 | self.as_element()
43 | .ok_or_else(|| anyhow!("The node is not an XML element"))
44 | }
45 | }
46 |
47 | pub fn to_xml(s: &str) -> Result {
48 | Ok(Element::parse(s.as_bytes())?)
49 | }
50 |
--------------------------------------------------------------------------------
/2022/skattemelding.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 1442927932
4 | 2022
5 |
6 |
7 |
8 | 58096
9 |
10 |
11 |
12 |
13 | 58096
14 |
15 |
16 |
17 |
18 |
19 | 1
20 |
21 | formuesobjektIkkeOmfattetAvVerdsettingsrabatt
22 |
23 |
24 | 645826
25 |
26 |
27 |
28 |
29 | 300886
30 |
31 |
32 |
33 |
34 | 645826
35 |
36 |
37 |
38 |
39 | 300886
40 |
41 |
42 |
43 |
44 | false
45 |
46 |
47 |
48 |
49 | 344940
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/2023/skattemelding.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 1442927932
5 | 2023
6 |
7 |
8 |
9 | 383932
10 |
11 |
12 |
13 | 383932
14 |
15 |
16 |
17 | 383932
18 |
19 |
20 |
21 | false
22 |
23 |
24 |
25 |
26 | 1
27 |
28 | formuesobjektIkkeOmfattetAvVerdsettingsrabatt
29 |
30 |
31 | 1086498
32 |
33 |
34 |
35 |
36 | 742091
37 |
38 |
39 |
40 |
41 | 1086498
42 |
43 |
44 |
45 |
46 | 742091
47 |
48 |
49 |
50 |
51 | false
52 |
53 |
54 |
55 |
56 | 344407
57 |
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/2024/skattemelding.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 1442927932
5 | 2024
6 |
7 |
8 |
9 | 493407
10 |
11 |
12 |
13 | 493407
14 |
15 |
16 |
17 | 493407
18 |
19 |
20 |
21 |
22 | 0
23 |
24 |
25 |
26 |
27 |
28 | 1
29 |
30 | formuesobjektIkkeOmfattetAvVerdsettingsrabatt
31 |
32 |
33 | 1312556
34 |
35 |
36 |
37 |
38 | 983291
39 |
40 |
41 |
42 |
43 | 1312556
44 |
45 |
46 |
47 |
48 | 983291
49 |
50 |
51 |
52 |
53 | false
54 |
55 |
56 |
57 |
58 | 329265
59 |
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/2022/naeringsspesifikasjon.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 1442927932
4 | 2022
5 |
6 |
7 |
8 |
9 | 686480
10 |
11 |
12 |
13 |
14 | 3000
15 |
16 | 3000
17 |
18 |
19 |
20 | 686480
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | 631998
30 |
31 |
32 |
33 |
34 | 6000
35 |
36 | 6000
37 |
38 |
39 |
40 | 631998
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 | 3614
49 |
50 |
51 |
52 |
53 | 0
54 |
55 |
56 |
57 |
58 | 12781
59 |
60 |
61 |
62 |
63 | 8050
64 |
65 | 8050
66 |
67 |
68 |
69 | 3614
70 |
71 |
72 |
73 |
74 |
75 |
76 | 8115
77 |
78 | 8115
79 |
80 |
81 |
82 | 0
83 |
84 |
85 |
86 |
87 |
88 |
89 | 8300
90 |
91 | 8300
92 |
93 |
94 |
95 | 12781
96 |
97 |
98 |
99 |
100 |
101 |
102 | 45315
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 | 645826
111 |
112 |
113 |
114 |
115 | 1900
116 |
117 |
118 | 645826
119 |
120 |
121 |
122 | 1900
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 | 300886
131 |
132 |
133 |
134 |
135 | 344940
136 |
137 |
138 |
139 |
140 | 2400
141 |
142 |
143 | 300886
144 |
145 |
146 |
147 | 2400
148 |
149 |
150 |
151 |
152 |
153 | 2050
154 |
155 |
156 | 344940
157 |
158 |
159 |
160 | 2050
161 |
162 |
163 |
164 |
165 |
166 |
167 | 645826
168 |
169 |
170 |
171 |
172 | 645826
173 |
174 |
175 |
176 |
177 |
178 | h1
179 |
180 | annenNaering
181 |
182 |
183 | IT-konsultasjon
184 |
185 |
186 |
187 | 58096
188 |
189 |
190 |
191 |
192 | 58096
193 |
194 |
195 |
196 | 100
197 |
198 |
199 |
200 | 58096
201 |
202 |
203 |
204 |
205 |
206 | 12781
207 |
208 |
209 |
210 |
211 | 58096
212 |
213 |
214 |
215 |
216 |
217 | 1
218 |
219 | positivSkattekostnad
220 |
221 |
222 |
223 | 12781
224 |
225 |
226 |
227 |
228 |
229 |
230 | fullRegnskapsplikt
231 |
232 |
233 | 2022-01-01T00:00:00.000Z
234 | 2022-12-31T23:59:59.000Z
235 |
236 |
237 | oevrigSelskap
238 |
239 |
240 | regnskapslovensAlminneligeRegler
241 |
242 |
243 |
244 |
245 |
246 | 269625
247 |
248 |
249 |
250 |
251 | 45315
252 |
253 |
254 |
255 | EK1
256 |
257 | aaretsOverskudd
258 |
259 |
260 |
261 | 45315
262 |
263 |
264 |
265 |
266 |
267 | 314940
268 |
269 |
270 |
271 | false
272 |
--------------------------------------------------------------------------------
/2023/naeringsspesifikasjon.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 1442927932
5 | 2023
6 |
7 |
8 |
9 |
10 | 1476230
11 |
12 |
13 |
14 |
15 |
16 |
17 | 1476230
18 |
19 |
20 | 3000
21 |
22 | 3000
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | 1104263
31 |
32 |
33 |
34 |
35 |
36 |
37 | 1104263
38 |
39 |
40 | 6000
41 |
42 | 6000
43 |
44 |
45 |
46 |
47 |
48 |
49 | 12123
50 |
51 |
52 |
53 |
54 | 158
55 |
56 |
57 |
58 |
59 | 84465
60 |
61 |
62 |
63 |
64 |
65 |
66 | 12123
67 |
68 |
69 | 8050
70 |
71 | 8050
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 | 158
80 |
81 |
82 | 8115
83 |
84 | 8115
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 | 84465
93 |
94 |
95 | 8300
96 |
97 | 8300
98 |
99 |
100 |
101 |
102 |
103 | 299467
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 | 1086498
112 |
113 |
114 |
115 |
116 | 1900
117 |
118 |
119 | 1086498
120 |
121 |
122 |
123 | 1900
124 |
125 |
126 | true
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 | 742091
135 |
136 |
137 |
138 |
139 | 344407
140 |
141 |
142 |
143 |
144 | 2400
145 |
146 |
147 | 742091
148 |
149 |
150 |
151 | 2400
152 |
153 |
154 | true
155 |
156 |
157 |
158 |
159 |
160 | 2050
161 |
162 |
163 | 344407
164 |
165 |
166 |
167 | 2050
168 |
169 |
170 |
171 |
172 |
173 |
174 | 1086498
175 |
176 |
177 |
178 |
179 | 1086498
180 |
181 |
182 |
183 |
184 |
185 | h1
186 |
187 | 5001
188 |
189 |
190 |
191 | 383932
192 |
193 |
194 |
195 |
196 | 383932
197 |
198 |
199 |
200 |
201 |
202 | 383932
203 |
204 |
205 |
206 |
207 |
208 | 1
209 |
210 | positivSkattekostnad
211 |
212 |
213 |
214 | 84465
215 |
216 |
217 |
218 |
219 |
220 | 84465
221 |
222 |
223 |
224 |
225 |
226 | fullRegnskapsplikt
227 |
228 |
229 | 2023-01-01T00:00:00.000Z
230 | 2023-12-31T23:59:59.000Z
231 |
232 |
233 | oevrigSelskap
234 |
235 |
236 | regnskapslovensAlminneligeRegler
237 |
238 |
239 |
240 |
241 |
242 | 314940
243 |
244 |
245 |
246 |
247 | 299467
248 |
249 |
250 |
251 |
252 | 300000
253 |
254 |
255 |
256 | EK1
257 |
258 | aaretsOverskudd
259 |
260 |
261 |
262 | 299467
263 |
264 |
265 |
266 |
267 | EK2
268 |
269 | avsattEllerForventetUtbytte
270 |
271 |
272 |
273 | 300000
274 |
275 |
276 |
277 |
278 |
279 | 314407
280 |
281 |
282 |
283 | false
284 |
285 |
--------------------------------------------------------------------------------
/2024/naeringsspesifikasjon.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 1442927932
5 | 2024
6 |
7 |
8 |
9 |
10 | 1587535
11 |
12 |
13 |
14 |
15 |
16 |
17 | 1587535
18 |
19 |
20 | 3000
21 |
22 | 3000
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | 1118032
31 |
32 |
33 |
34 |
35 |
36 |
37 | 1118032
38 |
39 |
40 | 6000
41 |
42 | 6000
43 |
44 |
45 |
46 |
47 |
48 |
49 | 25586
50 |
51 |
52 |
53 |
54 | 1682
55 |
56 |
57 |
58 |
59 | 108549
60 |
61 |
62 |
63 |
64 |
65 |
66 | 25586
67 |
68 |
69 | 8050
70 |
71 | 8050
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 | 1682
80 |
81 |
82 | 8115
83 |
84 | 8115
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 | 108549
93 |
94 |
95 | 8300
96 |
97 | 8300
98 |
99 |
100 |
101 |
102 |
103 | 384858
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 | 1312556
112 |
113 |
114 |
115 |
116 | 1900
117 |
118 |
119 | 1312556
120 |
121 |
122 |
123 | 1900
124 |
125 |
126 | true
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 | 983291
135 |
136 |
137 |
138 |
139 | 329265
140 |
141 |
142 |
143 |
144 | 2400
145 |
146 |
147 | 983291
148 |
149 |
150 |
151 | 2400
152 |
153 |
154 | true
155 |
156 |
157 |
158 |
159 |
160 | 2050
161 |
162 |
163 | 329265
164 |
165 |
166 |
167 | 2050
168 |
169 |
170 |
171 |
172 |
173 |
174 | 1312556
175 |
176 |
177 |
178 |
179 | 1312556
180 |
181 |
182 |
183 |
184 |
185 | h1
186 |
187 | 5001
188 |
189 |
190 |
191 | 493407
192 |
193 |
194 |
195 |
196 | 493407
197 |
198 |
199 |
200 |
201 |
202 | 493407
203 |
204 |
205 |
206 |
207 |
208 | 1
209 |
210 | positivSkattekostnad
211 |
212 |
213 |
214 | 108549
215 |
216 |
217 |
218 |
219 |
220 | 108549
221 |
222 |
223 |
224 |
225 |
226 | fullRegnskapsplikt
227 |
228 |
229 | 2024-01-01
230 | 2024-12-31
231 |
232 |
233 | oevrigSelskap
234 |
235 |
236 | regnskapslovensAlminneligeRegler
237 |
238 |
239 |
240 |
241 |
242 | 314407
243 |
244 |
245 |
246 |
247 | 384858
248 |
249 |
250 |
251 |
252 | 400000
253 |
254 |
255 |
256 | EK1
257 |
258 | aaretsOverskudd
259 |
260 |
261 |
262 | 384858
263 |
264 |
265 |
266 |
267 | EK2
268 |
269 | avsattEllerForventetUtbytte
270 |
271 |
272 |
273 | 400000
274 |
275 |
276 |
277 |
278 |
279 | 299265
280 |
281 |
282 |
283 | false
284 |
285 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright [yyyy] [name of copyright owner]
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Skattemelding
2 |
3 | ## Nødvendige tilgangar
4 |
5 | For å få tilgang til å kunne levere skattemelding må du sende epost til servicedesk@digdir.no og be om at ditt organisasjonsnummer blir registrert i Samarbeidsportalen. Når det er på plass må du sende epost til skattemelding-sbs-brukerstotte@skatteetaten.no og be om tilgang til scope for levering av skattemelding for det gitte organisasjonsnummeret.
6 |
7 | ## Lokal køyring
8 |
9 | Sett opp ein tunnel frå https://mac.tail31c54.ts.net til http://localhost:12345 slik:
10 |
11 | ```bash
12 | tailscale funnel 12345
13 | ```
14 |
15 | ```bash
16 | RUST_LOG=info cargo watch -x run
17 | ```
18 |
19 | ## Spesifikasjon av prosess
20 |
21 | Finn endpoints her:
22 |
23 | https://idporten.no/.well-known/openid-configuration
24 |
25 | Dokumentasjon her:
26 |
27 | https://skatteetaten.github.io/mva-meldingen/english/idportenauthentication/#example-of-integration
28 |
29 | OAuth2 klient må inn her:
30 | https://sjolvbetjening.samarbeid.digdir.no/integrations
31 |
32 | Det fungerer ikkje med redirect URL som inneheld "local" eller "127.0.0.1". Så applikasjonen må enten køyre på ein server eller få eit dynamisk DNS-navn. Sistnemnte kan ordnast med Tailscale slik:
33 |
34 | ```bash
35 | tailscale funnel 12345
36 | ```
37 |
38 | Redirect URL må dessutan innehalde portnummeret, så det blir til dømes https://mac.tailnnn.ts.net:443/token.
39 |
40 | Klientkonfigurasjonen må også ha følgande:
41 |
42 | - Difi-tjeneste: API-klient
43 | - Scopes: openid og skatteetaten:formueinntekt/skattemelding
44 | - Klientautentiseringsmetode: client_secret_basic
45 | - Applikasjonstype: web
46 | - PKCE: S256
47 |
48 | OAuth2 authorize:
49 |
50 | https://login.idporten.no/authorize?scope=skatteetaten%3Aformueinntekt%2Fskattemelding%20openid&client_id=4060f6d4-28ab-410d-bf14-edd62aa88dcf&redirect_uri=https%3A%2F%2Fmac.tail31c54.ts.net%3A443%2Ftoken&response_type=code&state=SgNdr4kEG_EJOptKwlwg5Q&nonce=1678988024798240&code_challenge=aFA1OAxhLtolRAYbYn0xqFUXvGncijKuXYOSQnltsaY&code_challenge_method=S256&ui_locales=nb
51 |
52 | Retur:
53 | https://mac.tail31c54.ts.net:443/token?code=5GyjYSmPkZAINh81\_\_DSVwHBMTNTM8U8UeVkbCv-2j0&state=SgNdr4kEG_EJOptKwlwg5Q
54 |
55 | POST https://idporten.no/token
56 |
57 | Retur:
58 | {
59 | "access*token": "ey..OQ",
60 | "id_token": "ey..QA",
61 | "token_type": "Bearer",
62 | "expires_in": 119,
63 | "refresh_token": "L*..uo",
64 | "scope": "openid skatteetaten:formueinntekt/skattemelding"
65 | }
66 |
67 | Hent utkast:
68 | GET https://idporten.api.skatteetaten.no/api/skattemelding/v2/utkast/2022/999579922
69 | {'Authorization': 'Bearer ' + js['access_token']}
70 |
71 | Retur:
72 |
73 |
74 |
75 | SKI:755:338422757
76 | utf-8
77 | PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c2thdHRlbWVsZGluZyB4bWxucz0idXJuOm5vOnNrYXR0ZWV0YXRlbjpmYXN0c2V0dGluZzpmb3JtdWVpbm50ZWt0OnNrYXR0ZW1lbGRpbmc6dXBlcnNvbmxpZzpla3N0ZXJuOnYyIj48cGFydHNudW1tZXI+MTQ0MjkyNzkzMjwvcGFydHNudW1tZXI+PGlubnRla3RzYWFyPjIwMjI8L2lubnRla3RzYWFyPjwvc2thdHRlbWVsZGluZz4=
78 | skattemeldingUpersonligUtkast
79 |
80 |
81 |
82 |
83 | er dokumentidentifikator.
84 |
85 | Hent gjeldende:
86 | GET https://idporten.api.skatteetaten.no/api/skattemelding/v2/2022/999579922
87 | {'Authorization': 'Bearer ' + js['access_token']}
88 |
89 | Retur:
90 |
91 |
92 |
93 | SKI:755:338422757
94 | utf-8
95 | PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c2thdHRlbWVsZGluZyB4bWxucz0idXJuOm5vOnNrYXR0ZWV0YXRlbjpmYXN0c2V0dGluZzpmb3JtdWVpbm50ZWt0OnNrYXR0ZW1lbGRpbmc6dXBlcnNvbmxpZzpla3N0ZXJuOnYyIj48cGFydHNudW1tZXI+MTQ0MjkyNzkzMjwvcGFydHNudW1tZXI+PGlubnRla3RzYWFyPjIwMjI8L2lubnRla3RzYWFyPjwvc2thdHRlbWVsZGluZz4=
96 | skattemeldingUpersonligUtkast
97 |
98 |
99 |
100 |
101 | Hent fastsatt (etter levering og behandling):
102 | GET https://idporten.api.skatteetaten.no/api/skattemelding/v2/fastsatt/2022/999579922
103 | {'Authorization': 'Bearer ' + js['access_token']}
104 |
105 | Base64 decode :
106 |
107 | 14429279322022
108 |
109 | trengs seinare.
110 |
111 | Base64 encode skattemelding.xml og naeringsspesifikasjon.xml og lag melding som dette:
112 |
113 | naering_as = """
114 |
115 |
116 |
117 |
118 |
119 | skattemeldingUpersonlig
120 | utf-8
121 | PD..4=
122 |
123 |
124 | naeringsspesifikasjon
125 | utf-8
126 | PD..4=
127 |
128 |
129 |
130 | skattemeldingUpersonlig
131 | SKI:755:338422757
132 |
133 | 2022
134 |
135 | komplett
136 | Tor Hovland
137 |
138 |
139 | """
140 |
141 | Valider med meldinga over som XML body:
142 | POST https://idporten.api.skatteetaten.no/api/skattemelding/v2/valider/2022/999579922
143 | {'Authorization': 'Bearer ' + js['access_token']}
144 | header["Content-Type"] = "application/xml"
145 |
146 | Retur:
147 |
148 |
149 |
150 | skattemeldingUpersonligEtterBeregning
151 | utf-8
152 | PD..c+
153 |
154 |
155 | naeringsspesifikasjonEtterBeregning
156 | utf-8
157 | PD..==
158 |
159 |
160 | beregnetSkattUpersonlig
161 | utf-8
162 | PD..==
163 |
164 |
165 | summertSkattegrunnlagForVisningUpersonlig
166 | utf-8
167 | PD..4=
168 |
169 |
170 |
171 |
172 | avvikSkattemelding
173 | global
174 | 344940
175 | 44054
176 | 300886
177 | verdsettingAvAksje/samletVerdiBakAksjeneISelskapet/beloep/beloepSomHeltall
178 |
179 |
180 | avvikNaeringsopplysninger
181 | global
182 | 314940
183 | 269625
184 | 45315
185 | egenkapitalavstemming/utgaaendeEgenkapital/beloep/beloep
186 |
187 |
188 |
189 |
190 | N*AVVIK*ÅRSRESULTAT_EGENKAPITALAVSTEMMING
191 | global
192 | Det er avvik mellom årsresultat og årets overskudd eller årets underskudd i egenkapitalavstemmingen.
193 | merknadStandard
194 | resultatregnskap/aarsresultat/beloep/beloep
195 |
196 |
197 | N_AVVIK_TILBAKEFØRT_SKATTEKOSTNAD
198 | global
199 | Det er avvik mellom sum skattekostnad i resultatregnskapet og tilbakeført skattekostnad i permanente forskjeller.
200 | merknadStandard
201 | resultatregnskap/sumSkattekostnad/beloep/beloep
202 |
203 |
204 | validertMedFeil
205 | avvikSkattemelding
206 | avvikNaeringsopplysninger
207 |
208 | true
209 | false
210 | false
211 | false
212 | false
213 | false
214 |
215 |
216 |
217 | I tilfelle valideringsfeil, sjekk om det er kome nye XSD-filer her:
218 | https://github.com/Skatteetaten/skattemeldingen/tree/master/src/resources/xsd
219 |
220 | Sjekk validering for eksempel her:
221 | https://www.freeformatter.com/xml-validator-xsd.html
222 |
223 | Hent Altinn-token
224 | GET https://platform.altinn.no/authentication/api/v1/exchange/id-porten
225 | {'Authorization': 'Bearer ' + js['access_token']}
226 |
227 | Retur:
228 | ey..EQ
229 |
230 | Lag skattemeldingsinstans med JSON som body:
231 | POST https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/
232 | altinn_header = {"Authorization": "Bearer " + r.text}
233 | {"instanceOwner": {"organisationNumber": '999579922'},
234 | "appOwner": {
235 | "labels": ["gr", "x2"]
236 | }, "appId": "skd/formueinntekt-skattemelding-v2", "dueBefore": "2023-04-16", "visibleAfter": "2023-03-16",
237 | "title": {"nb": "Skattemelding"}, "dataValues": {"inntektsaar": "2022"}}
238 |
239 | Retur:
240 | {
241 | "id": "60271338/d1ba8c2b-f424-44a6-b888-8425c202b810",
242 | "instanceOwner": {
243 | "partyId": "60271338",
244 | "personNumber": null,
245 | "organisationNumber": "999579922",
246 | "username": null
247 | },
248 | "appId": "skd/formueinntekt-skattemelding-v2",
249 | "org": "skd",
250 | "selfLinks": {
251 | "apps": "https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810",
252 | "platform": "https://platform.altinn.no/storage/api/v1/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810"
253 | },
254 | "dueBefore": "2023-04-16T00:00:00Z",
255 | "visibleAfter": "2023-03-16T00:00:00Z",
256 | "process": {
257 | "started": "2023-03-16T19:46:01.8526919Z",
258 | "startEvent": "StartEvent_1",
259 | "currentTask": {
260 | "flow": 2,
261 | "started": "2023-03-16T19:46:01.9580344Z",
262 | "elementId": "Task_1",
263 | "name": "Utfylling",
264 | "altinnTaskType": "data",
265 | "ended": null,
266 | "validated": null,
267 | "flowType": "CompleteCurrentMoveToNext"
268 | },
269 | "ended": null,
270 | "endEvent": null
271 | },
272 | "status": {
273 | "isArchived": false,
274 | "archived": null,
275 | "isSoftDeleted": false,
276 | "softDeleted": null,
277 | "isHardDeleted": false,
278 | "hardDeleted": null,
279 | "readStatus": 1,
280 | "substatus": null
281 | },
282 | "completeConfirmations": null,
283 | "data": [
284 | {
285 | "id": "bd0d0fd7-73c9-46c5-a9fb-33dafe61f26f",
286 | "instanceGuid": "d1ba8c2b-f424-44a6-b888-8425c202b810",
287 | "dataType": "Skattemeldingsapp_v2",
288 | "filename": null,
289 | "contentType": "application/xml",
290 | "blobStoragePath": "skd/formueinntekt-skattemelding-v2/d1ba8c2b-f424-44a6-b888-8425c202b810/data/bd0d0fd7-73c9-46c5-a9fb-33dafe61f26f",
291 | "selfLinks": {
292 | "apps": "https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810/data/bd0d0fd7-73c9-46c5-a9fb-33dafe61f26f",
293 | "platform": "https://platform.altinn.no/storage/api/v1/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810/data/bd0d0fd7-73c9-46c5-a9fb-33dafe61f26f"
294 | },
295 | "size": 246,
296 | "contentHash": null,
297 | "locked": false,
298 | "refs": [],
299 | "isRead": true,
300 | "tags": [],
301 | "deleteStatus": null,
302 | "fileScanResult": "Pending",
303 | "created": "2023-03-16T19:46:02.1542743Z",
304 | "createdBy": "481908",
305 | "lastChanged": "2023-03-16T19:46:02.1542743Z",
306 | "lastChangedBy": "481908"
307 | }
308 | ],
309 | "presentationTexts": {
310 | "inntektsaar": "2022"
311 | },
312 | "dataValues": {
313 | "inntektsaar": "2022"
314 | },
315 | "created": "2023-03-16T19:46:02.0092026Z",
316 | "createdBy": "481908",
317 | "lastChanged": "2023-03-16T19:46:02.0092026Z",
318 | "lastChangedBy": "481908"
319 | }
320 |
321 | Last opp skattemelding:
322 | POST https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810/data?dataType=skattemeldingOgNaeringsspesifikasjon
323 | altinn_header = {"Authorization": "Bearer " + r.text}
324 | "content-type" = "text/xml"
325 | "Content-Disposition" = "attachment; filename=skattemelding.xml"
326 |
327 | req_bekreftelse = endre_prosess_status(instans_data, altinn_header, "next", appnavn=altinn3_applikasjon)
328 | def endre_prosess_status(instans_data: dict, token: dict, neste_status: str,
329 | appnavn: str = "skd/formueinntekt-skattemelding-v2") -> str:
330 | if neste_status not in ["start", "next", "completeProcess"]:
331 | raise NotImplementedError
332 |
333 | url = f"{ALTINN_URL}/{appnavn}/instances/{instans_data['id']}/process/{neste_status}"
334 | r = requests.put(url, headers=token, verify=False)
335 | r.raise_for_status()
336 | return r.text
337 |
338 | Sett status klar til bekreftelse:
339 | PUT https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/60271338/d1ba8c2b-f424-44a6-b888-8425c202b810/process/next
340 | altinn_header = {"Authorization": "Bearer " + r.text}
341 |
342 | ### Åpner skattemelding visningsklient for å se beregnet skattemelding med næringsspesifikasjon.
343 |
344 | from skatteetaten_api import skattemelding_visning
345 |
346 | url_skattemelding_visning = skattemelding_visning(instans_data, appnavn=altinn3_applikasjon)
347 | print(url_skattemelding_visning)
348 |
349 | ### Sett statusen klar til henting av skatteetaten.
350 |
351 | req_bekreftelse = endre_prosess_status(instans_data, altinn_header, "next", appnavn=altinn3_applikasjon)
352 | req_bekreftelse
353 |
354 | ### Se innsending i Altinn
355 |
--------------------------------------------------------------------------------
/src/main.rs:
--------------------------------------------------------------------------------
1 | use anyhow::{anyhow, Result};
2 | use axum::{
3 | debug_handler,
4 | extract::{Query, State},
5 | response::{Html, Redirect},
6 | routing::get,
7 | Router,
8 | };
9 | use chrono::{Datelike, Utc};
10 | use serde::{Deserialize, Serialize};
11 | use std::{error::Error, fs, net::SocketAddr, str};
12 | use tera::{Context, Tera};
13 | use tower_sessions::{cookie::time::Duration, Expiry, MemoryStore, Session, SessionManagerLayer};
14 |
15 | use crate::{
16 | base64::{decode, encode},
17 | error::{AppError, ErrorResponse},
18 | file::{read_naeringsspesifikasjon, read_skattemelding},
19 | http::post,
20 | jwt::{IdToken, TokenResponse},
21 | xml::{to_xml, XmlElement, XmlNode},
22 | };
23 |
24 | mod base64;
25 | mod error;
26 | mod file;
27 | mod http;
28 | mod jwt;
29 | mod xml;
30 |
31 | const ACCESS_TOKEN: &str = "access_token";
32 | const ID_TOKEN: &str = "id_token";
33 | const KONVOLUTT: &str = "konvolutt";
34 |
35 | #[derive(Clone)]
36 | pub struct Config {
37 | pub tera: Tera,
38 | pub client_id: String,
39 | pub client_secret: String,
40 | pub redirect_uri: String,
41 | pub pkce_code_challenge: String,
42 | pub pkce_verifier_secret: String,
43 | pub org_number: String,
44 | pub year: i32,
45 | }
46 |
47 | #[tokio::main]
48 | async fn main() -> Result<(), Box> {
49 | tracing_subscriber::fmt::init();
50 |
51 | let tera = Tera::new("templates/**/*.html")?;
52 |
53 | const CLIENT_SECRET_FILE_NAME: &str = "client_secret.txt";
54 | const PKCE_VERIFIER_SECRET_FILE_NAME: &str = "pkce_verifier_secret.txt";
55 |
56 | tracing::info!("Reading secrets");
57 | // TODO: Deduplicate reading of secrets
58 | let client_secret = fs::read_to_string(CLIENT_SECRET_FILE_NAME)?
59 | .trim()
60 | .to_string();
61 | let pkce_verifier_secret = fs::read_to_string(PKCE_VERIFIER_SECRET_FILE_NAME)?
62 | .trim()
63 | .to_string();
64 |
65 | let session_store = MemoryStore::default();
66 |
67 | let session_layer = SessionManagerLayer::new(session_store)
68 | .with_secure(false)
69 | .with_expiry(Expiry::OnInactivity(Duration::seconds(600)));
70 |
71 | let config = Config {
72 | tera,
73 | client_id: "4060f6d4-28ab-410d-bf14-edd62aa88dcf".to_string(),
74 | client_secret,
75 | redirect_uri: "https://mac.tail31c54.ts.net:443/token".to_string(),
76 | pkce_code_challenge: "aFA1OAxhLtolRAYbYn0xqFUXvGncijKuXYOSQnltsaY".to_string(),
77 | pkce_verifier_secret,
78 | org_number: "999579922".to_string(),
79 | year: Utc::now().date_naive().year() - 1,
80 | };
81 |
82 | let app = Router::new()
83 | .route("/", get(index))
84 | .route("/logginn", get(logginn))
85 | .route("/token", get(token))
86 | .route("/altinn", get(altinn))
87 | .layer(session_layer)
88 | .with_state(config);
89 |
90 | let addr = SocketAddr::from(([127, 0, 0, 1], 12345));
91 | tracing::info!("listening on {}", addr);
92 | axum_server::Server::bind(addr)
93 | .serve(app.into_make_service())
94 | .await?;
95 |
96 | Ok(())
97 | }
98 |
99 | #[debug_handler]
100 | async fn index(State(config): State, session: Session) -> Result, AppError> {
101 | let access_token: Option = session.get(ACCESS_TOKEN).await?;
102 | let id_token: Option = session.get(ID_TOKEN).await?;
103 |
104 | match (access_token, id_token) {
105 | (Some(access_token), Some(id_token)) => {
106 | let pid = IdToken::from_str(&id_token)?.pid;
107 |
108 | let utkast = http::get_text(
109 | &format!(
110 | "https://idporten.api.skatteetaten.no/api/skattemelding/v2/utkast/{}/{}",
111 | config.year, config.org_number
112 | ),
113 | &access_token,
114 | )
115 | .await?;
116 |
117 | tracing::info!("Utkast: {utkast}");
118 |
119 | let gjeldende = http::get_text(
120 | &format!(
121 | "https://idporten.api.skatteetaten.no/api/skattemelding/v2/{}/{}",
122 | config.year, config.org_number
123 | ),
124 | &access_token,
125 | )
126 | .await?;
127 |
128 | tracing::info!("Gjeldende: {gjeldende}");
129 |
130 | let fastsatt = http::get_text(
131 | &format!(
132 | "https://idporten.api.skatteetaten.no/api/skattemelding/v2/fastsatt/{}/{}",
133 | config.year, config.org_number
134 | ),
135 | &access_token,
136 | )
137 | .await;
138 |
139 | let er_fastsatt = if let Ok(fastsatt) = fastsatt {
140 | tracing::info!("Fastsatt: {fastsatt}");
141 | true
142 | } else {
143 | tracing::info!("Ingen fastsetting per no.");
144 | false
145 | };
146 |
147 | let gjeldende_xml = to_xml(&gjeldende)?;
148 | let skattemeldingdokument = gjeldende_xml
149 | .child("dokumenter")?
150 | .child("skattemeldingdokument")?;
151 |
152 | let dok_ref = skattemeldingdokument.child("id")?.text()?;
153 | let content_base64 = &skattemeldingdokument.child("content")?.text()?;
154 | let content = decode(content_base64)?;
155 |
156 | let content_xml = to_xml(&content)?;
157 | let partsnummer = content_xml.child("partsnummer")?.text()?;
158 |
159 | let skattemelding = read_skattemelding(config.year)?;
160 | let skattemelding_base64 = encode(&skattemelding);
161 |
162 | let naeringsspesifikasjon = read_naeringsspesifikasjon(config.year)?;
163 | let naeringsspesifikasjon_base64 = encode(&naeringsspesifikasjon);
164 |
165 | let konvolutt = format!(
166 | r#"
167 |
168 |
169 |
170 | skattemeldingUpersonlig
171 | utf-8
172 | {}
173 |
174 |
175 | naeringsspesifikasjon
176 | utf-8
177 | {}
178 |
179 |
180 |
181 | skattemeldingUpersonlig
182 | {}
183 |
184 | {}
185 |
186 | komplett
187 | Tor Hovland
188 |
189 | "#,
190 | skattemelding_base64, naeringsspesifikasjon_base64, dok_ref, config.year
191 | );
192 |
193 | tracing::debug!("Konvolutt: {konvolutt}");
194 | session.insert(KONVOLUTT, konvolutt.clone()).await?;
195 |
196 | let validation_response = post(
197 | &format!(
198 | "https://idporten.api.skatteetaten.no/api/skattemelding/v2/valider/{}/{}",
199 | config.year, config.org_number
200 | ),
201 | Some(&access_token),
202 | )
203 | .header("Content-Type", "application/xml")
204 | .body(konvolutt)
205 | .send()
206 | .await?
207 | .error_for_status()?
208 | .text()
209 | .await?;
210 |
211 | tracing::info!("Validation response: {}", validation_response);
212 |
213 | let validation_xml = to_xml(&validation_response)?;
214 | let validation = validation_xml.format()?;
215 |
216 | let dokumenter = validation_xml.child("dokumenter");
217 |
218 | let dokumenter = if let Ok(dokumenter) = dokumenter {
219 | dokumenter
220 | .children
221 | .iter()
222 | .map(|d| {
223 | let encoded = d.element()?.child("content")?.text()?;
224 | let decoded = decode(&encoded)?;
225 | let xml = to_xml(&decoded)?;
226 | xml.format()
227 | })
228 | .collect::>>()?
229 | } else {
230 | vec![]
231 | };
232 |
233 | Ok(Html(config.tera.render(
234 | "validation.html",
235 | &Context::from_serialize(Validation {
236 | pid,
237 | dok_ref: &dok_ref,
238 | partsnummer: &partsnummer,
239 | validation: &validation,
240 | dokumenter,
241 | er_fastsatt,
242 | })?,
243 | )?))
244 | }
245 | _ => Ok(Html(config.tera.render("guest.html", &Context::new())?)),
246 | }
247 | }
248 |
249 | async fn logginn(State(config): State) -> Redirect {
250 | // TODO: Look authorize URL up in https://idporten.no/.well-known/openid-configuration
251 | let uri = format!("https://login.idporten.no/authorize?scope=skatteetaten%3Aformueinntekt%2Fskattemelding%20openid&client_id={}&redirect_uri={}&response_type=code&state=SgNdr4kEG_EJOptKwlwg5Q&nonce=1678988024798240&code_challenge={}&code_challenge_method=S256&ui_locales=nb",
252 | config.client_id,
253 | // TODO: Use config.redirect_uri, and URL encode it
254 | "https%3A%2F%2Fmac.tail31c54.ts.net%3A443%2Ftoken",
255 | config.pkce_code_challenge);
256 |
257 | Redirect::permanent(&uri)
258 | }
259 |
260 | /// Using client defined at
261 | /// https://selvbetjening-samarbeid-prod.difi.no/integrations
262 | async fn token(
263 | State(config): State,
264 | session: Session,
265 | Query(query_params): Query,
266 | ) -> Result {
267 | let form_params = [
268 | ("grant_type", "authorization_code".to_string()),
269 | ("client_id", config.client_id.clone()),
270 | ("client_secret", config.client_secret.clone()),
271 | ("code_verifier", config.pkce_verifier_secret.clone()),
272 | ("code", query_params.code),
273 | ("redirect_uri", config.redirect_uri.clone()),
274 | ];
275 |
276 | tracing::info!("Token request params: {:#?}", form_params);
277 | tracing::info!(
278 | "Basic auth: {}:{}",
279 | config.client_id.clone(),
280 | config.client_secret.clone()
281 | );
282 |
283 | let response = post("https://idporten.no/token", None)
284 | .basic_auth(config.client_id.clone(), Some(config.client_secret.clone()))
285 | .form(&form_params)
286 | .send()
287 | .await?;
288 |
289 | let response_status = response.status();
290 | let response_body = response.text().await?.clone();
291 |
292 | match response_status {
293 | reqwest::StatusCode::OK => {
294 | tracing::info!("Token response: {}", &response_body);
295 |
296 | let token_response: Result = serde_json::from_str(&response_body);
297 |
298 | match token_response {
299 | Ok(token_response) => {
300 | tracing::info!("Access token: {}", token_response.access_token);
301 | tracing::info!("Id token: {}", token_response.id_token);
302 |
303 | session
304 | .insert(ACCESS_TOKEN, token_response.access_token)
305 | .await?;
306 | session.insert(ID_TOKEN, token_response.id_token).await?;
307 |
308 | Ok(Redirect::permanent("/"))
309 | }
310 | Err(_) => {
311 | let error_response: Result =
312 | serde_json::from_str(&response_body);
313 |
314 | match error_response {
315 | Ok(error_response) => Err((anyhow!(
316 | "{}: {}",
317 | error_response.error,
318 | error_response.error_description
319 | ))
320 | .into()),
321 | _ => Err(anyhow!("Could not understand token response").into()),
322 | }
323 | }
324 | }
325 | }
326 | _ => {
327 | tracing::error!("Token error response: {}", &response_body);
328 |
329 | Err((anyhow!(
330 | "HTTP {} from token endpoint:\n{}",
331 | &response_status,
332 | &response_body,
333 | ))
334 | .into())
335 | }
336 | }
337 | }
338 |
339 | async fn altinn(State(config): State, session: Session) -> Result {
340 | let access_token: Option = session.get(ACCESS_TOKEN).await?;
341 | let konvolutt: Option = session.get(KONVOLUTT).await?;
342 |
343 | tracing::info!("Access token: {access_token:?}");
344 |
345 | match (access_token, konvolutt) {
346 | (Some(access_token), Some(konvolutt)) => {
347 | let altinn_token = http::get(
348 | "https://platform.altinn.no/authentication/api/v1/exchange/id-porten",
349 | Some(&access_token),
350 | )
351 | .send()
352 | .await?
353 | .error_for_status()?
354 | .text()
355 | .await?;
356 |
357 | tracing::info!("Altinn token: {altinn_token}");
358 |
359 | let instances_response = http::get("https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/60271338/active", Some(&altinn_token))
360 | .send()
361 | .await?
362 | .error_for_status()?
363 | .text()
364 | .await?;
365 |
366 | tracing::info!("Altinn instances: {instances_response}");
367 |
368 | let instances: Vec = serde_json::from_str(&instances_response)?;
369 |
370 | for instance in instances {
371 | http::delete(&format!("https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/{}", instance.id), Some(&altinn_token))
372 | .send()
373 | .await?
374 | .error_for_status()?;
375 | }
376 |
377 | let body = format!("{{\"instanceOwner\": {{\"organisationNumber\": '{}'}},
378 | \"appOwner\": {{
379 | \"labels\": [\"gr\", \"x2\"]
380 | }}, \"appId\": \"skd/formueinntekt-skattemelding-v2\", \"dueBefore\": \"{}-12-31\", \"visibleAfter\": \"{}-01-01\",
381 | \"title\": {{\"nb\": \"Skattemelding\"}}, \"dataValues\": {{\"inntektsaar\": \"{}\"}}}}", config.org_number, config.year + 1, config.year + 1, config.year);
382 |
383 | tracing::info!("Posting new instance: {}", body);
384 |
385 | let instance_response = http::post(
386 | "https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances",
387 | Some(&altinn_token),
388 | )
389 | .header("Content-Type", "application/json")
390 | .body(body)
391 | .send()
392 | .await?
393 | .error_for_status()?
394 | .text()
395 | .await?;
396 |
397 | tracing::info!("Instance response: {}", instance_response);
398 |
399 | let instance: AltinnInstance = serde_json::from_str(&instance_response)?;
400 |
401 | let upload_response = http::post(&(format!("https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/{}/data?dataType=skattemeldingOgNaeringsspesifikasjon", instance.id)), Some(&altinn_token))
402 | .header("Content-Type", "text/xml")
403 | .header(
404 | "Content-Disposition",
405 | "attachment; filename=skattemelding.xml",
406 | )
407 | .body(konvolutt)
408 | .send()
409 | .await?
410 | .error_for_status()?
411 | .text()
412 | .await?;
413 |
414 | tracing::info!("Upload response: {}", upload_response);
415 |
416 | let endre_prosess_response = http::put(&(format!("https://skd.apps.altinn.no/skd/formueinntekt-skattemelding-v2/instances/{}/process/next", instance.id)), Some(&altinn_token))
417 | .send()
418 | .await?
419 | .error_for_status()?
420 | .text()
421 | .await?;
422 |
423 | tracing::info!("Endre prosess response: {}", endre_prosess_response);
424 |
425 | let url = format!("https://skatt.skatteetaten.no/web/skattemelding-visning/altinn?appId=skd/formueinntekt-skattemelding-v2&instansId={}", instance.id);
426 | tracing::info!("Går til visning på {url}");
427 |
428 | Ok(Redirect::permanent(&url))
429 | }
430 | _ => {
431 | tracing::warn!("Fant ingen access token");
432 | Ok(Redirect::permanent("/"))
433 | }
434 | }
435 | }
436 |
437 | #[derive(Debug, Deserialize)]
438 | struct QueryParams {
439 | code: String,
440 | }
441 |
442 | #[derive(Serialize)]
443 | struct Validation<'a> {
444 | pid: String,
445 | dok_ref: &'a str,
446 | partsnummer: &'a str,
447 | validation: &'a str,
448 | dokumenter: Vec,
449 | er_fastsatt: bool,
450 | }
451 |
452 | #[derive(Deserialize)]
453 | struct AltinnInstance {
454 | id: String,
455 | }
456 |
--------------------------------------------------------------------------------
/Cargo.lock:
--------------------------------------------------------------------------------
1 | # This file is automatically @generated by Cargo.
2 | # It is not intended for manual editing.
3 | version = 3
4 |
5 | [[package]]
6 | name = "addr2line"
7 | version = "0.24.2"
8 | source = "registry+https://github.com/rust-lang/crates.io-index"
9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
10 | dependencies = [
11 | "gimli",
12 | ]
13 |
14 | [[package]]
15 | name = "adler2"
16 | version = "2.0.0"
17 | source = "registry+https://github.com/rust-lang/crates.io-index"
18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
19 |
20 | [[package]]
21 | name = "aho-corasick"
22 | version = "1.1.3"
23 | source = "registry+https://github.com/rust-lang/crates.io-index"
24 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
25 | dependencies = [
26 | "memchr",
27 | ]
28 |
29 | [[package]]
30 | name = "android-tzdata"
31 | version = "0.1.1"
32 | source = "registry+https://github.com/rust-lang/crates.io-index"
33 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
34 |
35 | [[package]]
36 | name = "android_system_properties"
37 | version = "0.1.5"
38 | source = "registry+https://github.com/rust-lang/crates.io-index"
39 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
40 | dependencies = [
41 | "libc",
42 | ]
43 |
44 | [[package]]
45 | name = "anyhow"
46 | version = "1.0.95"
47 | source = "registry+https://github.com/rust-lang/crates.io-index"
48 | checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04"
49 |
50 | [[package]]
51 | name = "arc-swap"
52 | version = "1.7.1"
53 | source = "registry+https://github.com/rust-lang/crates.io-index"
54 | checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
55 |
56 | [[package]]
57 | name = "async-trait"
58 | version = "0.1.86"
59 | source = "registry+https://github.com/rust-lang/crates.io-index"
60 | checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d"
61 | dependencies = [
62 | "proc-macro2",
63 | "quote",
64 | "syn",
65 | ]
66 |
67 | [[package]]
68 | name = "atomic-waker"
69 | version = "1.1.2"
70 | source = "registry+https://github.com/rust-lang/crates.io-index"
71 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
72 |
73 | [[package]]
74 | name = "autocfg"
75 | version = "1.4.0"
76 | source = "registry+https://github.com/rust-lang/crates.io-index"
77 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
78 |
79 | [[package]]
80 | name = "axum"
81 | version = "0.7.9"
82 | source = "registry+https://github.com/rust-lang/crates.io-index"
83 | checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f"
84 | dependencies = [
85 | "async-trait",
86 | "axum-core",
87 | "axum-macros",
88 | "bytes",
89 | "futures-util",
90 | "http 1.2.0",
91 | "http-body 1.0.1",
92 | "http-body-util",
93 | "hyper 1.6.0",
94 | "hyper-util",
95 | "itoa",
96 | "matchit",
97 | "memchr",
98 | "mime",
99 | "percent-encoding",
100 | "pin-project-lite",
101 | "rustversion",
102 | "serde",
103 | "serde_json",
104 | "serde_path_to_error",
105 | "serde_urlencoded",
106 | "sync_wrapper 1.0.2",
107 | "tokio",
108 | "tower 0.5.2",
109 | "tower-layer",
110 | "tower-service",
111 | "tracing",
112 | ]
113 |
114 | [[package]]
115 | name = "axum-core"
116 | version = "0.4.5"
117 | source = "registry+https://github.com/rust-lang/crates.io-index"
118 | checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199"
119 | dependencies = [
120 | "async-trait",
121 | "bytes",
122 | "futures-util",
123 | "http 1.2.0",
124 | "http-body 1.0.1",
125 | "http-body-util",
126 | "mime",
127 | "pin-project-lite",
128 | "rustversion",
129 | "sync_wrapper 1.0.2",
130 | "tower-layer",
131 | "tower-service",
132 | "tracing",
133 | ]
134 |
135 | [[package]]
136 | name = "axum-macros"
137 | version = "0.4.2"
138 | source = "registry+https://github.com/rust-lang/crates.io-index"
139 | checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce"
140 | dependencies = [
141 | "proc-macro2",
142 | "quote",
143 | "syn",
144 | ]
145 |
146 | [[package]]
147 | name = "axum-server"
148 | version = "0.6.0"
149 | source = "registry+https://github.com/rust-lang/crates.io-index"
150 | checksum = "c1ad46c3ec4e12f4a4b6835e173ba21c25e484c9d02b49770bf006ce5367c036"
151 | dependencies = [
152 | "arc-swap",
153 | "bytes",
154 | "futures-util",
155 | "http 1.2.0",
156 | "http-body 1.0.1",
157 | "http-body-util",
158 | "hyper 1.6.0",
159 | "hyper-util",
160 | "pin-project-lite",
161 | "rustls",
162 | "rustls-pemfile 2.2.0",
163 | "tokio",
164 | "tokio-rustls",
165 | "tower 0.4.13",
166 | "tower-service",
167 | ]
168 |
169 | [[package]]
170 | name = "backtrace"
171 | version = "0.3.74"
172 | source = "registry+https://github.com/rust-lang/crates.io-index"
173 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
174 | dependencies = [
175 | "addr2line",
176 | "cfg-if",
177 | "libc",
178 | "miniz_oxide",
179 | "object",
180 | "rustc-demangle",
181 | "windows-targets 0.52.6",
182 | ]
183 |
184 | [[package]]
185 | name = "base64"
186 | version = "0.21.7"
187 | source = "registry+https://github.com/rust-lang/crates.io-index"
188 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
189 |
190 | [[package]]
191 | name = "base64"
192 | version = "0.22.1"
193 | source = "registry+https://github.com/rust-lang/crates.io-index"
194 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
195 |
196 | [[package]]
197 | name = "bitflags"
198 | version = "1.3.2"
199 | source = "registry+https://github.com/rust-lang/crates.io-index"
200 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
201 |
202 | [[package]]
203 | name = "bitflags"
204 | version = "2.8.0"
205 | source = "registry+https://github.com/rust-lang/crates.io-index"
206 | checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36"
207 |
208 | [[package]]
209 | name = "block-buffer"
210 | version = "0.10.4"
211 | source = "registry+https://github.com/rust-lang/crates.io-index"
212 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
213 | dependencies = [
214 | "generic-array",
215 | ]
216 |
217 | [[package]]
218 | name = "bstr"
219 | version = "1.11.3"
220 | source = "registry+https://github.com/rust-lang/crates.io-index"
221 | checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0"
222 | dependencies = [
223 | "memchr",
224 | "serde",
225 | ]
226 |
227 | [[package]]
228 | name = "bumpalo"
229 | version = "3.17.0"
230 | source = "registry+https://github.com/rust-lang/crates.io-index"
231 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
232 |
233 | [[package]]
234 | name = "byteorder"
235 | version = "1.5.0"
236 | source = "registry+https://github.com/rust-lang/crates.io-index"
237 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
238 |
239 | [[package]]
240 | name = "bytes"
241 | version = "1.10.0"
242 | source = "registry+https://github.com/rust-lang/crates.io-index"
243 | checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9"
244 |
245 | [[package]]
246 | name = "cc"
247 | version = "1.2.12"
248 | source = "registry+https://github.com/rust-lang/crates.io-index"
249 | checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2"
250 | dependencies = [
251 | "shlex",
252 | ]
253 |
254 | [[package]]
255 | name = "cfg-if"
256 | version = "1.0.0"
257 | source = "registry+https://github.com/rust-lang/crates.io-index"
258 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
259 |
260 | [[package]]
261 | name = "chrono"
262 | version = "0.4.39"
263 | source = "registry+https://github.com/rust-lang/crates.io-index"
264 | checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825"
265 | dependencies = [
266 | "android-tzdata",
267 | "iana-time-zone",
268 | "js-sys",
269 | "num-traits",
270 | "wasm-bindgen",
271 | "windows-targets 0.52.6",
272 | ]
273 |
274 | [[package]]
275 | name = "cookie"
276 | version = "0.18.1"
277 | source = "registry+https://github.com/rust-lang/crates.io-index"
278 | checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747"
279 | dependencies = [
280 | "percent-encoding",
281 | "time",
282 | "version_check",
283 | ]
284 |
285 | [[package]]
286 | name = "core-foundation"
287 | version = "0.9.4"
288 | source = "registry+https://github.com/rust-lang/crates.io-index"
289 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
290 | dependencies = [
291 | "core-foundation-sys",
292 | "libc",
293 | ]
294 |
295 | [[package]]
296 | name = "core-foundation-sys"
297 | version = "0.8.7"
298 | source = "registry+https://github.com/rust-lang/crates.io-index"
299 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
300 |
301 | [[package]]
302 | name = "cpufeatures"
303 | version = "0.2.17"
304 | source = "registry+https://github.com/rust-lang/crates.io-index"
305 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
306 | dependencies = [
307 | "libc",
308 | ]
309 |
310 | [[package]]
311 | name = "crossbeam-deque"
312 | version = "0.8.6"
313 | source = "registry+https://github.com/rust-lang/crates.io-index"
314 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
315 | dependencies = [
316 | "crossbeam-epoch",
317 | "crossbeam-utils",
318 | ]
319 |
320 | [[package]]
321 | name = "crossbeam-epoch"
322 | version = "0.9.18"
323 | source = "registry+https://github.com/rust-lang/crates.io-index"
324 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
325 | dependencies = [
326 | "crossbeam-utils",
327 | ]
328 |
329 | [[package]]
330 | name = "crossbeam-utils"
331 | version = "0.8.21"
332 | source = "registry+https://github.com/rust-lang/crates.io-index"
333 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
334 |
335 | [[package]]
336 | name = "crypto-common"
337 | version = "0.1.6"
338 | source = "registry+https://github.com/rust-lang/crates.io-index"
339 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
340 | dependencies = [
341 | "generic-array",
342 | "typenum",
343 | ]
344 |
345 | [[package]]
346 | name = "data-encoding"
347 | version = "2.7.0"
348 | source = "registry+https://github.com/rust-lang/crates.io-index"
349 | checksum = "0e60eed09d8c01d3cee5b7d30acb059b76614c918fa0f992e0dd6eeb10daad6f"
350 |
351 | [[package]]
352 | name = "deranged"
353 | version = "0.3.11"
354 | source = "registry+https://github.com/rust-lang/crates.io-index"
355 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
356 | dependencies = [
357 | "powerfmt",
358 | "serde",
359 | ]
360 |
361 | [[package]]
362 | name = "digest"
363 | version = "0.10.7"
364 | source = "registry+https://github.com/rust-lang/crates.io-index"
365 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
366 | dependencies = [
367 | "block-buffer",
368 | "crypto-common",
369 | ]
370 |
371 | [[package]]
372 | name = "displaydoc"
373 | version = "0.2.5"
374 | source = "registry+https://github.com/rust-lang/crates.io-index"
375 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
376 | dependencies = [
377 | "proc-macro2",
378 | "quote",
379 | "syn",
380 | ]
381 |
382 | [[package]]
383 | name = "encoding_rs"
384 | version = "0.8.35"
385 | source = "registry+https://github.com/rust-lang/crates.io-index"
386 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
387 | dependencies = [
388 | "cfg-if",
389 | ]
390 |
391 | [[package]]
392 | name = "equivalent"
393 | version = "1.0.1"
394 | source = "registry+https://github.com/rust-lang/crates.io-index"
395 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
396 |
397 | [[package]]
398 | name = "errno"
399 | version = "0.3.10"
400 | source = "registry+https://github.com/rust-lang/crates.io-index"
401 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
402 | dependencies = [
403 | "libc",
404 | "windows-sys 0.59.0",
405 | ]
406 |
407 | [[package]]
408 | name = "fastrand"
409 | version = "2.3.0"
410 | source = "registry+https://github.com/rust-lang/crates.io-index"
411 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
412 |
413 | [[package]]
414 | name = "fnv"
415 | version = "1.0.7"
416 | source = "registry+https://github.com/rust-lang/crates.io-index"
417 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
418 |
419 | [[package]]
420 | name = "foreign-types"
421 | version = "0.3.2"
422 | source = "registry+https://github.com/rust-lang/crates.io-index"
423 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
424 | dependencies = [
425 | "foreign-types-shared",
426 | ]
427 |
428 | [[package]]
429 | name = "foreign-types-shared"
430 | version = "0.1.1"
431 | source = "registry+https://github.com/rust-lang/crates.io-index"
432 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
433 |
434 | [[package]]
435 | name = "form_urlencoded"
436 | version = "1.2.1"
437 | source = "registry+https://github.com/rust-lang/crates.io-index"
438 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
439 | dependencies = [
440 | "percent-encoding",
441 | ]
442 |
443 | [[package]]
444 | name = "futures"
445 | version = "0.3.31"
446 | source = "registry+https://github.com/rust-lang/crates.io-index"
447 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
448 | dependencies = [
449 | "futures-channel",
450 | "futures-core",
451 | "futures-io",
452 | "futures-sink",
453 | "futures-task",
454 | "futures-util",
455 | ]
456 |
457 | [[package]]
458 | name = "futures-channel"
459 | version = "0.3.31"
460 | source = "registry+https://github.com/rust-lang/crates.io-index"
461 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
462 | dependencies = [
463 | "futures-core",
464 | "futures-sink",
465 | ]
466 |
467 | [[package]]
468 | name = "futures-core"
469 | version = "0.3.31"
470 | source = "registry+https://github.com/rust-lang/crates.io-index"
471 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
472 |
473 | [[package]]
474 | name = "futures-io"
475 | version = "0.3.31"
476 | source = "registry+https://github.com/rust-lang/crates.io-index"
477 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
478 |
479 | [[package]]
480 | name = "futures-macro"
481 | version = "0.3.31"
482 | source = "registry+https://github.com/rust-lang/crates.io-index"
483 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
484 | dependencies = [
485 | "proc-macro2",
486 | "quote",
487 | "syn",
488 | ]
489 |
490 | [[package]]
491 | name = "futures-sink"
492 | version = "0.3.31"
493 | source = "registry+https://github.com/rust-lang/crates.io-index"
494 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7"
495 |
496 | [[package]]
497 | name = "futures-task"
498 | version = "0.3.31"
499 | source = "registry+https://github.com/rust-lang/crates.io-index"
500 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
501 |
502 | [[package]]
503 | name = "futures-util"
504 | version = "0.3.31"
505 | source = "registry+https://github.com/rust-lang/crates.io-index"
506 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
507 | dependencies = [
508 | "futures-core",
509 | "futures-io",
510 | "futures-macro",
511 | "futures-sink",
512 | "futures-task",
513 | "memchr",
514 | "pin-project-lite",
515 | "pin-utils",
516 | "slab",
517 | ]
518 |
519 | [[package]]
520 | name = "generic-array"
521 | version = "0.14.7"
522 | source = "registry+https://github.com/rust-lang/crates.io-index"
523 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
524 | dependencies = [
525 | "typenum",
526 | "version_check",
527 | ]
528 |
529 | [[package]]
530 | name = "getrandom"
531 | version = "0.2.15"
532 | source = "registry+https://github.com/rust-lang/crates.io-index"
533 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
534 | dependencies = [
535 | "cfg-if",
536 | "libc",
537 | "wasi 0.11.0+wasi-snapshot-preview1",
538 | ]
539 |
540 | [[package]]
541 | name = "getrandom"
542 | version = "0.3.1"
543 | source = "registry+https://github.com/rust-lang/crates.io-index"
544 | checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8"
545 | dependencies = [
546 | "cfg-if",
547 | "libc",
548 | "wasi 0.13.3+wasi-0.2.2",
549 | "windows-targets 0.52.6",
550 | ]
551 |
552 | [[package]]
553 | name = "gimli"
554 | version = "0.31.1"
555 | source = "registry+https://github.com/rust-lang/crates.io-index"
556 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
557 |
558 | [[package]]
559 | name = "globset"
560 | version = "0.4.15"
561 | source = "registry+https://github.com/rust-lang/crates.io-index"
562 | checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19"
563 | dependencies = [
564 | "aho-corasick",
565 | "bstr",
566 | "log",
567 | "regex-automata 0.4.9",
568 | "regex-syntax 0.8.5",
569 | ]
570 |
571 | [[package]]
572 | name = "globwalk"
573 | version = "0.9.1"
574 | source = "registry+https://github.com/rust-lang/crates.io-index"
575 | checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757"
576 | dependencies = [
577 | "bitflags 2.8.0",
578 | "ignore",
579 | "walkdir",
580 | ]
581 |
582 | [[package]]
583 | name = "h2"
584 | version = "0.3.26"
585 | source = "registry+https://github.com/rust-lang/crates.io-index"
586 | checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8"
587 | dependencies = [
588 | "bytes",
589 | "fnv",
590 | "futures-core",
591 | "futures-sink",
592 | "futures-util",
593 | "http 0.2.12",
594 | "indexmap",
595 | "slab",
596 | "tokio",
597 | "tokio-util",
598 | "tracing",
599 | ]
600 |
601 | [[package]]
602 | name = "h2"
603 | version = "0.4.7"
604 | source = "registry+https://github.com/rust-lang/crates.io-index"
605 | checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e"
606 | dependencies = [
607 | "atomic-waker",
608 | "bytes",
609 | "fnv",
610 | "futures-core",
611 | "futures-sink",
612 | "http 1.2.0",
613 | "indexmap",
614 | "slab",
615 | "tokio",
616 | "tokio-util",
617 | "tracing",
618 | ]
619 |
620 | [[package]]
621 | name = "hashbrown"
622 | version = "0.15.2"
623 | source = "registry+https://github.com/rust-lang/crates.io-index"
624 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
625 |
626 | [[package]]
627 | name = "http"
628 | version = "0.2.12"
629 | source = "registry+https://github.com/rust-lang/crates.io-index"
630 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1"
631 | dependencies = [
632 | "bytes",
633 | "fnv",
634 | "itoa",
635 | ]
636 |
637 | [[package]]
638 | name = "http"
639 | version = "1.2.0"
640 | source = "registry+https://github.com/rust-lang/crates.io-index"
641 | checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea"
642 | dependencies = [
643 | "bytes",
644 | "fnv",
645 | "itoa",
646 | ]
647 |
648 | [[package]]
649 | name = "http-body"
650 | version = "0.4.6"
651 | source = "registry+https://github.com/rust-lang/crates.io-index"
652 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
653 | dependencies = [
654 | "bytes",
655 | "http 0.2.12",
656 | "pin-project-lite",
657 | ]
658 |
659 | [[package]]
660 | name = "http-body"
661 | version = "1.0.1"
662 | source = "registry+https://github.com/rust-lang/crates.io-index"
663 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
664 | dependencies = [
665 | "bytes",
666 | "http 1.2.0",
667 | ]
668 |
669 | [[package]]
670 | name = "http-body-util"
671 | version = "0.1.2"
672 | source = "registry+https://github.com/rust-lang/crates.io-index"
673 | checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f"
674 | dependencies = [
675 | "bytes",
676 | "futures-util",
677 | "http 1.2.0",
678 | "http-body 1.0.1",
679 | "pin-project-lite",
680 | ]
681 |
682 | [[package]]
683 | name = "httparse"
684 | version = "1.10.0"
685 | source = "registry+https://github.com/rust-lang/crates.io-index"
686 | checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a"
687 |
688 | [[package]]
689 | name = "httpdate"
690 | version = "1.0.3"
691 | source = "registry+https://github.com/rust-lang/crates.io-index"
692 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
693 |
694 | [[package]]
695 | name = "hyper"
696 | version = "0.14.32"
697 | source = "registry+https://github.com/rust-lang/crates.io-index"
698 | checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7"
699 | dependencies = [
700 | "bytes",
701 | "futures-channel",
702 | "futures-core",
703 | "futures-util",
704 | "h2 0.3.26",
705 | "http 0.2.12",
706 | "http-body 0.4.6",
707 | "httparse",
708 | "httpdate",
709 | "itoa",
710 | "pin-project-lite",
711 | "socket2",
712 | "tokio",
713 | "tower-service",
714 | "tracing",
715 | "want",
716 | ]
717 |
718 | [[package]]
719 | name = "hyper"
720 | version = "1.6.0"
721 | source = "registry+https://github.com/rust-lang/crates.io-index"
722 | checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80"
723 | dependencies = [
724 | "bytes",
725 | "futures-channel",
726 | "futures-util",
727 | "h2 0.4.7",
728 | "http 1.2.0",
729 | "http-body 1.0.1",
730 | "httparse",
731 | "httpdate",
732 | "itoa",
733 | "pin-project-lite",
734 | "smallvec",
735 | "tokio",
736 | ]
737 |
738 | [[package]]
739 | name = "hyper-tls"
740 | version = "0.5.0"
741 | source = "registry+https://github.com/rust-lang/crates.io-index"
742 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
743 | dependencies = [
744 | "bytes",
745 | "hyper 0.14.32",
746 | "native-tls",
747 | "tokio",
748 | "tokio-native-tls",
749 | ]
750 |
751 | [[package]]
752 | name = "hyper-util"
753 | version = "0.1.10"
754 | source = "registry+https://github.com/rust-lang/crates.io-index"
755 | checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4"
756 | dependencies = [
757 | "bytes",
758 | "futures-util",
759 | "http 1.2.0",
760 | "http-body 1.0.1",
761 | "hyper 1.6.0",
762 | "pin-project-lite",
763 | "tokio",
764 | "tower-service",
765 | ]
766 |
767 | [[package]]
768 | name = "iana-time-zone"
769 | version = "0.1.61"
770 | source = "registry+https://github.com/rust-lang/crates.io-index"
771 | checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
772 | dependencies = [
773 | "android_system_properties",
774 | "core-foundation-sys",
775 | "iana-time-zone-haiku",
776 | "js-sys",
777 | "wasm-bindgen",
778 | "windows-core",
779 | ]
780 |
781 | [[package]]
782 | name = "iana-time-zone-haiku"
783 | version = "0.1.2"
784 | source = "registry+https://github.com/rust-lang/crates.io-index"
785 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
786 | dependencies = [
787 | "cc",
788 | ]
789 |
790 | [[package]]
791 | name = "icu_collections"
792 | version = "1.5.0"
793 | source = "registry+https://github.com/rust-lang/crates.io-index"
794 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
795 | dependencies = [
796 | "displaydoc",
797 | "yoke",
798 | "zerofrom",
799 | "zerovec",
800 | ]
801 |
802 | [[package]]
803 | name = "icu_locid"
804 | version = "1.5.0"
805 | source = "registry+https://github.com/rust-lang/crates.io-index"
806 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
807 | dependencies = [
808 | "displaydoc",
809 | "litemap",
810 | "tinystr",
811 | "writeable",
812 | "zerovec",
813 | ]
814 |
815 | [[package]]
816 | name = "icu_locid_transform"
817 | version = "1.5.0"
818 | source = "registry+https://github.com/rust-lang/crates.io-index"
819 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e"
820 | dependencies = [
821 | "displaydoc",
822 | "icu_locid",
823 | "icu_locid_transform_data",
824 | "icu_provider",
825 | "tinystr",
826 | "zerovec",
827 | ]
828 |
829 | [[package]]
830 | name = "icu_locid_transform_data"
831 | version = "1.5.0"
832 | source = "registry+https://github.com/rust-lang/crates.io-index"
833 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e"
834 |
835 | [[package]]
836 | name = "icu_normalizer"
837 | version = "1.5.0"
838 | source = "registry+https://github.com/rust-lang/crates.io-index"
839 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
840 | dependencies = [
841 | "displaydoc",
842 | "icu_collections",
843 | "icu_normalizer_data",
844 | "icu_properties",
845 | "icu_provider",
846 | "smallvec",
847 | "utf16_iter",
848 | "utf8_iter",
849 | "write16",
850 | "zerovec",
851 | ]
852 |
853 | [[package]]
854 | name = "icu_normalizer_data"
855 | version = "1.5.0"
856 | source = "registry+https://github.com/rust-lang/crates.io-index"
857 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516"
858 |
859 | [[package]]
860 | name = "icu_properties"
861 | version = "1.5.1"
862 | source = "registry+https://github.com/rust-lang/crates.io-index"
863 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
864 | dependencies = [
865 | "displaydoc",
866 | "icu_collections",
867 | "icu_locid_transform",
868 | "icu_properties_data",
869 | "icu_provider",
870 | "tinystr",
871 | "zerovec",
872 | ]
873 |
874 | [[package]]
875 | name = "icu_properties_data"
876 | version = "1.5.0"
877 | source = "registry+https://github.com/rust-lang/crates.io-index"
878 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569"
879 |
880 | [[package]]
881 | name = "icu_provider"
882 | version = "1.5.0"
883 | source = "registry+https://github.com/rust-lang/crates.io-index"
884 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9"
885 | dependencies = [
886 | "displaydoc",
887 | "icu_locid",
888 | "icu_provider_macros",
889 | "stable_deref_trait",
890 | "tinystr",
891 | "writeable",
892 | "yoke",
893 | "zerofrom",
894 | "zerovec",
895 | ]
896 |
897 | [[package]]
898 | name = "icu_provider_macros"
899 | version = "1.5.0"
900 | source = "registry+https://github.com/rust-lang/crates.io-index"
901 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
902 | dependencies = [
903 | "proc-macro2",
904 | "quote",
905 | "syn",
906 | ]
907 |
908 | [[package]]
909 | name = "idna"
910 | version = "1.0.3"
911 | source = "registry+https://github.com/rust-lang/crates.io-index"
912 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
913 | dependencies = [
914 | "idna_adapter",
915 | "smallvec",
916 | "utf8_iter",
917 | ]
918 |
919 | [[package]]
920 | name = "idna_adapter"
921 | version = "1.2.0"
922 | source = "registry+https://github.com/rust-lang/crates.io-index"
923 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71"
924 | dependencies = [
925 | "icu_normalizer",
926 | "icu_properties",
927 | ]
928 |
929 | [[package]]
930 | name = "ignore"
931 | version = "0.4.23"
932 | source = "registry+https://github.com/rust-lang/crates.io-index"
933 | checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b"
934 | dependencies = [
935 | "crossbeam-deque",
936 | "globset",
937 | "log",
938 | "memchr",
939 | "regex-automata 0.4.9",
940 | "same-file",
941 | "walkdir",
942 | "winapi-util",
943 | ]
944 |
945 | [[package]]
946 | name = "indexmap"
947 | version = "2.7.1"
948 | source = "registry+https://github.com/rust-lang/crates.io-index"
949 | checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652"
950 | dependencies = [
951 | "equivalent",
952 | "hashbrown",
953 | ]
954 |
955 | [[package]]
956 | name = "ipnet"
957 | version = "2.11.0"
958 | source = "registry+https://github.com/rust-lang/crates.io-index"
959 | checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
960 |
961 | [[package]]
962 | name = "itoa"
963 | version = "1.0.14"
964 | source = "registry+https://github.com/rust-lang/crates.io-index"
965 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
966 |
967 | [[package]]
968 | name = "js-sys"
969 | version = "0.3.77"
970 | source = "registry+https://github.com/rust-lang/crates.io-index"
971 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
972 | dependencies = [
973 | "once_cell",
974 | "wasm-bindgen",
975 | ]
976 |
977 | [[package]]
978 | name = "lazy_static"
979 | version = "1.5.0"
980 | source = "registry+https://github.com/rust-lang/crates.io-index"
981 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
982 |
983 | [[package]]
984 | name = "libc"
985 | version = "0.2.169"
986 | source = "registry+https://github.com/rust-lang/crates.io-index"
987 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
988 |
989 | [[package]]
990 | name = "linux-raw-sys"
991 | version = "0.4.15"
992 | source = "registry+https://github.com/rust-lang/crates.io-index"
993 | checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
994 |
995 | [[package]]
996 | name = "litemap"
997 | version = "0.7.4"
998 | source = "registry+https://github.com/rust-lang/crates.io-index"
999 | checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104"
1000 |
1001 | [[package]]
1002 | name = "lock_api"
1003 | version = "0.4.12"
1004 | source = "registry+https://github.com/rust-lang/crates.io-index"
1005 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
1006 | dependencies = [
1007 | "autocfg",
1008 | "scopeguard",
1009 | "serde",
1010 | ]
1011 |
1012 | [[package]]
1013 | name = "log"
1014 | version = "0.4.25"
1015 | source = "registry+https://github.com/rust-lang/crates.io-index"
1016 | checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f"
1017 |
1018 | [[package]]
1019 | name = "matchers"
1020 | version = "0.1.0"
1021 | source = "registry+https://github.com/rust-lang/crates.io-index"
1022 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
1023 | dependencies = [
1024 | "regex-automata 0.1.10",
1025 | ]
1026 |
1027 | [[package]]
1028 | name = "matchit"
1029 | version = "0.7.3"
1030 | source = "registry+https://github.com/rust-lang/crates.io-index"
1031 | checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
1032 |
1033 | [[package]]
1034 | name = "memchr"
1035 | version = "2.7.4"
1036 | source = "registry+https://github.com/rust-lang/crates.io-index"
1037 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
1038 |
1039 | [[package]]
1040 | name = "mime"
1041 | version = "0.3.17"
1042 | source = "registry+https://github.com/rust-lang/crates.io-index"
1043 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
1044 |
1045 | [[package]]
1046 | name = "miniz_oxide"
1047 | version = "0.8.3"
1048 | source = "registry+https://github.com/rust-lang/crates.io-index"
1049 | checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924"
1050 | dependencies = [
1051 | "adler2",
1052 | ]
1053 |
1054 | [[package]]
1055 | name = "mio"
1056 | version = "1.0.3"
1057 | source = "registry+https://github.com/rust-lang/crates.io-index"
1058 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
1059 | dependencies = [
1060 | "libc",
1061 | "wasi 0.11.0+wasi-snapshot-preview1",
1062 | "windows-sys 0.52.0",
1063 | ]
1064 |
1065 | [[package]]
1066 | name = "native-tls"
1067 | version = "0.2.13"
1068 | source = "registry+https://github.com/rust-lang/crates.io-index"
1069 | checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c"
1070 | dependencies = [
1071 | "libc",
1072 | "log",
1073 | "openssl",
1074 | "openssl-probe",
1075 | "openssl-sys",
1076 | "schannel",
1077 | "security-framework",
1078 | "security-framework-sys",
1079 | "tempfile",
1080 | ]
1081 |
1082 | [[package]]
1083 | name = "nu-ansi-term"
1084 | version = "0.46.0"
1085 | source = "registry+https://github.com/rust-lang/crates.io-index"
1086 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
1087 | dependencies = [
1088 | "overload",
1089 | "winapi",
1090 | ]
1091 |
1092 | [[package]]
1093 | name = "num-conv"
1094 | version = "0.1.0"
1095 | source = "registry+https://github.com/rust-lang/crates.io-index"
1096 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
1097 |
1098 | [[package]]
1099 | name = "num-traits"
1100 | version = "0.2.19"
1101 | source = "registry+https://github.com/rust-lang/crates.io-index"
1102 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
1103 | dependencies = [
1104 | "autocfg",
1105 | ]
1106 |
1107 | [[package]]
1108 | name = "object"
1109 | version = "0.36.7"
1110 | source = "registry+https://github.com/rust-lang/crates.io-index"
1111 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
1112 | dependencies = [
1113 | "memchr",
1114 | ]
1115 |
1116 | [[package]]
1117 | name = "once_cell"
1118 | version = "1.20.2"
1119 | source = "registry+https://github.com/rust-lang/crates.io-index"
1120 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
1121 |
1122 | [[package]]
1123 | name = "openssl"
1124 | version = "0.10.70"
1125 | source = "registry+https://github.com/rust-lang/crates.io-index"
1126 | checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6"
1127 | dependencies = [
1128 | "bitflags 2.8.0",
1129 | "cfg-if",
1130 | "foreign-types",
1131 | "libc",
1132 | "once_cell",
1133 | "openssl-macros",
1134 | "openssl-sys",
1135 | ]
1136 |
1137 | [[package]]
1138 | name = "openssl-macros"
1139 | version = "0.1.1"
1140 | source = "registry+https://github.com/rust-lang/crates.io-index"
1141 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
1142 | dependencies = [
1143 | "proc-macro2",
1144 | "quote",
1145 | "syn",
1146 | ]
1147 |
1148 | [[package]]
1149 | name = "openssl-probe"
1150 | version = "0.1.6"
1151 | source = "registry+https://github.com/rust-lang/crates.io-index"
1152 | checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
1153 |
1154 | [[package]]
1155 | name = "openssl-sys"
1156 | version = "0.9.105"
1157 | source = "registry+https://github.com/rust-lang/crates.io-index"
1158 | checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc"
1159 | dependencies = [
1160 | "cc",
1161 | "libc",
1162 | "pkg-config",
1163 | "vcpkg",
1164 | ]
1165 |
1166 | [[package]]
1167 | name = "overload"
1168 | version = "0.1.1"
1169 | source = "registry+https://github.com/rust-lang/crates.io-index"
1170 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
1171 |
1172 | [[package]]
1173 | name = "parking_lot"
1174 | version = "0.12.3"
1175 | source = "registry+https://github.com/rust-lang/crates.io-index"
1176 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
1177 | dependencies = [
1178 | "lock_api",
1179 | "parking_lot_core",
1180 | ]
1181 |
1182 | [[package]]
1183 | name = "parking_lot_core"
1184 | version = "0.9.10"
1185 | source = "registry+https://github.com/rust-lang/crates.io-index"
1186 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
1187 | dependencies = [
1188 | "cfg-if",
1189 | "libc",
1190 | "redox_syscall",
1191 | "smallvec",
1192 | "windows-targets 0.52.6",
1193 | ]
1194 |
1195 | [[package]]
1196 | name = "percent-encoding"
1197 | version = "2.3.1"
1198 | source = "registry+https://github.com/rust-lang/crates.io-index"
1199 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
1200 |
1201 | [[package]]
1202 | name = "pest"
1203 | version = "2.7.15"
1204 | source = "registry+https://github.com/rust-lang/crates.io-index"
1205 | checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc"
1206 | dependencies = [
1207 | "memchr",
1208 | "thiserror 2.0.11",
1209 | "ucd-trie",
1210 | ]
1211 |
1212 | [[package]]
1213 | name = "pest_derive"
1214 | version = "2.7.15"
1215 | source = "registry+https://github.com/rust-lang/crates.io-index"
1216 | checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e"
1217 | dependencies = [
1218 | "pest",
1219 | "pest_generator",
1220 | ]
1221 |
1222 | [[package]]
1223 | name = "pest_generator"
1224 | version = "2.7.15"
1225 | source = "registry+https://github.com/rust-lang/crates.io-index"
1226 | checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b"
1227 | dependencies = [
1228 | "pest",
1229 | "pest_meta",
1230 | "proc-macro2",
1231 | "quote",
1232 | "syn",
1233 | ]
1234 |
1235 | [[package]]
1236 | name = "pest_meta"
1237 | version = "2.7.15"
1238 | source = "registry+https://github.com/rust-lang/crates.io-index"
1239 | checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea"
1240 | dependencies = [
1241 | "once_cell",
1242 | "pest",
1243 | "sha2",
1244 | ]
1245 |
1246 | [[package]]
1247 | name = "pin-project"
1248 | version = "1.1.9"
1249 | source = "registry+https://github.com/rust-lang/crates.io-index"
1250 | checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d"
1251 | dependencies = [
1252 | "pin-project-internal",
1253 | ]
1254 |
1255 | [[package]]
1256 | name = "pin-project-internal"
1257 | version = "1.1.9"
1258 | source = "registry+https://github.com/rust-lang/crates.io-index"
1259 | checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67"
1260 | dependencies = [
1261 | "proc-macro2",
1262 | "quote",
1263 | "syn",
1264 | ]
1265 |
1266 | [[package]]
1267 | name = "pin-project-lite"
1268 | version = "0.2.16"
1269 | source = "registry+https://github.com/rust-lang/crates.io-index"
1270 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
1271 |
1272 | [[package]]
1273 | name = "pin-utils"
1274 | version = "0.1.0"
1275 | source = "registry+https://github.com/rust-lang/crates.io-index"
1276 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
1277 |
1278 | [[package]]
1279 | name = "pkg-config"
1280 | version = "0.3.31"
1281 | source = "registry+https://github.com/rust-lang/crates.io-index"
1282 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2"
1283 |
1284 | [[package]]
1285 | name = "powerfmt"
1286 | version = "0.2.0"
1287 | source = "registry+https://github.com/rust-lang/crates.io-index"
1288 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
1289 |
1290 | [[package]]
1291 | name = "ppv-lite86"
1292 | version = "0.2.20"
1293 | source = "registry+https://github.com/rust-lang/crates.io-index"
1294 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
1295 | dependencies = [
1296 | "zerocopy",
1297 | ]
1298 |
1299 | [[package]]
1300 | name = "proc-macro2"
1301 | version = "1.0.93"
1302 | source = "registry+https://github.com/rust-lang/crates.io-index"
1303 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
1304 | dependencies = [
1305 | "unicode-ident",
1306 | ]
1307 |
1308 | [[package]]
1309 | name = "quote"
1310 | version = "1.0.38"
1311 | source = "registry+https://github.com/rust-lang/crates.io-index"
1312 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc"
1313 | dependencies = [
1314 | "proc-macro2",
1315 | ]
1316 |
1317 | [[package]]
1318 | name = "rand"
1319 | version = "0.8.5"
1320 | source = "registry+https://github.com/rust-lang/crates.io-index"
1321 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
1322 | dependencies = [
1323 | "libc",
1324 | "rand_chacha",
1325 | "rand_core",
1326 | ]
1327 |
1328 | [[package]]
1329 | name = "rand_chacha"
1330 | version = "0.3.1"
1331 | source = "registry+https://github.com/rust-lang/crates.io-index"
1332 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
1333 | dependencies = [
1334 | "ppv-lite86",
1335 | "rand_core",
1336 | ]
1337 |
1338 | [[package]]
1339 | name = "rand_core"
1340 | version = "0.6.4"
1341 | source = "registry+https://github.com/rust-lang/crates.io-index"
1342 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
1343 | dependencies = [
1344 | "getrandom 0.2.15",
1345 | ]
1346 |
1347 | [[package]]
1348 | name = "redox_syscall"
1349 | version = "0.5.8"
1350 | source = "registry+https://github.com/rust-lang/crates.io-index"
1351 | checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834"
1352 | dependencies = [
1353 | "bitflags 2.8.0",
1354 | ]
1355 |
1356 | [[package]]
1357 | name = "regex"
1358 | version = "1.11.1"
1359 | source = "registry+https://github.com/rust-lang/crates.io-index"
1360 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
1361 | dependencies = [
1362 | "aho-corasick",
1363 | "memchr",
1364 | "regex-automata 0.4.9",
1365 | "regex-syntax 0.8.5",
1366 | ]
1367 |
1368 | [[package]]
1369 | name = "regex-automata"
1370 | version = "0.1.10"
1371 | source = "registry+https://github.com/rust-lang/crates.io-index"
1372 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
1373 | dependencies = [
1374 | "regex-syntax 0.6.29",
1375 | ]
1376 |
1377 | [[package]]
1378 | name = "regex-automata"
1379 | version = "0.4.9"
1380 | source = "registry+https://github.com/rust-lang/crates.io-index"
1381 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
1382 | dependencies = [
1383 | "aho-corasick",
1384 | "memchr",
1385 | "regex-syntax 0.8.5",
1386 | ]
1387 |
1388 | [[package]]
1389 | name = "regex-syntax"
1390 | version = "0.6.29"
1391 | source = "registry+https://github.com/rust-lang/crates.io-index"
1392 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
1393 |
1394 | [[package]]
1395 | name = "regex-syntax"
1396 | version = "0.8.5"
1397 | source = "registry+https://github.com/rust-lang/crates.io-index"
1398 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1399 |
1400 | [[package]]
1401 | name = "reqwest"
1402 | version = "0.11.27"
1403 | source = "registry+https://github.com/rust-lang/crates.io-index"
1404 | checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62"
1405 | dependencies = [
1406 | "base64 0.21.7",
1407 | "bytes",
1408 | "encoding_rs",
1409 | "futures-core",
1410 | "futures-util",
1411 | "h2 0.3.26",
1412 | "http 0.2.12",
1413 | "http-body 0.4.6",
1414 | "hyper 0.14.32",
1415 | "hyper-tls",
1416 | "ipnet",
1417 | "js-sys",
1418 | "log",
1419 | "mime",
1420 | "native-tls",
1421 | "once_cell",
1422 | "percent-encoding",
1423 | "pin-project-lite",
1424 | "rustls-pemfile 1.0.4",
1425 | "serde",
1426 | "serde_json",
1427 | "serde_urlencoded",
1428 | "sync_wrapper 0.1.2",
1429 | "system-configuration",
1430 | "tokio",
1431 | "tokio-native-tls",
1432 | "tokio-util",
1433 | "tower-service",
1434 | "url",
1435 | "wasm-bindgen",
1436 | "wasm-bindgen-futures",
1437 | "wasm-streams",
1438 | "web-sys",
1439 | "winreg",
1440 | ]
1441 |
1442 | [[package]]
1443 | name = "ring"
1444 | version = "0.17.8"
1445 | source = "registry+https://github.com/rust-lang/crates.io-index"
1446 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
1447 | dependencies = [
1448 | "cc",
1449 | "cfg-if",
1450 | "getrandom 0.2.15",
1451 | "libc",
1452 | "spin",
1453 | "untrusted",
1454 | "windows-sys 0.52.0",
1455 | ]
1456 |
1457 | [[package]]
1458 | name = "rustc-demangle"
1459 | version = "0.1.24"
1460 | source = "registry+https://github.com/rust-lang/crates.io-index"
1461 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
1462 |
1463 | [[package]]
1464 | name = "rustix"
1465 | version = "0.38.44"
1466 | source = "registry+https://github.com/rust-lang/crates.io-index"
1467 | checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
1468 | dependencies = [
1469 | "bitflags 2.8.0",
1470 | "errno",
1471 | "libc",
1472 | "linux-raw-sys",
1473 | "windows-sys 0.59.0",
1474 | ]
1475 |
1476 | [[package]]
1477 | name = "rustls"
1478 | version = "0.21.12"
1479 | source = "registry+https://github.com/rust-lang/crates.io-index"
1480 | checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e"
1481 | dependencies = [
1482 | "log",
1483 | "ring",
1484 | "rustls-webpki",
1485 | "sct",
1486 | ]
1487 |
1488 | [[package]]
1489 | name = "rustls-pemfile"
1490 | version = "1.0.4"
1491 | source = "registry+https://github.com/rust-lang/crates.io-index"
1492 | checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
1493 | dependencies = [
1494 | "base64 0.21.7",
1495 | ]
1496 |
1497 | [[package]]
1498 | name = "rustls-pemfile"
1499 | version = "2.2.0"
1500 | source = "registry+https://github.com/rust-lang/crates.io-index"
1501 | checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50"
1502 | dependencies = [
1503 | "rustls-pki-types",
1504 | ]
1505 |
1506 | [[package]]
1507 | name = "rustls-pki-types"
1508 | version = "1.11.0"
1509 | source = "registry+https://github.com/rust-lang/crates.io-index"
1510 | checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c"
1511 |
1512 | [[package]]
1513 | name = "rustls-webpki"
1514 | version = "0.101.7"
1515 | source = "registry+https://github.com/rust-lang/crates.io-index"
1516 | checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
1517 | dependencies = [
1518 | "ring",
1519 | "untrusted",
1520 | ]
1521 |
1522 | [[package]]
1523 | name = "rustversion"
1524 | version = "1.0.19"
1525 | source = "registry+https://github.com/rust-lang/crates.io-index"
1526 | checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4"
1527 |
1528 | [[package]]
1529 | name = "ryu"
1530 | version = "1.0.19"
1531 | source = "registry+https://github.com/rust-lang/crates.io-index"
1532 | checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
1533 |
1534 | [[package]]
1535 | name = "same-file"
1536 | version = "1.0.6"
1537 | source = "registry+https://github.com/rust-lang/crates.io-index"
1538 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
1539 | dependencies = [
1540 | "winapi-util",
1541 | ]
1542 |
1543 | [[package]]
1544 | name = "schannel"
1545 | version = "0.1.27"
1546 | source = "registry+https://github.com/rust-lang/crates.io-index"
1547 | checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
1548 | dependencies = [
1549 | "windows-sys 0.59.0",
1550 | ]
1551 |
1552 | [[package]]
1553 | name = "scopeguard"
1554 | version = "1.2.0"
1555 | source = "registry+https://github.com/rust-lang/crates.io-index"
1556 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
1557 |
1558 | [[package]]
1559 | name = "sct"
1560 | version = "0.7.1"
1561 | source = "registry+https://github.com/rust-lang/crates.io-index"
1562 | checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
1563 | dependencies = [
1564 | "ring",
1565 | "untrusted",
1566 | ]
1567 |
1568 | [[package]]
1569 | name = "security-framework"
1570 | version = "2.11.1"
1571 | source = "registry+https://github.com/rust-lang/crates.io-index"
1572 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02"
1573 | dependencies = [
1574 | "bitflags 2.8.0",
1575 | "core-foundation",
1576 | "core-foundation-sys",
1577 | "libc",
1578 | "security-framework-sys",
1579 | ]
1580 |
1581 | [[package]]
1582 | name = "security-framework-sys"
1583 | version = "2.14.0"
1584 | source = "registry+https://github.com/rust-lang/crates.io-index"
1585 | checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
1586 | dependencies = [
1587 | "core-foundation-sys",
1588 | "libc",
1589 | ]
1590 |
1591 | [[package]]
1592 | name = "serde"
1593 | version = "1.0.217"
1594 | source = "registry+https://github.com/rust-lang/crates.io-index"
1595 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70"
1596 | dependencies = [
1597 | "serde_derive",
1598 | ]
1599 |
1600 | [[package]]
1601 | name = "serde_derive"
1602 | version = "1.0.217"
1603 | source = "registry+https://github.com/rust-lang/crates.io-index"
1604 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
1605 | dependencies = [
1606 | "proc-macro2",
1607 | "quote",
1608 | "syn",
1609 | ]
1610 |
1611 | [[package]]
1612 | name = "serde_json"
1613 | version = "1.0.138"
1614 | source = "registry+https://github.com/rust-lang/crates.io-index"
1615 | checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949"
1616 | dependencies = [
1617 | "itoa",
1618 | "memchr",
1619 | "ryu",
1620 | "serde",
1621 | ]
1622 |
1623 | [[package]]
1624 | name = "serde_path_to_error"
1625 | version = "0.1.16"
1626 | source = "registry+https://github.com/rust-lang/crates.io-index"
1627 | checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6"
1628 | dependencies = [
1629 | "itoa",
1630 | "serde",
1631 | ]
1632 |
1633 | [[package]]
1634 | name = "serde_urlencoded"
1635 | version = "0.7.1"
1636 | source = "registry+https://github.com/rust-lang/crates.io-index"
1637 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
1638 | dependencies = [
1639 | "form_urlencoded",
1640 | "itoa",
1641 | "ryu",
1642 | "serde",
1643 | ]
1644 |
1645 | [[package]]
1646 | name = "sha2"
1647 | version = "0.10.8"
1648 | source = "registry+https://github.com/rust-lang/crates.io-index"
1649 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
1650 | dependencies = [
1651 | "cfg-if",
1652 | "cpufeatures",
1653 | "digest",
1654 | ]
1655 |
1656 | [[package]]
1657 | name = "sharded-slab"
1658 | version = "0.1.7"
1659 | source = "registry+https://github.com/rust-lang/crates.io-index"
1660 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
1661 | dependencies = [
1662 | "lazy_static",
1663 | ]
1664 |
1665 | [[package]]
1666 | name = "shlex"
1667 | version = "1.3.0"
1668 | source = "registry+https://github.com/rust-lang/crates.io-index"
1669 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
1670 |
1671 | [[package]]
1672 | name = "skattemelding"
1673 | version = "0.1.0"
1674 | dependencies = [
1675 | "anyhow",
1676 | "axum",
1677 | "axum-server",
1678 | "chrono",
1679 | "data-encoding",
1680 | "reqwest",
1681 | "serde",
1682 | "serde_json",
1683 | "tera",
1684 | "tokio",
1685 | "tokio-util",
1686 | "tower-sessions",
1687 | "tracing",
1688 | "tracing-subscriber",
1689 | "xmltree",
1690 | ]
1691 |
1692 | [[package]]
1693 | name = "slab"
1694 | version = "0.4.9"
1695 | source = "registry+https://github.com/rust-lang/crates.io-index"
1696 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
1697 | dependencies = [
1698 | "autocfg",
1699 | ]
1700 |
1701 | [[package]]
1702 | name = "smallvec"
1703 | version = "1.13.2"
1704 | source = "registry+https://github.com/rust-lang/crates.io-index"
1705 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
1706 |
1707 | [[package]]
1708 | name = "socket2"
1709 | version = "0.5.8"
1710 | source = "registry+https://github.com/rust-lang/crates.io-index"
1711 | checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8"
1712 | dependencies = [
1713 | "libc",
1714 | "windows-sys 0.52.0",
1715 | ]
1716 |
1717 | [[package]]
1718 | name = "spin"
1719 | version = "0.9.8"
1720 | source = "registry+https://github.com/rust-lang/crates.io-index"
1721 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
1722 |
1723 | [[package]]
1724 | name = "stable_deref_trait"
1725 | version = "1.2.0"
1726 | source = "registry+https://github.com/rust-lang/crates.io-index"
1727 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
1728 |
1729 | [[package]]
1730 | name = "syn"
1731 | version = "2.0.98"
1732 | source = "registry+https://github.com/rust-lang/crates.io-index"
1733 | checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1"
1734 | dependencies = [
1735 | "proc-macro2",
1736 | "quote",
1737 | "unicode-ident",
1738 | ]
1739 |
1740 | [[package]]
1741 | name = "sync_wrapper"
1742 | version = "0.1.2"
1743 | source = "registry+https://github.com/rust-lang/crates.io-index"
1744 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
1745 |
1746 | [[package]]
1747 | name = "sync_wrapper"
1748 | version = "1.0.2"
1749 | source = "registry+https://github.com/rust-lang/crates.io-index"
1750 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
1751 |
1752 | [[package]]
1753 | name = "synstructure"
1754 | version = "0.13.1"
1755 | source = "registry+https://github.com/rust-lang/crates.io-index"
1756 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
1757 | dependencies = [
1758 | "proc-macro2",
1759 | "quote",
1760 | "syn",
1761 | ]
1762 |
1763 | [[package]]
1764 | name = "system-configuration"
1765 | version = "0.5.1"
1766 | source = "registry+https://github.com/rust-lang/crates.io-index"
1767 | checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
1768 | dependencies = [
1769 | "bitflags 1.3.2",
1770 | "core-foundation",
1771 | "system-configuration-sys",
1772 | ]
1773 |
1774 | [[package]]
1775 | name = "system-configuration-sys"
1776 | version = "0.5.0"
1777 | source = "registry+https://github.com/rust-lang/crates.io-index"
1778 | checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"
1779 | dependencies = [
1780 | "core-foundation-sys",
1781 | "libc",
1782 | ]
1783 |
1784 | [[package]]
1785 | name = "tempfile"
1786 | version = "3.16.0"
1787 | source = "registry+https://github.com/rust-lang/crates.io-index"
1788 | checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91"
1789 | dependencies = [
1790 | "cfg-if",
1791 | "fastrand",
1792 | "getrandom 0.3.1",
1793 | "once_cell",
1794 | "rustix",
1795 | "windows-sys 0.59.0",
1796 | ]
1797 |
1798 | [[package]]
1799 | name = "tera"
1800 | version = "1.20.0"
1801 | source = "registry+https://github.com/rust-lang/crates.io-index"
1802 | checksum = "ab9d851b45e865f178319da0abdbfe6acbc4328759ff18dafc3a41c16b4cd2ee"
1803 | dependencies = [
1804 | "globwalk",
1805 | "lazy_static",
1806 | "pest",
1807 | "pest_derive",
1808 | "regex",
1809 | "serde",
1810 | "serde_json",
1811 | "unic-segment",
1812 | ]
1813 |
1814 | [[package]]
1815 | name = "thiserror"
1816 | version = "1.0.69"
1817 | source = "registry+https://github.com/rust-lang/crates.io-index"
1818 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
1819 | dependencies = [
1820 | "thiserror-impl 1.0.69",
1821 | ]
1822 |
1823 | [[package]]
1824 | name = "thiserror"
1825 | version = "2.0.11"
1826 | source = "registry+https://github.com/rust-lang/crates.io-index"
1827 | checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc"
1828 | dependencies = [
1829 | "thiserror-impl 2.0.11",
1830 | ]
1831 |
1832 | [[package]]
1833 | name = "thiserror-impl"
1834 | version = "1.0.69"
1835 | source = "registry+https://github.com/rust-lang/crates.io-index"
1836 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
1837 | dependencies = [
1838 | "proc-macro2",
1839 | "quote",
1840 | "syn",
1841 | ]
1842 |
1843 | [[package]]
1844 | name = "thiserror-impl"
1845 | version = "2.0.11"
1846 | source = "registry+https://github.com/rust-lang/crates.io-index"
1847 | checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"
1848 | dependencies = [
1849 | "proc-macro2",
1850 | "quote",
1851 | "syn",
1852 | ]
1853 |
1854 | [[package]]
1855 | name = "thread_local"
1856 | version = "1.1.8"
1857 | source = "registry+https://github.com/rust-lang/crates.io-index"
1858 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
1859 | dependencies = [
1860 | "cfg-if",
1861 | "once_cell",
1862 | ]
1863 |
1864 | [[package]]
1865 | name = "time"
1866 | version = "0.3.37"
1867 | source = "registry+https://github.com/rust-lang/crates.io-index"
1868 | checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21"
1869 | dependencies = [
1870 | "deranged",
1871 | "itoa",
1872 | "num-conv",
1873 | "powerfmt",
1874 | "serde",
1875 | "time-core",
1876 | "time-macros",
1877 | ]
1878 |
1879 | [[package]]
1880 | name = "time-core"
1881 | version = "0.1.2"
1882 | source = "registry+https://github.com/rust-lang/crates.io-index"
1883 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
1884 |
1885 | [[package]]
1886 | name = "time-macros"
1887 | version = "0.2.19"
1888 | source = "registry+https://github.com/rust-lang/crates.io-index"
1889 | checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de"
1890 | dependencies = [
1891 | "num-conv",
1892 | "time-core",
1893 | ]
1894 |
1895 | [[package]]
1896 | name = "tinystr"
1897 | version = "0.7.6"
1898 | source = "registry+https://github.com/rust-lang/crates.io-index"
1899 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
1900 | dependencies = [
1901 | "displaydoc",
1902 | "zerovec",
1903 | ]
1904 |
1905 | [[package]]
1906 | name = "tokio"
1907 | version = "1.43.0"
1908 | source = "registry+https://github.com/rust-lang/crates.io-index"
1909 | checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e"
1910 | dependencies = [
1911 | "backtrace",
1912 | "bytes",
1913 | "libc",
1914 | "mio",
1915 | "pin-project-lite",
1916 | "socket2",
1917 | "tokio-macros",
1918 | "windows-sys 0.52.0",
1919 | ]
1920 |
1921 | [[package]]
1922 | name = "tokio-macros"
1923 | version = "2.5.0"
1924 | source = "registry+https://github.com/rust-lang/crates.io-index"
1925 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
1926 | dependencies = [
1927 | "proc-macro2",
1928 | "quote",
1929 | "syn",
1930 | ]
1931 |
1932 | [[package]]
1933 | name = "tokio-native-tls"
1934 | version = "0.3.1"
1935 | source = "registry+https://github.com/rust-lang/crates.io-index"
1936 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
1937 | dependencies = [
1938 | "native-tls",
1939 | "tokio",
1940 | ]
1941 |
1942 | [[package]]
1943 | name = "tokio-rustls"
1944 | version = "0.24.1"
1945 | source = "registry+https://github.com/rust-lang/crates.io-index"
1946 | checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
1947 | dependencies = [
1948 | "rustls",
1949 | "tokio",
1950 | ]
1951 |
1952 | [[package]]
1953 | name = "tokio-util"
1954 | version = "0.7.13"
1955 | source = "registry+https://github.com/rust-lang/crates.io-index"
1956 | checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078"
1957 | dependencies = [
1958 | "bytes",
1959 | "futures-core",
1960 | "futures-sink",
1961 | "pin-project-lite",
1962 | "tokio",
1963 | ]
1964 |
1965 | [[package]]
1966 | name = "tower"
1967 | version = "0.4.13"
1968 | source = "registry+https://github.com/rust-lang/crates.io-index"
1969 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
1970 | dependencies = [
1971 | "futures-core",
1972 | "futures-util",
1973 | "pin-project",
1974 | "pin-project-lite",
1975 | "tower-layer",
1976 | "tower-service",
1977 | "tracing",
1978 | ]
1979 |
1980 | [[package]]
1981 | name = "tower"
1982 | version = "0.5.2"
1983 | source = "registry+https://github.com/rust-lang/crates.io-index"
1984 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
1985 | dependencies = [
1986 | "futures-core",
1987 | "futures-util",
1988 | "pin-project-lite",
1989 | "sync_wrapper 1.0.2",
1990 | "tokio",
1991 | "tower-layer",
1992 | "tower-service",
1993 | "tracing",
1994 | ]
1995 |
1996 | [[package]]
1997 | name = "tower-cookies"
1998 | version = "0.10.0"
1999 | source = "registry+https://github.com/rust-lang/crates.io-index"
2000 | checksum = "4fd0118512cf0b3768f7fcccf0bef1ae41d68f2b45edc1e77432b36c97c56c6d"
2001 | dependencies = [
2002 | "async-trait",
2003 | "axum-core",
2004 | "cookie",
2005 | "futures-util",
2006 | "http 1.2.0",
2007 | "parking_lot",
2008 | "pin-project-lite",
2009 | "tower-layer",
2010 | "tower-service",
2011 | ]
2012 |
2013 | [[package]]
2014 | name = "tower-layer"
2015 | version = "0.3.3"
2016 | source = "registry+https://github.com/rust-lang/crates.io-index"
2017 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
2018 |
2019 | [[package]]
2020 | name = "tower-service"
2021 | version = "0.3.3"
2022 | source = "registry+https://github.com/rust-lang/crates.io-index"
2023 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
2024 |
2025 | [[package]]
2026 | name = "tower-sessions"
2027 | version = "0.11.1"
2028 | source = "registry+https://github.com/rust-lang/crates.io-index"
2029 | checksum = "b27326208b21807803c5f5aa1020d30ca0432b78cfe251b51a67a05e0baea102"
2030 | dependencies = [
2031 | "async-trait",
2032 | "http 1.2.0",
2033 | "time",
2034 | "tokio",
2035 | "tower-cookies",
2036 | "tower-layer",
2037 | "tower-service",
2038 | "tower-sessions-core",
2039 | "tower-sessions-memory-store",
2040 | "tracing",
2041 | ]
2042 |
2043 | [[package]]
2044 | name = "tower-sessions-core"
2045 | version = "0.11.1"
2046 | source = "registry+https://github.com/rust-lang/crates.io-index"
2047 | checksum = "afd1c5040577134115d8cc758d7757da29e171f83102de3ed1b86e3a2405533f"
2048 | dependencies = [
2049 | "async-trait",
2050 | "axum-core",
2051 | "base64 0.22.1",
2052 | "futures",
2053 | "http 1.2.0",
2054 | "parking_lot",
2055 | "rand",
2056 | "serde",
2057 | "serde_json",
2058 | "thiserror 1.0.69",
2059 | "time",
2060 | "tokio",
2061 | "tracing",
2062 | ]
2063 |
2064 | [[package]]
2065 | name = "tower-sessions-memory-store"
2066 | version = "0.11.1"
2067 | source = "registry+https://github.com/rust-lang/crates.io-index"
2068 | checksum = "88ac75309918b8f6ba16d09865a2a64f81e01b05cf42d5e88e5d3c6cbf775486"
2069 | dependencies = [
2070 | "async-trait",
2071 | "time",
2072 | "tokio",
2073 | "tower-sessions-core",
2074 | ]
2075 |
2076 | [[package]]
2077 | name = "tracing"
2078 | version = "0.1.41"
2079 | source = "registry+https://github.com/rust-lang/crates.io-index"
2080 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0"
2081 | dependencies = [
2082 | "log",
2083 | "pin-project-lite",
2084 | "tracing-attributes",
2085 | "tracing-core",
2086 | ]
2087 |
2088 | [[package]]
2089 | name = "tracing-attributes"
2090 | version = "0.1.28"
2091 | source = "registry+https://github.com/rust-lang/crates.io-index"
2092 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
2093 | dependencies = [
2094 | "proc-macro2",
2095 | "quote",
2096 | "syn",
2097 | ]
2098 |
2099 | [[package]]
2100 | name = "tracing-core"
2101 | version = "0.1.33"
2102 | source = "registry+https://github.com/rust-lang/crates.io-index"
2103 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
2104 | dependencies = [
2105 | "once_cell",
2106 | "valuable",
2107 | ]
2108 |
2109 | [[package]]
2110 | name = "tracing-log"
2111 | version = "0.2.0"
2112 | source = "registry+https://github.com/rust-lang/crates.io-index"
2113 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
2114 | dependencies = [
2115 | "log",
2116 | "once_cell",
2117 | "tracing-core",
2118 | ]
2119 |
2120 | [[package]]
2121 | name = "tracing-subscriber"
2122 | version = "0.3.19"
2123 | source = "registry+https://github.com/rust-lang/crates.io-index"
2124 | checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008"
2125 | dependencies = [
2126 | "matchers",
2127 | "nu-ansi-term",
2128 | "once_cell",
2129 | "regex",
2130 | "sharded-slab",
2131 | "smallvec",
2132 | "thread_local",
2133 | "tracing",
2134 | "tracing-core",
2135 | "tracing-log",
2136 | ]
2137 |
2138 | [[package]]
2139 | name = "try-lock"
2140 | version = "0.2.5"
2141 | source = "registry+https://github.com/rust-lang/crates.io-index"
2142 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
2143 |
2144 | [[package]]
2145 | name = "typenum"
2146 | version = "1.17.0"
2147 | source = "registry+https://github.com/rust-lang/crates.io-index"
2148 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
2149 |
2150 | [[package]]
2151 | name = "ucd-trie"
2152 | version = "0.1.7"
2153 | source = "registry+https://github.com/rust-lang/crates.io-index"
2154 | checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
2155 |
2156 | [[package]]
2157 | name = "unic-char-property"
2158 | version = "0.9.0"
2159 | source = "registry+https://github.com/rust-lang/crates.io-index"
2160 | checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221"
2161 | dependencies = [
2162 | "unic-char-range",
2163 | ]
2164 |
2165 | [[package]]
2166 | name = "unic-char-range"
2167 | version = "0.9.0"
2168 | source = "registry+https://github.com/rust-lang/crates.io-index"
2169 | checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc"
2170 |
2171 | [[package]]
2172 | name = "unic-common"
2173 | version = "0.9.0"
2174 | source = "registry+https://github.com/rust-lang/crates.io-index"
2175 | checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc"
2176 |
2177 | [[package]]
2178 | name = "unic-segment"
2179 | version = "0.9.0"
2180 | source = "registry+https://github.com/rust-lang/crates.io-index"
2181 | checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23"
2182 | dependencies = [
2183 | "unic-ucd-segment",
2184 | ]
2185 |
2186 | [[package]]
2187 | name = "unic-ucd-segment"
2188 | version = "0.9.0"
2189 | source = "registry+https://github.com/rust-lang/crates.io-index"
2190 | checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700"
2191 | dependencies = [
2192 | "unic-char-property",
2193 | "unic-char-range",
2194 | "unic-ucd-version",
2195 | ]
2196 |
2197 | [[package]]
2198 | name = "unic-ucd-version"
2199 | version = "0.9.0"
2200 | source = "registry+https://github.com/rust-lang/crates.io-index"
2201 | checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4"
2202 | dependencies = [
2203 | "unic-common",
2204 | ]
2205 |
2206 | [[package]]
2207 | name = "unicode-ident"
2208 | version = "1.0.16"
2209 | source = "registry+https://github.com/rust-lang/crates.io-index"
2210 | checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034"
2211 |
2212 | [[package]]
2213 | name = "untrusted"
2214 | version = "0.9.0"
2215 | source = "registry+https://github.com/rust-lang/crates.io-index"
2216 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
2217 |
2218 | [[package]]
2219 | name = "url"
2220 | version = "2.5.4"
2221 | source = "registry+https://github.com/rust-lang/crates.io-index"
2222 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
2223 | dependencies = [
2224 | "form_urlencoded",
2225 | "idna",
2226 | "percent-encoding",
2227 | ]
2228 |
2229 | [[package]]
2230 | name = "utf16_iter"
2231 | version = "1.0.5"
2232 | source = "registry+https://github.com/rust-lang/crates.io-index"
2233 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
2234 |
2235 | [[package]]
2236 | name = "utf8_iter"
2237 | version = "1.0.4"
2238 | source = "registry+https://github.com/rust-lang/crates.io-index"
2239 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
2240 |
2241 | [[package]]
2242 | name = "valuable"
2243 | version = "0.1.1"
2244 | source = "registry+https://github.com/rust-lang/crates.io-index"
2245 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
2246 |
2247 | [[package]]
2248 | name = "vcpkg"
2249 | version = "0.2.15"
2250 | source = "registry+https://github.com/rust-lang/crates.io-index"
2251 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
2252 |
2253 | [[package]]
2254 | name = "version_check"
2255 | version = "0.9.5"
2256 | source = "registry+https://github.com/rust-lang/crates.io-index"
2257 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
2258 |
2259 | [[package]]
2260 | name = "walkdir"
2261 | version = "2.5.0"
2262 | source = "registry+https://github.com/rust-lang/crates.io-index"
2263 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
2264 | dependencies = [
2265 | "same-file",
2266 | "winapi-util",
2267 | ]
2268 |
2269 | [[package]]
2270 | name = "want"
2271 | version = "0.3.1"
2272 | source = "registry+https://github.com/rust-lang/crates.io-index"
2273 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
2274 | dependencies = [
2275 | "try-lock",
2276 | ]
2277 |
2278 | [[package]]
2279 | name = "wasi"
2280 | version = "0.11.0+wasi-snapshot-preview1"
2281 | source = "registry+https://github.com/rust-lang/crates.io-index"
2282 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
2283 |
2284 | [[package]]
2285 | name = "wasi"
2286 | version = "0.13.3+wasi-0.2.2"
2287 | source = "registry+https://github.com/rust-lang/crates.io-index"
2288 | checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2"
2289 | dependencies = [
2290 | "wit-bindgen-rt",
2291 | ]
2292 |
2293 | [[package]]
2294 | name = "wasm-bindgen"
2295 | version = "0.2.100"
2296 | source = "registry+https://github.com/rust-lang/crates.io-index"
2297 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
2298 | dependencies = [
2299 | "cfg-if",
2300 | "once_cell",
2301 | "rustversion",
2302 | "wasm-bindgen-macro",
2303 | ]
2304 |
2305 | [[package]]
2306 | name = "wasm-bindgen-backend"
2307 | version = "0.2.100"
2308 | source = "registry+https://github.com/rust-lang/crates.io-index"
2309 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
2310 | dependencies = [
2311 | "bumpalo",
2312 | "log",
2313 | "proc-macro2",
2314 | "quote",
2315 | "syn",
2316 | "wasm-bindgen-shared",
2317 | ]
2318 |
2319 | [[package]]
2320 | name = "wasm-bindgen-futures"
2321 | version = "0.4.50"
2322 | source = "registry+https://github.com/rust-lang/crates.io-index"
2323 | checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61"
2324 | dependencies = [
2325 | "cfg-if",
2326 | "js-sys",
2327 | "once_cell",
2328 | "wasm-bindgen",
2329 | "web-sys",
2330 | ]
2331 |
2332 | [[package]]
2333 | name = "wasm-bindgen-macro"
2334 | version = "0.2.100"
2335 | source = "registry+https://github.com/rust-lang/crates.io-index"
2336 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
2337 | dependencies = [
2338 | "quote",
2339 | "wasm-bindgen-macro-support",
2340 | ]
2341 |
2342 | [[package]]
2343 | name = "wasm-bindgen-macro-support"
2344 | version = "0.2.100"
2345 | source = "registry+https://github.com/rust-lang/crates.io-index"
2346 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
2347 | dependencies = [
2348 | "proc-macro2",
2349 | "quote",
2350 | "syn",
2351 | "wasm-bindgen-backend",
2352 | "wasm-bindgen-shared",
2353 | ]
2354 |
2355 | [[package]]
2356 | name = "wasm-bindgen-shared"
2357 | version = "0.2.100"
2358 | source = "registry+https://github.com/rust-lang/crates.io-index"
2359 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
2360 | dependencies = [
2361 | "unicode-ident",
2362 | ]
2363 |
2364 | [[package]]
2365 | name = "wasm-streams"
2366 | version = "0.4.2"
2367 | source = "registry+https://github.com/rust-lang/crates.io-index"
2368 | checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65"
2369 | dependencies = [
2370 | "futures-util",
2371 | "js-sys",
2372 | "wasm-bindgen",
2373 | "wasm-bindgen-futures",
2374 | "web-sys",
2375 | ]
2376 |
2377 | [[package]]
2378 | name = "web-sys"
2379 | version = "0.3.77"
2380 | source = "registry+https://github.com/rust-lang/crates.io-index"
2381 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2"
2382 | dependencies = [
2383 | "js-sys",
2384 | "wasm-bindgen",
2385 | ]
2386 |
2387 | [[package]]
2388 | name = "winapi"
2389 | version = "0.3.9"
2390 | source = "registry+https://github.com/rust-lang/crates.io-index"
2391 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
2392 | dependencies = [
2393 | "winapi-i686-pc-windows-gnu",
2394 | "winapi-x86_64-pc-windows-gnu",
2395 | ]
2396 |
2397 | [[package]]
2398 | name = "winapi-i686-pc-windows-gnu"
2399 | version = "0.4.0"
2400 | source = "registry+https://github.com/rust-lang/crates.io-index"
2401 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
2402 |
2403 | [[package]]
2404 | name = "winapi-util"
2405 | version = "0.1.9"
2406 | source = "registry+https://github.com/rust-lang/crates.io-index"
2407 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
2408 | dependencies = [
2409 | "windows-sys 0.59.0",
2410 | ]
2411 |
2412 | [[package]]
2413 | name = "winapi-x86_64-pc-windows-gnu"
2414 | version = "0.4.0"
2415 | source = "registry+https://github.com/rust-lang/crates.io-index"
2416 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
2417 |
2418 | [[package]]
2419 | name = "windows-core"
2420 | version = "0.52.0"
2421 | source = "registry+https://github.com/rust-lang/crates.io-index"
2422 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
2423 | dependencies = [
2424 | "windows-targets 0.52.6",
2425 | ]
2426 |
2427 | [[package]]
2428 | name = "windows-sys"
2429 | version = "0.48.0"
2430 | source = "registry+https://github.com/rust-lang/crates.io-index"
2431 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
2432 | dependencies = [
2433 | "windows-targets 0.48.5",
2434 | ]
2435 |
2436 | [[package]]
2437 | name = "windows-sys"
2438 | version = "0.52.0"
2439 | source = "registry+https://github.com/rust-lang/crates.io-index"
2440 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
2441 | dependencies = [
2442 | "windows-targets 0.52.6",
2443 | ]
2444 |
2445 | [[package]]
2446 | name = "windows-sys"
2447 | version = "0.59.0"
2448 | source = "registry+https://github.com/rust-lang/crates.io-index"
2449 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
2450 | dependencies = [
2451 | "windows-targets 0.52.6",
2452 | ]
2453 |
2454 | [[package]]
2455 | name = "windows-targets"
2456 | version = "0.48.5"
2457 | source = "registry+https://github.com/rust-lang/crates.io-index"
2458 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
2459 | dependencies = [
2460 | "windows_aarch64_gnullvm 0.48.5",
2461 | "windows_aarch64_msvc 0.48.5",
2462 | "windows_i686_gnu 0.48.5",
2463 | "windows_i686_msvc 0.48.5",
2464 | "windows_x86_64_gnu 0.48.5",
2465 | "windows_x86_64_gnullvm 0.48.5",
2466 | "windows_x86_64_msvc 0.48.5",
2467 | ]
2468 |
2469 | [[package]]
2470 | name = "windows-targets"
2471 | version = "0.52.6"
2472 | source = "registry+https://github.com/rust-lang/crates.io-index"
2473 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
2474 | dependencies = [
2475 | "windows_aarch64_gnullvm 0.52.6",
2476 | "windows_aarch64_msvc 0.52.6",
2477 | "windows_i686_gnu 0.52.6",
2478 | "windows_i686_gnullvm",
2479 | "windows_i686_msvc 0.52.6",
2480 | "windows_x86_64_gnu 0.52.6",
2481 | "windows_x86_64_gnullvm 0.52.6",
2482 | "windows_x86_64_msvc 0.52.6",
2483 | ]
2484 |
2485 | [[package]]
2486 | name = "windows_aarch64_gnullvm"
2487 | version = "0.48.5"
2488 | source = "registry+https://github.com/rust-lang/crates.io-index"
2489 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
2490 |
2491 | [[package]]
2492 | name = "windows_aarch64_gnullvm"
2493 | version = "0.52.6"
2494 | source = "registry+https://github.com/rust-lang/crates.io-index"
2495 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
2496 |
2497 | [[package]]
2498 | name = "windows_aarch64_msvc"
2499 | version = "0.48.5"
2500 | source = "registry+https://github.com/rust-lang/crates.io-index"
2501 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
2502 |
2503 | [[package]]
2504 | name = "windows_aarch64_msvc"
2505 | version = "0.52.6"
2506 | source = "registry+https://github.com/rust-lang/crates.io-index"
2507 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
2508 |
2509 | [[package]]
2510 | name = "windows_i686_gnu"
2511 | version = "0.48.5"
2512 | source = "registry+https://github.com/rust-lang/crates.io-index"
2513 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
2514 |
2515 | [[package]]
2516 | name = "windows_i686_gnu"
2517 | version = "0.52.6"
2518 | source = "registry+https://github.com/rust-lang/crates.io-index"
2519 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
2520 |
2521 | [[package]]
2522 | name = "windows_i686_gnullvm"
2523 | version = "0.52.6"
2524 | source = "registry+https://github.com/rust-lang/crates.io-index"
2525 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
2526 |
2527 | [[package]]
2528 | name = "windows_i686_msvc"
2529 | version = "0.48.5"
2530 | source = "registry+https://github.com/rust-lang/crates.io-index"
2531 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
2532 |
2533 | [[package]]
2534 | name = "windows_i686_msvc"
2535 | version = "0.52.6"
2536 | source = "registry+https://github.com/rust-lang/crates.io-index"
2537 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
2538 |
2539 | [[package]]
2540 | name = "windows_x86_64_gnu"
2541 | version = "0.48.5"
2542 | source = "registry+https://github.com/rust-lang/crates.io-index"
2543 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
2544 |
2545 | [[package]]
2546 | name = "windows_x86_64_gnu"
2547 | version = "0.52.6"
2548 | source = "registry+https://github.com/rust-lang/crates.io-index"
2549 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
2550 |
2551 | [[package]]
2552 | name = "windows_x86_64_gnullvm"
2553 | version = "0.48.5"
2554 | source = "registry+https://github.com/rust-lang/crates.io-index"
2555 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
2556 |
2557 | [[package]]
2558 | name = "windows_x86_64_gnullvm"
2559 | version = "0.52.6"
2560 | source = "registry+https://github.com/rust-lang/crates.io-index"
2561 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
2562 |
2563 | [[package]]
2564 | name = "windows_x86_64_msvc"
2565 | version = "0.48.5"
2566 | source = "registry+https://github.com/rust-lang/crates.io-index"
2567 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
2568 |
2569 | [[package]]
2570 | name = "windows_x86_64_msvc"
2571 | version = "0.52.6"
2572 | source = "registry+https://github.com/rust-lang/crates.io-index"
2573 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
2574 |
2575 | [[package]]
2576 | name = "winreg"
2577 | version = "0.50.0"
2578 | source = "registry+https://github.com/rust-lang/crates.io-index"
2579 | checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
2580 | dependencies = [
2581 | "cfg-if",
2582 | "windows-sys 0.48.0",
2583 | ]
2584 |
2585 | [[package]]
2586 | name = "wit-bindgen-rt"
2587 | version = "0.33.0"
2588 | source = "registry+https://github.com/rust-lang/crates.io-index"
2589 | checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c"
2590 | dependencies = [
2591 | "bitflags 2.8.0",
2592 | ]
2593 |
2594 | [[package]]
2595 | name = "write16"
2596 | version = "1.0.0"
2597 | source = "registry+https://github.com/rust-lang/crates.io-index"
2598 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936"
2599 |
2600 | [[package]]
2601 | name = "writeable"
2602 | version = "0.5.5"
2603 | source = "registry+https://github.com/rust-lang/crates.io-index"
2604 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
2605 |
2606 | [[package]]
2607 | name = "xml-rs"
2608 | version = "0.8.25"
2609 | source = "registry+https://github.com/rust-lang/crates.io-index"
2610 | checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4"
2611 |
2612 | [[package]]
2613 | name = "xmltree"
2614 | version = "0.10.3"
2615 | source = "registry+https://github.com/rust-lang/crates.io-index"
2616 | checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb"
2617 | dependencies = [
2618 | "xml-rs",
2619 | ]
2620 |
2621 | [[package]]
2622 | name = "yoke"
2623 | version = "0.7.5"
2624 | source = "registry+https://github.com/rust-lang/crates.io-index"
2625 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
2626 | dependencies = [
2627 | "serde",
2628 | "stable_deref_trait",
2629 | "yoke-derive",
2630 | "zerofrom",
2631 | ]
2632 |
2633 | [[package]]
2634 | name = "yoke-derive"
2635 | version = "0.7.5"
2636 | source = "registry+https://github.com/rust-lang/crates.io-index"
2637 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
2638 | dependencies = [
2639 | "proc-macro2",
2640 | "quote",
2641 | "syn",
2642 | "synstructure",
2643 | ]
2644 |
2645 | [[package]]
2646 | name = "zerocopy"
2647 | version = "0.7.35"
2648 | source = "registry+https://github.com/rust-lang/crates.io-index"
2649 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
2650 | dependencies = [
2651 | "byteorder",
2652 | "zerocopy-derive",
2653 | ]
2654 |
2655 | [[package]]
2656 | name = "zerocopy-derive"
2657 | version = "0.7.35"
2658 | source = "registry+https://github.com/rust-lang/crates.io-index"
2659 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
2660 | dependencies = [
2661 | "proc-macro2",
2662 | "quote",
2663 | "syn",
2664 | ]
2665 |
2666 | [[package]]
2667 | name = "zerofrom"
2668 | version = "0.1.5"
2669 | source = "registry+https://github.com/rust-lang/crates.io-index"
2670 | checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e"
2671 | dependencies = [
2672 | "zerofrom-derive",
2673 | ]
2674 |
2675 | [[package]]
2676 | name = "zerofrom-derive"
2677 | version = "0.1.5"
2678 | source = "registry+https://github.com/rust-lang/crates.io-index"
2679 | checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808"
2680 | dependencies = [
2681 | "proc-macro2",
2682 | "quote",
2683 | "syn",
2684 | "synstructure",
2685 | ]
2686 |
2687 | [[package]]
2688 | name = "zerovec"
2689 | version = "0.10.4"
2690 | source = "registry+https://github.com/rust-lang/crates.io-index"
2691 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079"
2692 | dependencies = [
2693 | "yoke",
2694 | "zerofrom",
2695 | "zerovec-derive",
2696 | ]
2697 |
2698 | [[package]]
2699 | name = "zerovec-derive"
2700 | version = "0.10.3"
2701 | source = "registry+https://github.com/rust-lang/crates.io-index"
2702 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
2703 | dependencies = [
2704 | "proc-macro2",
2705 | "quote",
2706 | "syn",
2707 | ]
2708 |
--------------------------------------------------------------------------------