appsync-scalars 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -96
- package/package.json +3 -2
- package/wasm.generated.js +96 -1
package/README.md
CHANGED
|
@@ -1,123 +1,78 @@
|
|
|
1
|
-
# appsync-scalars
|
|
1
|
+
# appsync-scalars for JavaScript and TypeScript
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Checks whether a value is a valid AWS AppSync `AWSDate`, `AWSTime`, `AWSDateTime` or `AWSTimestamp`, using rules recorded from a live AppSync API. Use it to catch a bad value before AppSync rejects the whole request.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Also available for [Python](https://github.com/wbgoodwin/appsync-scalars/blob/main/bindings/python/README.md), [Rust](https://github.com/wbgoodwin/appsync-scalars/blob/main/crates/appsync-scalars/README.md) and [Go](https://github.com/wbgoodwin/appsync-scalars/blob/main/bindings/go/README.md).
|
|
6
6
|
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
### Rust
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
use appsync_scalars::{is_aws_date, validate_aws_datetime};
|
|
13
|
-
|
|
14
|
-
assert!(is_aws_date("1970-01-01+05:30"));
|
|
15
|
-
|
|
16
|
-
// Err: invalid AWSDateTime: time zone offset is required
|
|
17
|
-
validate_aws_datetime("2021-01-11T12:30:24").unwrap_err();
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
### Python
|
|
21
|
-
|
|
22
|
-
```python
|
|
23
|
-
from appsync_scalars import is_aws_date, validate_aws_datetime
|
|
7
|
+
## Install
|
|
24
8
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
The core package has no dependencies. Pydantic field types are an optional extra, installed with `pip install "appsync-scalars[pydantic]"`:
|
|
30
|
-
|
|
31
|
-
```python
|
|
32
|
-
from pydantic import BaseModel
|
|
33
|
-
from appsync_scalars.pydantic import AWSDate, AWSDateTime, AWSTimestamp
|
|
34
|
-
|
|
35
|
-
class Event(BaseModel):
|
|
36
|
-
day: AWSDate
|
|
37
|
-
starts_at: AWSDateTime
|
|
38
|
-
created: AWSTimestamp
|
|
9
|
+
```bash
|
|
10
|
+
npm install appsync-scalars
|
|
39
11
|
```
|
|
40
12
|
|
|
41
|
-
|
|
13
|
+
It's an ES module with no dependencies, TypeScript types included. The validator is WebAssembly embedded in the package, so there's no install script or platform-specific build. It's tested on Node.js 20, 24 and 26, but not in browsers or edge runtimes.
|
|
42
14
|
|
|
43
|
-
|
|
15
|
+
## Usage
|
|
44
16
|
|
|
45
17
|
```js
|
|
46
|
-
import { isAWSDate, validateAWSDateTime } from "appsync-scalars";
|
|
18
|
+
import { AppSyncScalarError, isAWSDate, validateAWSDateTime } from "appsync-scalars";
|
|
47
19
|
|
|
48
20
|
isAWSDate("1970-01-01+05:30"); // true
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
21
|
+
isAWSDate("2021-02-29"); // false
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
validateAWSDateTime("2021-01-11T12:30:24");
|
|
25
|
+
} catch (error) {
|
|
26
|
+
if (error instanceof AppSyncScalarError) {
|
|
27
|
+
console.log(error.message); // invalid AWSDateTime: time zone offset is required
|
|
28
|
+
console.log(error.scalar); // AWSDateTime
|
|
29
|
+
console.log(error.reason); // time zone offset is required
|
|
30
|
+
}
|
|
31
|
+
}
|
|
59
32
|
```
|
|
60
33
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
## What AppSync accepts
|
|
64
|
-
|
|
65
|
-
AppSync's descriptions of these scalars are accurate for ordinary values. It also accepts and rejects some values they don't mention, and this library follows AppSync:
|
|
66
|
-
|
|
67
|
-
| Value | Example | AppSync's behavior |
|
|
68
|
-
|---|---|---|
|
|
69
|
-
| Lowercase `z` and `t` | `2021-01-11t12:30:24z` | Accepted |
|
|
70
|
-
| Empty fraction | `12:00:34.` | Accepted |
|
|
71
|
-
| Signed years of 5 to 10 digits | `+12021-01-11`, `-12021-01-11` | Accepted, up to 999,999,999 either way |
|
|
72
|
-
| `+` with a 4-digit year | `+2021-01-11` | Rejected |
|
|
73
|
-
| Negative year zero | `-0000-01-11` | Rejected |
|
|
74
|
-
| Hours-only offset | `+05` | Accepted by `AWSDateTime`, rejected by `AWSDate` and `AWSTime` |
|
|
75
|
-
| Offset beyond 18 hours | `+18:01` | Rejected by `AWSDateTime`, accepted by `AWSDate` and `AWSTime` up to `+23:59:59` |
|
|
76
|
-
|
|
77
|
-
`AWSTimestamp` follows its documented limits, -31557014167219200 to 31556889864403199.
|
|
78
|
-
|
|
79
|
-
AppSync gave the same verdict for a GraphQL variable and for resolver output on every recorded value. Inline literals differ in one way: AppSync wraps oversized integers, so `18446744073709551616` written in a query reaches the resolver as `0`. This library calls that value invalid, as AppSync does for variables and output.
|
|
80
|
-
|
|
81
|
-
## How it fits together
|
|
34
|
+
Each scalar has two functions. The `is` function returns a boolean, and the `validate` function returns nothing or throws an `AppSyncScalarError`.
|
|
82
35
|
|
|
83
|
-
|
|
|
84
|
-
|
|
85
|
-
|
|
|
86
|
-
|
|
|
87
|
-
|
|
|
88
|
-
|
|
|
89
|
-
| [`bindings/go`](https://github.com/wbgoodwin/appsync-scalars/blob/main/bindings/go/appsyncscalars.go) | Go module that runs the embedded module through wazero, with no cgo |
|
|
90
|
-
| [`conformance/smoke.json`](https://github.com/wbgoodwin/appsync-scalars/blob/main/conformance/smoke.json) | Test cases every language runs |
|
|
91
|
-
| [`conformance/`](https://github.com/wbgoodwin/appsync-scalars/blob/main/conformance/README.md) | The live AppSync test suite |
|
|
36
|
+
| Scalar | Takes | Returns a boolean | Throws |
|
|
37
|
+
|---|---|---|---|
|
|
38
|
+
| `AWSDate` | `string` | `isAWSDate` | `validateAWSDate` |
|
|
39
|
+
| `AWSTime` | `string` | `isAWSTime` | `validateAWSTime` |
|
|
40
|
+
| `AWSDateTime` | `string` | `isAWSDateTime` | `validateAWSDateTime` |
|
|
41
|
+
| `AWSTimestamp` | `number` or `bigint` | `isAWSTimestamp` | `validateAWSTimestamp` |
|
|
92
42
|
|
|
93
|
-
|
|
43
|
+
Any other type counts as invalid. Timestamps must be whole numbers, so `1.5` and `"123"` are invalid too.
|
|
94
44
|
|
|
95
|
-
##
|
|
45
|
+
## TypeScript
|
|
96
46
|
|
|
97
|
-
|
|
47
|
+
The functions accept `unknown` and narrow the type, so they work directly on untrusted input:
|
|
98
48
|
|
|
99
|
-
|
|
49
|
+
```ts
|
|
50
|
+
import { isAWSDate, validateAWSTimestamp } from "appsync-scalars";
|
|
100
51
|
|
|
101
|
-
|
|
102
|
-
|
|
52
|
+
function check(day: unknown, created: unknown) {
|
|
53
|
+
if (isAWSDate(day)) {
|
|
54
|
+
day.toUpperCase(); // day is a string here
|
|
55
|
+
}
|
|
56
|
+
validateAWSTimestamp(created);
|
|
57
|
+
return created; // number | bigint
|
|
58
|
+
}
|
|
103
59
|
```
|
|
104
60
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
```bash
|
|
108
|
-
scripts/build-wasm.sh
|
|
109
|
-
```
|
|
61
|
+
## Large timestamps
|
|
110
62
|
|
|
111
|
-
|
|
63
|
+
Use a `bigint` for a timestamp beyond `Number.MAX_SAFE_INTEGER`. A `number` that large has already been rounded before this library sees it, so the largest valid value only passes as a `bigint`: `31556889864403199n`.
|
|
112
64
|
|
|
113
|
-
|
|
65
|
+
## What counts as valid
|
|
114
66
|
|
|
115
|
-
|
|
67
|
+
| Scalar | Valid examples |
|
|
68
|
+
|---|---|
|
|
69
|
+
| `AWSDate` | `1970-01-01`, `1970-01-01Z`, `1970-01-01+05:30`, `-2017-05-01` |
|
|
70
|
+
| `AWSTime` | `12:30`, `12:30:24.500`, `12:30:24-07:00` |
|
|
71
|
+
| `AWSDateTime` | `2021-01-11T12:30Z`, `1970-01-01T12:00:00.123456789+05:30` (the offset is required) |
|
|
72
|
+
| `AWSTimestamp` | `1610368224`, `-123123` (whole seconds since 1970) |
|
|
116
73
|
|
|
117
|
-
|
|
118
|
-
git tag v1.2.3 && git push origin v1.2.3
|
|
119
|
-
```
|
|
74
|
+
AppSync accepts and rejects some values its descriptions don't mention, and this library follows AppSync. See [what AppSync accepts](https://github.com/wbgoodwin/appsync-scalars#what-appsync-accepts).
|
|
120
75
|
|
|
121
|
-
|
|
76
|
+
## License
|
|
122
77
|
|
|
123
|
-
|
|
78
|
+
[MIT](https://github.com/wbgoodwin/appsync-scalars/blob/main/LICENSE)
|
package/package.json
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appsync-scalars",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Validates AWS AppSync date and time scalar values.",
|
|
5
5
|
"keywords": ["appsync", "aws", "graphql", "validation", "iso8601"],
|
|
6
6
|
"license": "MIT",
|
|
7
|
+
"homepage": "https://github.com/wbgoodwin/appsync-scalars/blob/main/bindings/js/README.md",
|
|
7
8
|
"repository": {
|
|
8
9
|
"type": "git",
|
|
9
10
|
"url": "git+https://github.com/wbgoodwin/appsync-scalars.git",
|
|
@@ -24,6 +25,6 @@
|
|
|
24
25
|
},
|
|
25
26
|
"scripts": {
|
|
26
27
|
"test": "node --test",
|
|
27
|
-
"prepack": "
|
|
28
|
+
"prepack": "../../scripts/build-wasm.sh"
|
|
28
29
|
}
|
|
29
30
|
}
|
package/wasm.generated.js
CHANGED
|
@@ -1,2 +1,97 @@
|
|
|
1
1
|
// Generated by scripts/build-wasm.sh. Do not edit.
|
|
2
|
-
|
|
2
|
+
// The WebAssembly module built from crates/appsync-scalars-wasm, as base64.
|
|
3
|
+
export const WASM_BASE64 = [
|
|
4
|
+
"AGFzbQEAAAABJgdgAn9/AGAAAX9gAX8Bf2ACf38Bf2ADf39/AGAAAGAFf35+fn4AAw4NAAEBAgID",
|
|
5
|
+
"AgQCAgQFBgUDAQARBgkBfwFBgIDAAAsHdAYGbWVtb3J5AgAWYXBwc3luY19pbnB1dF9jYXBhY2l0",
|
|
6
|
+
"eQABEWFwcHN5bmNfaW5wdXRfcHRyAAISYXBwc3luY19yZWFzb25fbGVuAAMSYXBwc3luY19yZWFz",
|
|
7
|
+
"b25fcHRyAAQQYXBwc3luY192YWxpZGF0ZQAFCosiDVYBAn9BACECAkACQCABRQ0AIAFBDEsNACAB",
|
|
8
|
+
"Qf//v4AAaiIBRQ0BIAEtAAAiAUECdCgC8ITAgAAhAiABLQDkhMCAACEDDAELCyAAIAM2AgQgACAC",
|
|
9
|
+
"NgIACwUAQYAICwgAQaCFwIAAC0IBAn8jgICAgABBEGsiASSAgICAACABQQhqIAAQgICAgAAgASgC",
|
|
10
|
+
"CCEAIAEoAgwhAiABQRBqJICAgIAAIAJBACAAGws2AQF/I4CAgIAAQRBrIgEkgICAgAAgAUEIaiAA",
|
|
11
|
+
"EICAgIAAIAEoAgghACABQRBqJICAgIAAIAAL6g0CCH8CfiOAgICAAEHAAGsiAiSAgICAAEEBIQMC",
|
|
12
|
+
"QCAAQQNLDQAgAUGACEsNAAJAIAFFDQBBACABQXlqIgQgBCABSxshBUGjhcCAAEF8cUGghcCAAGsh",
|
|
13
|
+
"BkEAIQQDQAJAAkACQAJAIAQtAKCFwIAAIgfAIghBAEgNACAGIARrQQNxDQEgBCAFTw0CA0AgBEGk",
|
|
14
|
+
"hcCAAGooAgAgBEGghcCAAGooAgByQYCBgoR4cQ0DIARBCGoiBCAFSQ0ADAMLC0EBIQMCQAJAAkAC",
|
|
15
|
+
"QAJAAkACQAJAAkAgBy0A44LAgABBfmoOAwACAQ4LQQEhAyAEQQFqIgQgAU8NDSAELACghcCAAEG/",
|
|
16
|
+
"f0wNBwwNC0EBIQMgBEEBaiIJIAFPDQwgCSwAoIXAgAAhCSAHQZB+ag4FAgEBAQMBC0EBIQMgBEEB",
|
|
17
|
+
"aiIJIAFPDQsgCSwAoIXAgAAhCQJAAkACQCAHQeABRg0AIAdB7QFGDQEgCEEfakH/AXFBDEkNAiAI",
|
|
18
|
+
"QX5xQW5HDQ4gCUFASA0HDA4LIAlBYHFBoH9GDQYMDQsgCUGff0oNDAwFCyAJQUBIDQQMCwsgCEEP",
|
|
19
|
+
"akH/AXFBAksNCiAJQUBIDQIMCgsgCUHwAGpB/wFxQTBJDQEMCQsgCUGPf0oNCAsgBEECaiIHIAFP",
|
|
20
|
+
"DQcgBywAoIXAgABBv39KDQcgBEEDaiIEIAFPDQcgBCwAoIXAgABBv39KDQcMAQsgBEECaiIEIAFP",
|
|
21
|
+
"DQYgBCwAoIXAgABBv39KDQYLIARBAWohBAwCCyAEQQFqIQQMAQsgBCABTw0AA0AgBEGghcCAAGos",
|
|
22
|
+
"AABBAEgNASABIARBAWoiBEcNAAwDCwsgBCABSQ0ACwsCQAJAAkACQAJAAkACQAJAIAAOBAABAgMA",
|
|
23
|
+
"CyACIAE2AiwgAkGghcCAADYCKCACQShqEIaAgIAAIgNB/wFxQf8BRw0EIAJBMGogAkEoakEAEIeA",
|
|
24
|
+
"gIAAIAIpAzBCAlENA0EAQX8gAigCLBshAwwECyACIAE2AiwgAkGghcCAADYCKCACQShqEIiAgIAA",
|
|
25
|
+
"IgNB/wFxQf8BRw0DIAJBMGogAkEoakEAEIeAgIAAIAIpAzBCAlENAkEAQX8gAigCLBshAwwDCyAC",
|
|
26
|
+
"IAE2AiwgAkGghcCAADYCKCACQShqEIaAgIAAIgNB/wFxQf8BRw0CQQAhAyACKAIsIgRFDQIgAigC",
|
|
27
|
+
"KCIBLQAAQSByQfQARw0CIAIgBEF/ajYCLCACIAFBAWo2AiggAkEoahCIgICAACIDQf8BcUH/AUcN",
|
|
28
|
+
"AiACQTBqIAJBKGpBARCHgICAACACKQMwIgpCAlENAUEAIQMgAigCLA0CQQtBfyACKQM4QqD6A1Yb",
|
|
29
|
+
"QQggCqdBAXEbIQMMAgtBACEDIAEgAUEAR0EALQCghcCAAEEtRnEiB2siBUUNA0GhhcCAAEGghcCA",
|
|
30
|
+
"ACAHGyEAQQAhBAJAAkADQCAFIARGDQEgACAEaiEDIARBAWohBCADLQAAQUZqQf8BcUH2AU8NAAwC",
|
|
31
|
+
"CwsCQCAFQQFGDQAgB0GghcCAAGotAABB/wFxQTBGDQELQQkhAwJAAkACQCABDgIHAAELQQkhA0EA",
|
|
32
|
+
"LQCghcCAACIFQVVqDgMGAQYBC0EALQCghcCAACEFC0GghcCAACEEAkACQAJAAkACQAJAIAVB/wFx",
|
|
33
|
+
"QVVqDgMBAgACCyABQRFJDQJBASEEQgAhCgNAIAJBEGogCiAKQj+HQgpCABCMgICAACACKQMYIAIp",
|
|
34
|
+
"AxAiCkI/h1INBUEJIQMgBEGghcCAAGotAABBUGoiBUEJSw0KIAogBa0iC1MgCiALfSIKQgBTcw0K",
|
|
35
|
+
"IAEgBEEBaiIERw0ADAQLCyABQX9qIQFBoYXAgAAhBAsCQCABQRBJDQBCACEKA0AgAiAKIApCP4dC",
|
|
36
|
+
"CkIAEIyAgIAAIAIpAwggAikDACILQj+HUg0EQQkhAyAELQAAQVBqIgVBCUsNCSAFrSIKQgBTIAsg",
|
|
37
|
+
"CnwiCiALU3MNCSAEQQFqIQQgAUF/aiIBDQAMAwsLIAFFDQZCACEKA0BBCSEDIAQtAABBUGoiBUEJ",
|
|
38
|
+
"Sw0IIARBAWohBCAKQgp+IAWtfCEKIAFBf2oiAQ0ADAILCyABQX9qRQ0FQgAhCkEBIQQDQEEJIQMg",
|
|
39
|
+
"BEGghcCAAGotAABBUGoiBUEJSw0HIApCCn4gBa19IQogASAEQQFqIgRHDQALCyAKQoDY79z+nYc4",
|
|
40
|
+
"fEKAysWxrriO8ABUIgQNBEF/QQkgBBshAwwFC0EJIQMMBAtBACEDDAMLIAItADghAwsgA0H/AXFB",
|
|
41
|
+
"/wFHDQELQQAhAwwBC0EAIQQgA0H/AXEhAQJAA0AgBEGAgMCAAGotAAAgAUYNAUEBIQMgBEEBaiIE",
|
|
42
|
+
"QQxHDQAMAgsLIARBAWohAwsgAkHAAGokgICAgAAgAwu4BgIIfwR+QQAhAQJAIAAoAgQiAkUNAAJA",
|
|
43
|
+
"AkAgACgCACIDLQAAIgRBLUYNACACIQUgAyEGAkACQCAEQStHDQAgACACQX9qIgU2AgQgACADQQFq",
|
|
44
|
+
"IgY2AgAgBQ0AQQAhBUEAIQIMAQsgAyACaiEDQQAhAgNAIAYgAmotAABBUGpB/wFxQQlLDQEgBiAC",
|
|
45
|
+
"QQFqIgJqIANHDQALIAUhAgtBCkEEIARBK0YiAxshB0EFQQQgAxshAwwBCyAAIAJBf2oiBTYCBCAA",
|
|
46
|
+
"IANBAWoiBjYCACAFRQ0BQQAhAgNAQQohB0EEIQMgBiACai0AAEFQakH/AXFBCUsNASAFIAJBAWoi",
|
|
47
|
+
"AkcNAAsgBSECCyADIAJLDQAgAiAHSw0AIAUgAkkNACAGIAJqIQhCACEJIAIhAwNAIAYtAABBUGoi",
|
|
48
|
+
"B0H/AXFBCUsNASAJQgp+IAetQv8Bg3whCSAGQQFqIQYgA0F/aiIDDQALIAAgCDYCACAAIAUgAmsi",
|
|
49
|
+
"AjYCBEEAIQFBAA0AIARBLUYgCVBxDQACQCAJQv+T69wDWA0AQQoPCyACRQ0AIAgtAABBLUcNACAA",
|
|
50
|
+
"IAJBf2o2AgQgACAIQQFqIgc2AgAgAkEDSQ0AIAhBA2ohBEEAIQFCACEKQQAhBUEAIQYDQCAHIAZq",
|
|
51
|
+
"LQAAQVBqIgZB/wFxQQlLDQEgCkIKfiAGrUL/AYN8IQpBASEGIAVBAXEhA0EBIQUgA0UNAAsgACAE",
|
|
52
|
+
"NgIAIAAgAkF9aiIGNgIEIAZFDQAgBC0AAEEtRw0AIAAgAkF8aiIGNgIEIAAgCEEEaiIHNgIAIAZB",
|
|
53
|
+
"AkkNACAIQQZqIQRBACEBQgAhC0EAIQVBACEGA0AgByAGai0AAEFQaiIGQf8BcUEJSw0BIAtCCn4g",
|
|
54
|
+
"Bq1C/wGDfCELQQEhBiAFQQFxIQNBASEFIANFDQALIAAgBDYCACAAIAJBemo2AgQCQCAKQn98QgtY",
|
|
55
|
+
"DQBBAQ8LQh8hDAJAIApCC1YNAAJAQgEgCoZC0BSDQgBSDQAgCkICUg0BQhwhDCAJQgODUEUNAUId",
|
|
56
|
+
"Qh1CHCAJQpADglAbIAlC5ACCQgBSGyEMDAELQh4hDAsCQCALUEUNAEECDwtBAkF/IAsgDFYbIQEL",
|
|
57
|
+
"IAEL9AUEBX8BfgJ/An4CQAJAAkACQAJAAkACQAJAAkACQAJAIAEoAgQiA0UNAAJAAkAgASgCACIE",
|
|
58
|
+
"LQAAIgVBVWoOAwECAQALAkAgBUH6AEYNACAFQdoARw0CCyAAQgA3AwggAEIBNwMAIAEgA0F/ajYC",
|
|
59
|
+
"BCABIARBAWo2AgAPCyABIANBf2o2AgQgASAEQQFqIgY2AgAgA0EDSQ0BIARBA2ohB0EAIQVCACEI",
|
|
60
|
+
"QQAhCQNAIAYgBWotAABBUGoiBUH/AXFBCUsNAiAIQgp+IAWtQv8Bg3whCEEBIQUgCUEBcSEKQQEh",
|
|
61
|
+
"CSAKRQ0ACyABIAc2AgAgASADQX1qIgk2AgQgCUUNAiAHLQAAQTpGDQMgAg0EDAoLIABCADcDAA8L",
|
|
62
|
+
"IABCAjcDACAAQQc6AAgPCyACRQ0HDAILIAEgA0F8aiIFNgIEIAEgBEEEaiIGNgIAIAVBAkkNAyAE",
|
|
63
|
+
"QQZqIQJBACEFQgAhC0EAIQkDQCAGIAVqLQAAQVBqIgVB/wFxQQlLDQQgC0IKfiAFrUL/AYN8IQtB",
|
|
64
|
+
"ASEFIAlBAXEhCkEBIQkgCkUNAAsgASACNgIAIAEgA0F6aiIFNgIEQgAhDCAFRQ0CIAItAABBOkcN",
|
|
65
|
+
"AiABIANBeWoiBTYCBCABIARBB2oiBjYCACAFQQJJDQQgBEEJaiEEQQAhBUIAIQxBACEJA0AgBiAF",
|
|
66
|
+
"ai0AAEFQaiIFQf8BcUEJSw0FIAxCCn4gBa1C/wGDfCEMQQEhBSAJQQFxIQpBASEJIApFDQALIAEg",
|
|
67
|
+
"BDYCACABIANBd2o2AgQMAgtBACEFAkADQCAHIAVqLQAAQVBqQf8BcUEJSw0BIAkgBUEBaiIFRg0H",
|
|
68
|
+
"DAALCyAFDQULQgAhDEIAIQsLAkAgDEI7Vg0AIAhCF1YNACALQjtYDQMLIABCAjcDACAAQQc6AAgP",
|
|
69
|
+
"CyAAQgI3AwAgAEEHOgAIDwsgAEICNwMAIABBBzoACA8LIABCATcDACAAIAwgCEKQHH58IAtCPH58",
|
|
70
|
+
"NwMIDwsgAEICNwMAIABBBzoACAucBAQEfwF+BH8BfgJAIAAoAgQiAUECTw0AQQAPCyAAKAIAIgJB",
|
|
71
|
+
"AmohA0EAIQRCACEFQQAhBkEAIQcCQANAIAIgB2otAABBUGoiB0H/AXFBCUsNASAFQgp+IAetQv8B",
|
|
72
|
+
"g3whBUEBIQcgBkEBcSEIQQEhBiAIRQ0ACyAAIAM2AgAgACABQX5qIgc2AgQgB0UNACADLQAAQTpH",
|
|
73
|
+
"DQAgACABQX1qIgc2AgQgACACQQNqIgM2AgAgB0ECSQ0AIAJBBWohCUEAIQRCACEKQQAhBkEAIQcD",
|
|
74
|
+
"QCADIAdqLQAAQVBqIgdB/wFxQQlLDQEgCkIKfiAHrUL/AYN8IQpBASEHIAZBAXEhCEEBIQYgCEUN",
|
|
75
|
+
"AAsgACAJNgIAIAAgAUF7aiIHNgIEAkAgBUIXWA0AQQMPCwJAIApCO1gNAEEEDwtB/wEhBCAHRQ0A",
|
|
76
|
+
"IAktAABBOkcNACAAIAFBemo2AgQgACACQQZqIgM2AgBBACEEIAdBA0kNACACQQhqIQlBACEEQgAh",
|
|
77
|
+
"BUEAIQZBACEHA0AgAyAHai0AAEFQaiIHQf8BcUEJSw0BIAVCCn4gB61C/wGDfCEFQQEhByAGQQFx",
|
|
78
|
+
"IQhBASEGIAhFDQALIAAgCTYCACAAIAFBeGoiBzYCBAJAIAVCO1gNAEEFDwtB/wEhBCAHRQ0AIAkt",
|
|
79
|
+
"AABBLkcNACAAIAFBd2o2AgQgACACQQlqNgIAQQZBfyAAEImAgIAAQQlLGyEECyAEC3IBA38gACgC",
|
|
80
|
+
"ACEBQQAhAgJAIAAoAgQiA0UNAAJAA0AgASACai0AAEFQakH/AXFBCUsNASADIAJBAWoiAkcNAAsg",
|
|
81
|
+
"AyECDAELIAIgA00NACACIAMgAxCKgICAAAALIAAgAyACazYCBCAAIAEgAmo2AgAgAgsJABCLgICA",
|
|
82
|
+
"AAALAwAAC24BBn4gACADQv////8PgyIFIAFC/////w+DIgZ+IgcgA0IgiCIIIAZ+IgYgBSABQiCI",
|
|
83
|
+
"Igl+fCIFQiCGfCIKNwMAIAAgCCAJfiAFIAZUrUIghiAFQiCIhHwgCiAHVK18IAQgAX4gAyACfnx8",
|
|
84
|
+
"NwMICwuqBQEAQYCAwAALoAUAAQIDBAUGBwgJCgtmb3JtYXQgbm90IHJlY29nbml6ZWRtb250aCBp",
|
|
85
|
+
"cyBvdXQgb2YgcmFuZ2VkYXkgaXMgb3V0IG9mIHJhbmdlIGZvciB0aGUgbW9udGhob3VyIGlzIG91",
|
|
86
|
+
"dCBvZiByYW5nZW1pbnV0ZSBpcyBvdXQgb2YgcmFuZ2VzZWNvbmQgaXMgb3V0IG9mIHJhbmdlZnJh",
|
|
87
|
+
"Y3Rpb25hbCBzZWNvbmRzIGNhbiBoYXZlIGF0IG1vc3QgOSBkaWdpdHN0aW1lIHpvbmUgb2Zmc2V0",
|
|
88
|
+
"IG11c3QgYmUgWiwgK2hoOm1tIG9yICtoaDptbTpzc3RpbWUgem9uZSBvZmZzZXQgaXMgcmVxdWly",
|
|
89
|
+
"ZWR0aW1lc3RhbXAgaXMgb3V0IG9mIHJhbmdleWVhciBpcyBvdXQgb2YgcmFuZ2V0aW1lIHpvbmUg",
|
|
90
|
+
"b2Zmc2V0IGNhbiBiZSBhdCBtb3N0IDE4IGhvdXJzAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB",
|
|
91
|
+
"AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB",
|
|
92
|
+
"AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAAAA",
|
|
93
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIC",
|
|
94
|
+
"AgICAgICAgICAgICAgICAgICAgICAgICAgIDAwMDAwMDAwMDAwMDAwMDBAQEBAQAAAAAAAAAAAAA",
|
|
95
|
+
"AAAVFSEUFhYsLxwZFCgMABAAIQAQADYAEABXABAAawAQAIEAEACXABAAwwAQAPIAEAAOARAAJwEQ",
|
|
96
|
+
"ADsBEAA=",
|
|
97
|
+
].join("");
|