Merge branch 'master' into breathe-effect-framerate
This commit is contained in:
		
						commit
						849373a6d3
					
				
							
								
								
									
										14
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							@ -1,12 +1,14 @@
 | 
				
			|||||||
name: CI Pipeline for the Backend and Frontend
 | 
					name: CI Pipeline for the Backend and Frontend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
on:
 | 
					on:
 | 
				
			||||||
  push:
 | 
					  pull_request:
 | 
				
			||||||
 | 
					    types: [ opened, review_requested, synchronize ]
 | 
				
			||||||
env:
 | 
					env:
 | 
				
			||||||
  NODE_VERSION: 16.15.0
 | 
					  NODE_VERSION: 16.15.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
jobs:
 | 
					jobs:
 | 
				
			||||||
  backend:
 | 
					  backend:
 | 
				
			||||||
 | 
					    if: "!contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')"
 | 
				
			||||||
    strategy:
 | 
					    strategy:
 | 
				
			||||||
      matrix:
 | 
					      matrix:
 | 
				
			||||||
        flavor: ['dev', 'prod']
 | 
					        flavor: ['dev', 'prod']
 | 
				
			||||||
@ -27,12 +29,12 @@ jobs:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      - name: Install
 | 
					      - name: Install
 | 
				
			||||||
        if: ${{ matrix.flavor == 'dev'}}
 | 
					        if: ${{ matrix.flavor == 'dev'}}
 | 
				
			||||||
        run: npm install
 | 
					        run: npm ci
 | 
				
			||||||
        working-directory: ${{ matrix.flavor }}/backend
 | 
					        working-directory: ${{ matrix.flavor }}/backend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Install (Prod dependencies only)
 | 
					      - name: Install (Prod dependencies only)
 | 
				
			||||||
        if: ${{ matrix.flavor == 'prod'}}
 | 
					        if: ${{ matrix.flavor == 'prod'}}
 | 
				
			||||||
        run: npm install --prod
 | 
					        run: npm ci --prod --no-optional
 | 
				
			||||||
        working-directory: ${{ matrix.flavor }}/backend
 | 
					        working-directory: ${{ matrix.flavor }}/backend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Lint 
 | 
					      - name: Lint 
 | 
				
			||||||
@ -48,6 +50,7 @@ jobs:
 | 
				
			|||||||
        working-directory: ${{ matrix.flavor }}/backend
 | 
					        working-directory: ${{ matrix.flavor }}/backend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  frontend:
 | 
					  frontend:
 | 
				
			||||||
 | 
					    if: "!contains(github.event.pull_request.labels.*.name, 'ops') && !contains(github.head_ref, 'ops/')"
 | 
				
			||||||
    strategy:
 | 
					    strategy:
 | 
				
			||||||
      matrix:
 | 
					      matrix:
 | 
				
			||||||
        flavor: ['dev', 'prod']
 | 
					        flavor: ['dev', 'prod']
 | 
				
			||||||
@ -67,16 +70,17 @@ jobs:
 | 
				
			|||||||
          registry-url: 'https://registry.npmjs.org'
 | 
					          registry-url: 'https://registry.npmjs.org'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Install (Prod dependencies only)
 | 
					      - name: Install (Prod dependencies only)
 | 
				
			||||||
        run: npm install
 | 
					        run: npm ci --prod --no-optional
 | 
				
			||||||
        if: ${{ matrix.flavor == 'prod'}}
 | 
					        if: ${{ matrix.flavor == 'prod'}}
 | 
				
			||||||
        working-directory: ${{ matrix.flavor }}/frontend
 | 
					        working-directory: ${{ matrix.flavor }}/frontend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Install
 | 
					      - name: Install
 | 
				
			||||||
        if: ${{ matrix.flavor == 'dev'}}
 | 
					        if: ${{ matrix.flavor == 'dev'}}
 | 
				
			||||||
        run: npm install
 | 
					        run: npm ci
 | 
				
			||||||
        working-directory: ${{ matrix.flavor }}/frontend
 | 
					        working-directory: ${{ matrix.flavor }}/frontend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Lint
 | 
					      - name: Lint
 | 
				
			||||||
 | 
					        if: ${{ matrix.flavor == 'dev'}}
 | 
				
			||||||
        run: npm run lint
 | 
					        run: npm run lint
 | 
				
			||||||
        working-directory: ${{ matrix.flavor }}/frontend
 | 
					        working-directory: ${{ matrix.flavor }}/frontend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										17
									
								
								backend/.editorconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								backend/.editorconfig
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					# Editor configuration, see https://editorconfig.org
 | 
				
			||||||
 | 
					root = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[*]
 | 
				
			||||||
 | 
					charset = utf-8
 | 
				
			||||||
 | 
					indent_style = space
 | 
				
			||||||
 | 
					indent_size = 2
 | 
				
			||||||
 | 
					insert_final_newline = true
 | 
				
			||||||
 | 
					trim_trailing_whitespace = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[*.ts]
 | 
				
			||||||
 | 
					quote_type = single
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[*.md]
 | 
				
			||||||
 | 
					max_line_length = off
 | 
				
			||||||
 | 
					trim_trailing_whitespace = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -7,7 +7,8 @@
 | 
				
			|||||||
  "extends": [
 | 
					  "extends": [
 | 
				
			||||||
    "eslint:recommended",
 | 
					    "eslint:recommended",
 | 
				
			||||||
    "plugin:@typescript-eslint/eslint-recommended",
 | 
					    "plugin:@typescript-eslint/eslint-recommended",
 | 
				
			||||||
    "plugin:@typescript-eslint/recommended"
 | 
					    "plugin:@typescript-eslint/recommended",
 | 
				
			||||||
 | 
					    "prettier"
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  "rules": {
 | 
					  "rules": {
 | 
				
			||||||
    "@typescript-eslint/ban-ts-comment": 1,
 | 
					    "@typescript-eslint/ban-ts-comment": 1,
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								backend/.prettierignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								backend/.prettierignore
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					node_modules
 | 
				
			||||||
 | 
					package-lock.json
 | 
				
			||||||
							
								
								
									
										6
									
								
								backend/.prettierrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								backend/.prettierrc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "endOfLine": "lf",
 | 
				
			||||||
 | 
					  "printWidth": 80,
 | 
				
			||||||
 | 
					  "tabWidth": 2,
 | 
				
			||||||
 | 
					  "trailingComma": "es5"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										512
									
								
								backend/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										512
									
								
								backend/package-lock.json
									
									
									
										generated
									
									
									
								
							@ -23,12 +23,14 @@
 | 
				
			|||||||
      },
 | 
					      },
 | 
				
			||||||
      "devDependencies": {
 | 
					      "devDependencies": {
 | 
				
			||||||
        "@types/compression": "^1.7.2",
 | 
					        "@types/compression": "^1.7.2",
 | 
				
			||||||
 | 
					        "@types/crypto-js": "^4.1.1",
 | 
				
			||||||
        "@types/express": "^4.17.13",
 | 
					        "@types/express": "^4.17.13",
 | 
				
			||||||
        "@types/ws": "~8.5.3",
 | 
					        "@types/ws": "~8.5.3",
 | 
				
			||||||
        "@typescript-eslint/eslint-plugin": "^5.30.5",
 | 
					        "@typescript-eslint/eslint-plugin": "^5.30.5",
 | 
				
			||||||
        "@typescript-eslint/parser": "^5.30.5",
 | 
					        "@typescript-eslint/parser": "^5.30.5",
 | 
				
			||||||
        "eslint": "^8.19.0",
 | 
					        "eslint": "^8.19.0",
 | 
				
			||||||
        "tslint": "^6.1.0"
 | 
					        "eslint-config-prettier": "^8.5.0",
 | 
				
			||||||
 | 
					        "prettier": "^2.7.1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@babel/code-frame": {
 | 
					    "node_modules/@babel/code-frame": {
 | 
				
			||||||
@ -232,6 +234,12 @@
 | 
				
			|||||||
        "@types/node": "*"
 | 
					        "@types/node": "*"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/@types/crypto-js": {
 | 
				
			||||||
 | 
					      "version": "4.1.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==",
 | 
				
			||||||
 | 
					      "dev": true
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/@types/express": {
 | 
					    "node_modules/@types/express": {
 | 
				
			||||||
      "version": "4.17.13",
 | 
					      "version": "4.17.13",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
 | 
				
			||||||
@ -744,27 +752,6 @@
 | 
				
			|||||||
        "node": ">=8"
 | 
					        "node": ">=8"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/ansi-styles": {
 | 
					 | 
				
			||||||
      "version": "3.2.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "color-convert": "^1.9.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=4"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/argparse": {
 | 
					 | 
				
			||||||
      "version": "1.0.10",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "sprintf-js": "~1.0.2"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/array-flatten": {
 | 
					    "node_modules/array-flatten": {
 | 
				
			||||||
      "version": "1.1.1",
 | 
					      "version": "1.1.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
 | 
				
			||||||
@ -900,15 +887,6 @@
 | 
				
			|||||||
        "safe-buffer": "^5.1.2"
 | 
					        "safe-buffer": "^5.1.2"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/builtin-modules": {
 | 
					 | 
				
			||||||
      "version": "1.1.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=0.10.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/bytes": {
 | 
					    "node_modules/bytes": {
 | 
				
			||||||
      "version": "3.1.2",
 | 
					      "version": "3.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
 | 
				
			||||||
@ -938,20 +916,6 @@
 | 
				
			|||||||
        "node": ">=6"
 | 
					        "node": ">=6"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/chalk": {
 | 
					 | 
				
			||||||
      "version": "2.4.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "ansi-styles": "^3.2.1",
 | 
					 | 
				
			||||||
        "escape-string-regexp": "^1.0.5",
 | 
					 | 
				
			||||||
        "supports-color": "^5.3.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=4"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/cipher-base": {
 | 
					    "node_modules/cipher-base": {
 | 
				
			||||||
      "version": "1.0.4",
 | 
					      "version": "1.0.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
 | 
				
			||||||
@ -961,21 +925,6 @@
 | 
				
			|||||||
        "safe-buffer": "^5.0.1"
 | 
					        "safe-buffer": "^5.0.1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/color-convert": {
 | 
					 | 
				
			||||||
      "version": "1.9.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "color-name": "1.1.3"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/color-name": {
 | 
					 | 
				
			||||||
      "version": "1.1.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/combined-stream": {
 | 
					    "node_modules/combined-stream": {
 | 
				
			||||||
      "version": "1.0.8",
 | 
					      "version": "1.0.8",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
 | 
				
			||||||
@ -987,12 +936,6 @@
 | 
				
			|||||||
        "node": ">= 0.8"
 | 
					        "node": ">= 0.8"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/commander": {
 | 
					 | 
				
			||||||
      "version": "2.20.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/concat-map": {
 | 
					    "node_modules/concat-map": {
 | 
				
			||||||
      "version": "0.0.1",
 | 
					      "version": "0.0.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 | 
				
			||||||
@ -1109,15 +1052,6 @@
 | 
				
			|||||||
        "npm": "1.2.8000 || >= 1.4.16"
 | 
					        "npm": "1.2.8000 || >= 1.4.16"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/diff": {
 | 
					 | 
				
			||||||
      "version": "4.0.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=0.3.1"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/dir-glob": {
 | 
					    "node_modules/dir-glob": {
 | 
				
			||||||
      "version": "3.0.1",
 | 
					      "version": "3.0.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
 | 
				
			||||||
@ -1160,15 +1094,6 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
 | 
				
			||||||
      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
 | 
					      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/escape-string-regexp": {
 | 
					 | 
				
			||||||
      "version": "1.0.5",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=0.8.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/eslint": {
 | 
					    "node_modules/eslint": {
 | 
				
			||||||
      "version": "8.19.0",
 | 
					      "version": "8.19.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.19.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.19.0.tgz",
 | 
				
			||||||
@ -1221,6 +1146,18 @@
 | 
				
			|||||||
        "url": "https://opencollective.com/eslint"
 | 
					        "url": "https://opencollective.com/eslint"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/eslint-config-prettier": {
 | 
				
			||||||
 | 
					      "version": "8.5.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "bin": {
 | 
				
			||||||
 | 
					        "eslint-config-prettier": "bin/cli.js"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "peerDependencies": {
 | 
				
			||||||
 | 
					        "eslint": ">=7.0.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/eslint-scope": {
 | 
					    "node_modules/eslint-scope": {
 | 
				
			||||||
      "version": "5.1.1",
 | 
					      "version": "5.1.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
 | 
				
			||||||
@ -1429,19 +1366,6 @@
 | 
				
			|||||||
        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
 | 
					        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/esprima": {
 | 
					 | 
				
			||||||
      "version": "4.0.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "bin": {
 | 
					 | 
				
			||||||
        "esparse": "bin/esparse.js",
 | 
					 | 
				
			||||||
        "esvalidate": "bin/esvalidate.js"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=4"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/esquery": {
 | 
					    "node_modules/esquery": {
 | 
				
			||||||
      "version": "1.4.0",
 | 
					      "version": "1.4.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
 | 
				
			||||||
@ -1830,15 +1754,6 @@
 | 
				
			|||||||
        "node": ">= 0.4.0"
 | 
					        "node": ">= 0.4.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/has-flag": {
 | 
					 | 
				
			||||||
      "version": "3.0.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=4"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/has-symbols": {
 | 
					    "node_modules/has-symbols": {
 | 
				
			||||||
      "version": "1.0.3",
 | 
					      "version": "1.0.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
 | 
				
			||||||
@ -1951,18 +1866,6 @@
 | 
				
			|||||||
        "node": ">= 0.10"
 | 
					        "node": ">= 0.10"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/is-core-module": {
 | 
					 | 
				
			||||||
      "version": "2.2.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "has": "^1.0.3"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "funding": {
 | 
					 | 
				
			||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/is-extglob": {
 | 
					    "node_modules/is-extglob": {
 | 
				
			||||||
      "version": "2.1.1",
 | 
					      "version": "2.1.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
 | 
				
			||||||
@ -2004,25 +1907,6 @@
 | 
				
			|||||||
      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
 | 
					      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/js-tokens": {
 | 
					 | 
				
			||||||
      "version": "4.0.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/js-yaml": {
 | 
					 | 
				
			||||||
      "version": "3.14.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "argparse": "^1.0.7",
 | 
					 | 
				
			||||||
        "esprima": "^4.0.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "bin": {
 | 
					 | 
				
			||||||
        "js-yaml": "bin/js-yaml.js"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/json-schema-traverse": {
 | 
					    "node_modules/json-schema-traverse": {
 | 
				
			||||||
      "version": "0.4.1",
 | 
					      "version": "0.4.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
 | 
				
			||||||
@ -2165,24 +2049,6 @@
 | 
				
			|||||||
        "node": "*"
 | 
					        "node": "*"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/minimist": {
 | 
					 | 
				
			||||||
      "version": "1.2.6",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/mkdirp": {
 | 
					 | 
				
			||||||
      "version": "0.5.5",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "minimist": "^1.2.5"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "bin": {
 | 
					 | 
				
			||||||
        "mkdirp": "bin/cmd.js"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/ms": {
 | 
					    "node_modules/ms": {
 | 
				
			||||||
      "version": "2.0.0",
 | 
					      "version": "2.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
 | 
				
			||||||
@ -2344,12 +2210,6 @@
 | 
				
			|||||||
        "node": ">=8"
 | 
					        "node": ">=8"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/path-parse": {
 | 
					 | 
				
			||||||
      "version": "1.0.7",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/path-to-regexp": {
 | 
					    "node_modules/path-to-regexp": {
 | 
				
			||||||
      "version": "0.1.7",
 | 
					      "version": "0.1.7",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
 | 
				
			||||||
@ -2385,6 +2245,21 @@
 | 
				
			|||||||
        "node": ">= 0.8.0"
 | 
					        "node": ">= 0.8.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/prettier": {
 | 
				
			||||||
 | 
					      "version": "2.7.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "bin": {
 | 
				
			||||||
 | 
					        "prettier": "bin-prettier.js"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=10.13.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/prettier/prettier?sponsor=1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/proxy-addr": {
 | 
					    "node_modules/proxy-addr": {
 | 
				
			||||||
      "version": "2.0.7",
 | 
					      "version": "2.0.7",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
 | 
				
			||||||
@ -2492,19 +2367,6 @@
 | 
				
			|||||||
        "url": "https://github.com/sponsors/mysticatea"
 | 
					        "url": "https://github.com/sponsors/mysticatea"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/resolve": {
 | 
					 | 
				
			||||||
      "version": "1.19.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "is-core-module": "^2.1.0",
 | 
					 | 
				
			||||||
        "path-parse": "^1.0.6"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "funding": {
 | 
					 | 
				
			||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/resolve-from": {
 | 
					    "node_modules/resolve-from": {
 | 
				
			||||||
      "version": "4.0.0",
 | 
					      "version": "4.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
 | 
				
			||||||
@ -2595,15 +2457,6 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
 | 
					      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/semver": {
 | 
					 | 
				
			||||||
      "version": "5.7.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "bin": {
 | 
					 | 
				
			||||||
        "semver": "bin/semver"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/send": {
 | 
					    "node_modules/send": {
 | 
				
			||||||
      "version": "0.18.0",
 | 
					      "version": "0.18.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
 | 
				
			||||||
@ -2767,12 +2620,6 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
 | 
					      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/sprintf-js": {
 | 
					 | 
				
			||||||
      "version": "1.0.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/sqlstring": {
 | 
					    "node_modules/sqlstring": {
 | 
				
			||||||
      "version": "2.3.2",
 | 
					      "version": "2.3.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz",
 | 
				
			||||||
@ -2821,18 +2668,6 @@
 | 
				
			|||||||
        "url": "https://github.com/sponsors/sindresorhus"
 | 
					        "url": "https://github.com/sponsors/sindresorhus"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/supports-color": {
 | 
					 | 
				
			||||||
      "version": "5.5.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "has-flag": "^3.0.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=4"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/text-table": {
 | 
					    "node_modules/text-table": {
 | 
				
			||||||
      "version": "0.2.0",
 | 
					      "version": "0.2.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
 | 
				
			||||||
@ -2865,49 +2700,6 @@
 | 
				
			|||||||
      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
 | 
					      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/tslint": {
 | 
					 | 
				
			||||||
      "version": "6.1.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==",
 | 
					 | 
				
			||||||
      "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "@babel/code-frame": "^7.0.0",
 | 
					 | 
				
			||||||
        "builtin-modules": "^1.1.1",
 | 
					 | 
				
			||||||
        "chalk": "^2.3.0",
 | 
					 | 
				
			||||||
        "commander": "^2.12.1",
 | 
					 | 
				
			||||||
        "diff": "^4.0.1",
 | 
					 | 
				
			||||||
        "glob": "^7.1.1",
 | 
					 | 
				
			||||||
        "js-yaml": "^3.13.1",
 | 
					 | 
				
			||||||
        "minimatch": "^3.0.4",
 | 
					 | 
				
			||||||
        "mkdirp": "^0.5.3",
 | 
					 | 
				
			||||||
        "resolve": "^1.3.2",
 | 
					 | 
				
			||||||
        "semver": "^5.3.0",
 | 
					 | 
				
			||||||
        "tslib": "^1.13.0",
 | 
					 | 
				
			||||||
        "tsutils": "^2.29.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "bin": {
 | 
					 | 
				
			||||||
        "tslint": "bin/tslint"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "engines": {
 | 
					 | 
				
			||||||
        "node": ">=4.8.0"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "peerDependencies": {
 | 
					 | 
				
			||||||
        "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/tsutils": {
 | 
					 | 
				
			||||||
      "version": "2.29.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "tslib": "^1.8.1"
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      "peerDependencies": {
 | 
					 | 
				
			||||||
        "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/type-check": {
 | 
					    "node_modules/type-check": {
 | 
				
			||||||
      "version": "0.4.0",
 | 
					      "version": "0.4.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
 | 
				
			||||||
@ -3078,32 +2870,6 @@
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@babel/code-frame": {
 | 
					 | 
				
			||||||
      "version": "7.12.11",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					 | 
				
			||||||
        "@babel/highlight": "^7.10.4"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "@babel/helper-validator-identifier": {
 | 
					 | 
				
			||||||
      "version": "7.12.11",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "@babel/highlight": {
 | 
					 | 
				
			||||||
      "version": "7.10.4",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					 | 
				
			||||||
        "@babel/helper-validator-identifier": "^7.10.4",
 | 
					 | 
				
			||||||
        "chalk": "^2.0.0",
 | 
					 | 
				
			||||||
        "js-tokens": "^4.0.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "@eslint/eslintrc": {
 | 
					    "@eslint/eslintrc": {
 | 
				
			||||||
      "version": "1.3.0",
 | 
					      "version": "1.3.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
 | 
				
			||||||
@ -3246,6 +3012,12 @@
 | 
				
			|||||||
        "@types/node": "*"
 | 
					        "@types/node": "*"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "@types/crypto-js": {
 | 
				
			||||||
 | 
					      "version": "4.1.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==",
 | 
				
			||||||
 | 
					      "dev": true
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "@types/express": {
 | 
					    "@types/express": {
 | 
				
			||||||
      "version": "4.17.13",
 | 
					      "version": "4.17.13",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz",
 | 
				
			||||||
@ -3588,24 +3360,6 @@
 | 
				
			|||||||
      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 | 
					      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "ansi-styles": {
 | 
					 | 
				
			||||||
      "version": "3.2.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					 | 
				
			||||||
        "color-convert": "^1.9.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "argparse": {
 | 
					 | 
				
			||||||
      "version": "1.0.10",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					 | 
				
			||||||
        "sprintf-js": "~1.0.2"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "array-flatten": {
 | 
					    "array-flatten": {
 | 
				
			||||||
      "version": "1.1.1",
 | 
					      "version": "1.1.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
 | 
				
			||||||
@ -3725,12 +3479,6 @@
 | 
				
			|||||||
        "safe-buffer": "^5.1.2"
 | 
					        "safe-buffer": "^5.1.2"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "builtin-modules": {
 | 
					 | 
				
			||||||
      "version": "1.1.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "bytes": {
 | 
					    "bytes": {
 | 
				
			||||||
      "version": "3.1.2",
 | 
					      "version": "3.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
 | 
				
			||||||
@ -3751,17 +3499,6 @@
 | 
				
			|||||||
      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
 | 
					      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "chalk": {
 | 
					 | 
				
			||||||
      "version": "2.4.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					 | 
				
			||||||
        "ansi-styles": "^3.2.1",
 | 
					 | 
				
			||||||
        "escape-string-regexp": "^1.0.5",
 | 
					 | 
				
			||||||
        "supports-color": "^5.3.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "cipher-base": {
 | 
					    "cipher-base": {
 | 
				
			||||||
      "version": "1.0.4",
 | 
					      "version": "1.0.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
 | 
				
			||||||
@ -3771,21 +3508,6 @@
 | 
				
			|||||||
        "safe-buffer": "^5.0.1"
 | 
					        "safe-buffer": "^5.0.1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "color-convert": {
 | 
					 | 
				
			||||||
      "version": "1.9.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					 | 
				
			||||||
        "color-name": "1.1.3"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "color-name": {
 | 
					 | 
				
			||||||
      "version": "1.1.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "combined-stream": {
 | 
					    "combined-stream": {
 | 
				
			||||||
      "version": "1.0.8",
 | 
					      "version": "1.0.8",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
 | 
				
			||||||
@ -3794,12 +3516,6 @@
 | 
				
			|||||||
        "delayed-stream": "~1.0.0"
 | 
					        "delayed-stream": "~1.0.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "commander": {
 | 
					 | 
				
			||||||
      "version": "2.20.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "concat-map": {
 | 
					    "concat-map": {
 | 
				
			||||||
      "version": "0.0.1",
 | 
					      "version": "0.0.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 | 
				
			||||||
@ -3891,12 +3607,6 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
 | 
					      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "diff": {
 | 
					 | 
				
			||||||
      "version": "4.0.2",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "dir-glob": {
 | 
					    "dir-glob": {
 | 
				
			||||||
      "version": "3.0.1",
 | 
					      "version": "3.0.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
 | 
				
			||||||
@ -3930,12 +3640,6 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
 | 
				
			||||||
      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
 | 
					      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "escape-string-regexp": {
 | 
					 | 
				
			||||||
      "version": "1.0.5",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "eslint": {
 | 
					    "eslint": {
 | 
				
			||||||
      "version": "8.19.0",
 | 
					      "version": "8.19.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.19.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.19.0.tgz",
 | 
				
			||||||
@ -4082,6 +3786,13 @@
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "eslint-config-prettier": {
 | 
				
			||||||
 | 
					      "version": "8.5.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "requires": {}
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "eslint-scope": {
 | 
					    "eslint-scope": {
 | 
				
			||||||
      "version": "5.1.1",
 | 
					      "version": "5.1.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
 | 
				
			||||||
@ -4126,12 +3837,6 @@
 | 
				
			|||||||
        "eslint-visitor-keys": "^3.3.0"
 | 
					        "eslint-visitor-keys": "^3.3.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "esprima": {
 | 
					 | 
				
			||||||
      "version": "4.0.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "esquery": {
 | 
					    "esquery": {
 | 
				
			||||||
      "version": "1.4.0",
 | 
					      "version": "1.4.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
 | 
				
			||||||
@ -4434,12 +4139,6 @@
 | 
				
			|||||||
        "function-bind": "^1.1.1"
 | 
					        "function-bind": "^1.1.1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "has-flag": {
 | 
					 | 
				
			||||||
      "version": "3.0.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "has-symbols": {
 | 
					    "has-symbols": {
 | 
				
			||||||
      "version": "1.0.3",
 | 
					      "version": "1.0.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
 | 
				
			||||||
@ -4522,15 +4221,6 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
 | 
					      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "is-core-module": {
 | 
					 | 
				
			||||||
      "version": "2.2.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					 | 
				
			||||||
        "has": "^1.0.3"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "is-extglob": {
 | 
					    "is-extglob": {
 | 
				
			||||||
      "version": "2.1.1",
 | 
					      "version": "2.1.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
 | 
				
			||||||
@ -4563,22 +4253,6 @@
 | 
				
			|||||||
      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
 | 
					      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "js-tokens": {
 | 
					 | 
				
			||||||
      "version": "4.0.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "js-yaml": {
 | 
					 | 
				
			||||||
      "version": "3.14.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					 | 
				
			||||||
        "argparse": "^1.0.7",
 | 
					 | 
				
			||||||
        "esprima": "^4.0.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "json-schema-traverse": {
 | 
					    "json-schema-traverse": {
 | 
				
			||||||
      "version": "0.4.1",
 | 
					      "version": "0.4.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
 | 
				
			||||||
@ -4688,21 +4362,6 @@
 | 
				
			|||||||
        "brace-expansion": "^1.1.7"
 | 
					        "brace-expansion": "^1.1.7"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "minimist": {
 | 
					 | 
				
			||||||
      "version": "1.2.6",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "mkdirp": {
 | 
					 | 
				
			||||||
      "version": "0.5.5",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					 | 
				
			||||||
        "minimist": "^1.2.5"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "ms": {
 | 
					    "ms": {
 | 
				
			||||||
      "version": "2.0.0",
 | 
					      "version": "2.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
 | 
				
			||||||
@ -4835,12 +4494,6 @@
 | 
				
			|||||||
      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
 | 
					      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "path-parse": {
 | 
					 | 
				
			||||||
      "version": "1.0.7",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "path-to-regexp": {
 | 
					    "path-to-regexp": {
 | 
				
			||||||
      "version": "0.1.7",
 | 
					      "version": "0.1.7",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
 | 
				
			||||||
@ -4864,6 +4517,12 @@
 | 
				
			|||||||
      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
 | 
					      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "prettier": {
 | 
				
			||||||
 | 
					      "version": "2.7.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
 | 
				
			||||||
 | 
					      "dev": true
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "proxy-addr": {
 | 
					    "proxy-addr": {
 | 
				
			||||||
      "version": "2.0.7",
 | 
					      "version": "2.0.7",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
 | 
				
			||||||
@ -4930,16 +4589,6 @@
 | 
				
			|||||||
      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
 | 
					      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "resolve": {
 | 
					 | 
				
			||||||
      "version": "1.19.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					 | 
				
			||||||
        "is-core-module": "^2.1.0",
 | 
					 | 
				
			||||||
        "path-parse": "^1.0.6"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "resolve-from": {
 | 
					    "resolve-from": {
 | 
				
			||||||
      "version": "4.0.0",
 | 
					      "version": "4.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
 | 
				
			||||||
@ -4989,12 +4638,6 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
 | 
					      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "semver": {
 | 
					 | 
				
			||||||
      "version": "5.7.1",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "send": {
 | 
					    "send": {
 | 
				
			||||||
      "version": "0.18.0",
 | 
					      "version": "0.18.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
 | 
				
			||||||
@ -5122,12 +4765,6 @@
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "sprintf-js": {
 | 
					 | 
				
			||||||
      "version": "1.0.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
 | 
					 | 
				
			||||||
      "dev": true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "sqlstring": {
 | 
					    "sqlstring": {
 | 
				
			||||||
      "version": "2.3.2",
 | 
					      "version": "2.3.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz",
 | 
				
			||||||
@ -5161,15 +4798,6 @@
 | 
				
			|||||||
      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
 | 
					      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "supports-color": {
 | 
					 | 
				
			||||||
      "version": "5.5.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					 | 
				
			||||||
        "has-flag": "^3.0.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "text-table": {
 | 
					    "text-table": {
 | 
				
			||||||
      "version": "0.2.0",
 | 
					      "version": "0.2.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
 | 
				
			||||||
@ -5196,36 +4824,6 @@
 | 
				
			|||||||
      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
 | 
					      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "tslint": {
 | 
					 | 
				
			||||||
      "version": "6.1.3",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					 | 
				
			||||||
        "@babel/code-frame": "^7.0.0",
 | 
					 | 
				
			||||||
        "builtin-modules": "^1.1.1",
 | 
					 | 
				
			||||||
        "chalk": "^2.3.0",
 | 
					 | 
				
			||||||
        "commander": "^2.12.1",
 | 
					 | 
				
			||||||
        "diff": "^4.0.1",
 | 
					 | 
				
			||||||
        "glob": "^7.1.1",
 | 
					 | 
				
			||||||
        "js-yaml": "^3.13.1",
 | 
					 | 
				
			||||||
        "minimatch": "^3.0.4",
 | 
					 | 
				
			||||||
        "mkdirp": "^0.5.3",
 | 
					 | 
				
			||||||
        "resolve": "^1.3.2",
 | 
					 | 
				
			||||||
        "semver": "^5.3.0",
 | 
					 | 
				
			||||||
        "tslib": "^1.13.0",
 | 
					 | 
				
			||||||
        "tsutils": "^2.29.0"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "tsutils": {
 | 
					 | 
				
			||||||
      "version": "2.29.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
 | 
					 | 
				
			||||||
      "dev": true,
 | 
					 | 
				
			||||||
      "requires": {
 | 
					 | 
				
			||||||
        "tslib": "^1.8.1"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "type-check": {
 | 
					    "type-check": {
 | 
				
			||||||
      "version": "0.4.0",
 | 
					      "version": "0.4.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
 | 
				
			||||||
 | 
				
			|||||||
@ -26,7 +26,8 @@
 | 
				
			|||||||
    "start-production": "node --max-old-space-size=4096 dist/index.js",
 | 
					    "start-production": "node --max-old-space-size=4096 dist/index.js",
 | 
				
			||||||
    "test": "echo \"Error: no test specified\" && exit 1",
 | 
					    "test": "echo \"Error: no test specified\" && exit 1",
 | 
				
			||||||
    "lint": "./node_modules/.bin/eslint . --ext .ts",
 | 
					    "lint": "./node_modules/.bin/eslint . --ext .ts",
 | 
				
			||||||
    "lint:fix": "./node_modules/.bin/eslint . --ext .ts --fix"
 | 
					    "lint:fix": "./node_modules/.bin/eslint . --ext .ts --fix",
 | 
				
			||||||
 | 
					    "prettier": "./node_modules/.bin/prettier --write \"src/**/*.{js,ts}\""
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@mempool/electrum-client": "^1.1.7",
 | 
					    "@mempool/electrum-client": "^1.1.7",
 | 
				
			||||||
@ -43,11 +44,13 @@
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "@types/compression": "^1.7.2",
 | 
					    "@types/compression": "^1.7.2",
 | 
				
			||||||
 | 
					    "@types/crypto-js": "^4.1.1",
 | 
				
			||||||
    "@types/express": "^4.17.13",
 | 
					    "@types/express": "^4.17.13",
 | 
				
			||||||
    "@types/ws": "~8.5.3",
 | 
					    "@types/ws": "~8.5.3",
 | 
				
			||||||
    "@typescript-eslint/eslint-plugin": "^5.30.5",
 | 
					    "@typescript-eslint/eslint-plugin": "^5.30.5",
 | 
				
			||||||
    "@typescript-eslint/parser": "^5.30.5",
 | 
					    "@typescript-eslint/parser": "^5.30.5",
 | 
				
			||||||
    "eslint": "^8.19.0",
 | 
					    "eslint": "^8.19.0",
 | 
				
			||||||
    "tslint": "^6.1.0"
 | 
					    "eslint-config-prettier": "^8.5.0",
 | 
				
			||||||
 | 
					    "prettier": "^2.7.1"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -5,8 +5,7 @@ import { IEsploraApi } from './esplora-api.interface';
 | 
				
			|||||||
import { IElectrumApi } from './electrum-api.interface';
 | 
					import { IElectrumApi } from './electrum-api.interface';
 | 
				
			||||||
import BitcoinApi from './bitcoin-api';
 | 
					import BitcoinApi from './bitcoin-api';
 | 
				
			||||||
import logger from '../../logger';
 | 
					import logger from '../../logger';
 | 
				
			||||||
import * as sha256 from 'crypto-js/sha256';
 | 
					import crypto from "crypto-js";
 | 
				
			||||||
import * as hexEnc from 'crypto-js/enc-hex';
 | 
					 | 
				
			||||||
import loadingIndicators from '../loading-indicators';
 | 
					import loadingIndicators from '../loading-indicators';
 | 
				
			||||||
import memoryCache from '../memory-cache';
 | 
					import memoryCache from '../memory-cache';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -144,8 +143,8 @@ class BitcoindElectrsApi extends BitcoinApi implements AbstractBitcoinApi {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private encodeScriptHash(scriptPubKey: string): string {
 | 
					  private encodeScriptHash(scriptPubKey: string): string {
 | 
				
			||||||
    const addrScripthash = hexEnc.stringify(sha256(hexEnc.parse(scriptPubKey)));
 | 
					    const addrScripthash = crypto.enc.Hex.stringify(crypto.SHA256(crypto.enc.Hex.parse(scriptPubKey)));
 | 
				
			||||||
    return addrScripthash.match(/.{2}/g).reverse().join('');
 | 
					    return addrScripthash!.match(/.{2}/g)!.reverse().join('');
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,137 +0,0 @@
 | 
				
			|||||||
{
 | 
					 | 
				
			||||||
  "rules": {
 | 
					 | 
				
			||||||
    "arrow-return-shorthand": true,
 | 
					 | 
				
			||||||
    "callable-types": true,
 | 
					 | 
				
			||||||
    "class-name": true,
 | 
					 | 
				
			||||||
    "comment-format": [
 | 
					 | 
				
			||||||
      true,
 | 
					 | 
				
			||||||
      "check-space"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "curly": true,
 | 
					 | 
				
			||||||
    "deprecation": {
 | 
					 | 
				
			||||||
      "severity": "warn"
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "eofline": true,
 | 
					 | 
				
			||||||
    "forin": false,
 | 
					 | 
				
			||||||
    "import-blacklist": [
 | 
					 | 
				
			||||||
      true,
 | 
					 | 
				
			||||||
      "rxjs",
 | 
					 | 
				
			||||||
      "rxjs/Rx"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "import-spacing": true,
 | 
					 | 
				
			||||||
    "indent": [
 | 
					 | 
				
			||||||
      true,
 | 
					 | 
				
			||||||
      "spaces"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "interface-over-type-literal": true,
 | 
					 | 
				
			||||||
    "label-position": true,
 | 
					 | 
				
			||||||
    "max-line-length": [
 | 
					 | 
				
			||||||
      true,
 | 
					 | 
				
			||||||
      140
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "member-access": false,
 | 
					 | 
				
			||||||
    "member-ordering": [
 | 
					 | 
				
			||||||
      true,
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        "order": [
 | 
					 | 
				
			||||||
          "static-field",
 | 
					 | 
				
			||||||
          "instance-field",
 | 
					 | 
				
			||||||
          "static-method",
 | 
					 | 
				
			||||||
          "instance-method"
 | 
					 | 
				
			||||||
        ]
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "no-arg": true,
 | 
					 | 
				
			||||||
    "no-bitwise": true,
 | 
					 | 
				
			||||||
    "no-console": [
 | 
					 | 
				
			||||||
      true,
 | 
					 | 
				
			||||||
      "debug",
 | 
					 | 
				
			||||||
      "info",
 | 
					 | 
				
			||||||
      "time",
 | 
					 | 
				
			||||||
      "timeEnd",
 | 
					 | 
				
			||||||
      "trace"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "no-construct": true,
 | 
					 | 
				
			||||||
    "no-debugger": true,
 | 
					 | 
				
			||||||
    "no-duplicate-super": true,
 | 
					 | 
				
			||||||
    "no-empty": false,
 | 
					 | 
				
			||||||
    "no-empty-interface": true,
 | 
					 | 
				
			||||||
    "no-eval": true,
 | 
					 | 
				
			||||||
    "no-inferrable-types": false,
 | 
					 | 
				
			||||||
    "no-misused-new": true,
 | 
					 | 
				
			||||||
    "no-non-null-assertion": true,
 | 
					 | 
				
			||||||
    "no-shadowed-variable": true,
 | 
					 | 
				
			||||||
    "no-string-literal": false,
 | 
					 | 
				
			||||||
    "no-string-throw": true,
 | 
					 | 
				
			||||||
    "no-switch-case-fall-through": true,
 | 
					 | 
				
			||||||
    "no-trailing-whitespace": true,
 | 
					 | 
				
			||||||
    "no-unnecessary-initializer": true,
 | 
					 | 
				
			||||||
    "no-unused-expression": true,
 | 
					 | 
				
			||||||
    "no-use-before-declare": true,
 | 
					 | 
				
			||||||
    "no-var-keyword": true,
 | 
					 | 
				
			||||||
    "object-literal-sort-keys": false,
 | 
					 | 
				
			||||||
    "one-line": [
 | 
					 | 
				
			||||||
      true,
 | 
					 | 
				
			||||||
      "check-open-brace",
 | 
					 | 
				
			||||||
      "check-catch",
 | 
					 | 
				
			||||||
      "check-else",
 | 
					 | 
				
			||||||
      "check-whitespace"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "prefer-const": true,
 | 
					 | 
				
			||||||
    "quotemark": [
 | 
					 | 
				
			||||||
      true,
 | 
					 | 
				
			||||||
      "single"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "radix": true,
 | 
					 | 
				
			||||||
    "semicolon": [
 | 
					 | 
				
			||||||
      true,
 | 
					 | 
				
			||||||
      "always"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "triple-equals": [
 | 
					 | 
				
			||||||
      true,
 | 
					 | 
				
			||||||
      "allow-null-check"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "typedef-whitespace": [
 | 
					 | 
				
			||||||
      true,
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
        "call-signature": "nospace",
 | 
					 | 
				
			||||||
        "index-signature": "nospace",
 | 
					 | 
				
			||||||
        "parameter": "nospace",
 | 
					 | 
				
			||||||
        "property-declaration": "nospace",
 | 
					 | 
				
			||||||
        "variable-declaration": "nospace"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "unified-signatures": true,
 | 
					 | 
				
			||||||
    "variable-name": false,
 | 
					 | 
				
			||||||
    "whitespace": [
 | 
					 | 
				
			||||||
      true,
 | 
					 | 
				
			||||||
      "check-branch",
 | 
					 | 
				
			||||||
      "check-decl",
 | 
					 | 
				
			||||||
      "check-operator",
 | 
					 | 
				
			||||||
      "check-separator",
 | 
					 | 
				
			||||||
      "check-type"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "directive-selector": [
 | 
					 | 
				
			||||||
      true,
 | 
					 | 
				
			||||||
      "attribute",
 | 
					 | 
				
			||||||
      "app",
 | 
					 | 
				
			||||||
      "camelCase"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "component-selector": [
 | 
					 | 
				
			||||||
      true,
 | 
					 | 
				
			||||||
      "element",
 | 
					 | 
				
			||||||
      "app",
 | 
					 | 
				
			||||||
      "kebab-case"
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    "no-output-on-prefix": true,
 | 
					 | 
				
			||||||
    "use-input-property-decorator": true,
 | 
					 | 
				
			||||||
    "use-output-property-decorator": true,
 | 
					 | 
				
			||||||
    "use-host-property-decorator": true,
 | 
					 | 
				
			||||||
    "no-input-rename": true,
 | 
					 | 
				
			||||||
    "no-output-rename": true,
 | 
					 | 
				
			||||||
    "use-life-cycle-interface": true,
 | 
					 | 
				
			||||||
    "use-pipe-transform-interface": true,
 | 
					 | 
				
			||||||
    "component-class-suffix": true,
 | 
					 | 
				
			||||||
    "directive-class-suffix": true
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										3
									
								
								contributors/erikarvstedt.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								contributors/erikarvstedt.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					I hereby accept the terms of the Contributor License Agreement in the CONTRIBUTING.md file of the mempool/mempool git repository as of July 6, 2022.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed: erikarvstedt
 | 
				
			||||||
@ -8,6 +8,10 @@ indent_size = 2
 | 
				
			|||||||
insert_final_newline = true
 | 
					insert_final_newline = true
 | 
				
			||||||
trim_trailing_whitespace = true
 | 
					trim_trailing_whitespace = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[*.ts]
 | 
				
			||||||
 | 
					quote_type = single
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[*.md]
 | 
					[*.md]
 | 
				
			||||||
max_line_length = off
 | 
					max_line_length = off
 | 
				
			||||||
trim_trailing_whitespace = false
 | 
					trim_trailing_whitespace = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								frontend/.prettierignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								frontend/.prettierignore
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					node_modules
 | 
				
			||||||
 | 
					package-lock.json
 | 
				
			||||||
							
								
								
									
										6
									
								
								frontend/.prettierrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								frontend/.prettierrc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "endOfLine": "lf",
 | 
				
			||||||
 | 
					  "printWidth": 80,
 | 
				
			||||||
 | 
					  "tabWidth": 2,
 | 
				
			||||||
 | 
					  "trailingComma": "es5"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										171
									
								
								frontend/cypress/e2e/mainnet/mining.spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								frontend/cypress/e2e/mainnet/mining.spec.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,171 @@
 | 
				
			|||||||
 | 
					const baseModule = Cypress.env("BASE_MODULE");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('Mainnet - Mining Features', () => {
 | 
				
			||||||
 | 
					  beforeEach(() => {
 | 
				
			||||||
 | 
					    //https://github.com/cypress-io/cypress/issues/14459
 | 
				
			||||||
 | 
					    if (Cypress.browser.family === 'chromium') {
 | 
				
			||||||
 | 
					      Cypress.automation('remote:debugger:protocol', {
 | 
				
			||||||
 | 
					        command: 'Network.enable',
 | 
				
			||||||
 | 
					        params: {}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      Cypress.automation('remote:debugger:protocol', {
 | 
				
			||||||
 | 
					        command: 'Network.setCacheDisabled',
 | 
				
			||||||
 | 
					        params: { cacheDisabled: true }
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (baseModule === 'mempool') {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    describe('Miner page', () => {
 | 
				
			||||||
 | 
					      beforeEach(() => {
 | 
				
			||||||
 | 
					        cy.intercept('/api/v1/mining/pool/**').as('pool');
 | 
				
			||||||
 | 
					        cy.intercept('/api/v1/mining/hashrate/pools/**').as('hashrate');
 | 
				
			||||||
 | 
					        cy.intercept('/api/tx/**').as('tx');
 | 
				
			||||||
 | 
					        cy.intercept('/api/v1/outpends/**').as('outspends');
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      it('loads the mining pool page from the dashboard', () => {
 | 
				
			||||||
 | 
					        cy.visit('/mining');
 | 
				
			||||||
 | 
					        cy.waitForSkeletonGone();
 | 
				
			||||||
 | 
					        cy.get('[data-cy="bitcoin-block-0-pool"]').click().then(() => {
 | 
				
			||||||
 | 
					          cy.waitForSkeletonGone();
 | 
				
			||||||
 | 
					          cy.wait('@pool');
 | 
				
			||||||
 | 
					          cy.url().should('match', /\/mining\/pool\/(\w+)/);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it('loads the mining pool page from the blocks page', () => {
 | 
				
			||||||
 | 
					        cy.visit('/mining');
 | 
				
			||||||
 | 
					        cy.waitForSkeletonGone();
 | 
				
			||||||
 | 
					        cy.get('[data-cy="bitcoin-block-0-height"]').click().then(() => {
 | 
				
			||||||
 | 
					          cy.waitForSkeletonGone();
 | 
				
			||||||
 | 
					          cy.get('[data-cy="block-details-miner-badge"]').click().then(() => {
 | 
				
			||||||
 | 
					            cy.waitForSkeletonGone();
 | 
				
			||||||
 | 
					            cy.wait('@pool');
 | 
				
			||||||
 | 
					            cy.url().should('match', /\/mining\/pool\/(\w+)/);
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    describe('Mining Dashboard Landing page widgets', () => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      beforeEach(() => {
 | 
				
			||||||
 | 
					        cy.visit('/mining');
 | 
				
			||||||
 | 
					        cy.waitForSkeletonGone();
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it('shows the mempool blocks', () => {
 | 
				
			||||||
 | 
					        cy.get('[data-cy="mempool-block-0-fees"]').invoke('text').should('match', /~(.*) sat\/vB/);
 | 
				
			||||||
 | 
					        cy.get('[data-cy="mempool-block-0-fee-span"]').invoke('text').should('match', /(.*) - (.*) sat\/vB/);
 | 
				
			||||||
 | 
					        cy.get('[data-cy="mempool-block-0-total-fees"]').invoke('text').should('match', /(.*) BTC/);
 | 
				
			||||||
 | 
					        cy.get('[data-cy="mempool-block-0-transaction-count"]').invoke('text').should('match', /(.*) transactions/);
 | 
				
			||||||
 | 
					        cy.get('[data-cy="mempool-block-0-time"]').invoke('text').should('match', /In ~(.*) minutes/);
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it('shows the mined blocks', () => {
 | 
				
			||||||
 | 
					        cy.get('[data-cy="bitcoin-block-0-height"]').invoke('text').should('match', /(\d)/);
 | 
				
			||||||
 | 
					        cy.get('[data-cy="bitcoin-block-0-fees"]').invoke('text').should('match', /~(.*) sat\/vB/);
 | 
				
			||||||
 | 
					        cy.get('[data-cy="bitcoin-block-0-fee-span"]').invoke('text').should('match', /(.*) - (.*) sat\/vB/);
 | 
				
			||||||
 | 
					        cy.get('[data-cy="bitcoin-block-0-total-fees"]').invoke('text').should('match', /(.*) BTC/);
 | 
				
			||||||
 | 
					        cy.get('[data-cy="bitcoin-block-0-transactions"]').invoke('text').should('match', /(.*) transactions/);
 | 
				
			||||||
 | 
					        cy.get('[data-cy="bitcoin-block-0-time"]').invoke('text').should('match', /((.*) ago|Just now)/);
 | 
				
			||||||
 | 
					        cy.get('[data-cy="bitcoin-block-0-pool"]').invoke('text').should('match', /(\w)/);
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it('shows the reward stats for the last 144 blocks', () => {
 | 
				
			||||||
 | 
					        cy.get('[data-cy="reward-stats"]');
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it('shows the difficulty adjustment stats', () => {
 | 
				
			||||||
 | 
					        cy.get('[data-cy="difficulty-adjustment"]');
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it('shows the latest blocks', () => {
 | 
				
			||||||
 | 
					        cy.get('[data-cy="latest-blocks"]');
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it('shows the pools pie chart', () => {
 | 
				
			||||||
 | 
					        cy.get('[data-cy="pool-distribution"]');
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it('shows the hashrate graph', () => {
 | 
				
			||||||
 | 
					        cy.get('[data-cy="hashrate-graph"]');
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      it('shows the latest blocks', () => {
 | 
				
			||||||
 | 
					        cy.get('[data-cy="latest-blocks"]');
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      it('shows the latest adjustments', () => {
 | 
				
			||||||
 | 
					        cy.get('[data-cy="difficulty-adjustments-table"]');
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    describe.only('mining graphs', () => {
 | 
				
			||||||
 | 
					      describe('pools ranking', () => {
 | 
				
			||||||
 | 
					        it('loads the graph', () => {
 | 
				
			||||||
 | 
					          cy.visit('/graphs/mining/pools');
 | 
				
			||||||
 | 
					          cy.waitForSkeletonGone();
 | 
				
			||||||
 | 
					          cy.waitForPageIdle();
 | 
				
			||||||
 | 
					          cy.get('.spinner-border').should('not.exist');
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      describe('pools dominance', () => {
 | 
				
			||||||
 | 
					        it('loads the graph', () => {
 | 
				
			||||||
 | 
					          cy.visit('/graphs/mining/pools-dominance');
 | 
				
			||||||
 | 
					          cy.waitForSkeletonGone();
 | 
				
			||||||
 | 
					          cy.waitForPageIdle();
 | 
				
			||||||
 | 
					          cy.get('.spinner-border').should('not.exist');
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      describe('hashrate & difficulty', () => {
 | 
				
			||||||
 | 
					        it('loads the graph', () => {
 | 
				
			||||||
 | 
					          cy.visit('/graphs/mining/hashrate-difficulty');
 | 
				
			||||||
 | 
					          cy.waitForSkeletonGone();
 | 
				
			||||||
 | 
					          cy.waitForPageIdle();
 | 
				
			||||||
 | 
					          cy.get('.spinner-border').should('not.exist');
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      describe('block fee rates', () => {
 | 
				
			||||||
 | 
					        it('loads the graph', () => {
 | 
				
			||||||
 | 
					          cy.visit('/graphs/mining/block-fee-rates');
 | 
				
			||||||
 | 
					          cy.waitForSkeletonGone();
 | 
				
			||||||
 | 
					          cy.waitForPageIdle();
 | 
				
			||||||
 | 
					          cy.get('.spinner-border').should('not.exist');
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      describe('block fees', () => {
 | 
				
			||||||
 | 
					        it('loads the graph', () => {
 | 
				
			||||||
 | 
					          cy.visit('/graphs/mining/block-fees');
 | 
				
			||||||
 | 
					          cy.waitForSkeletonGone();
 | 
				
			||||||
 | 
					          cy.waitForPageIdle();
 | 
				
			||||||
 | 
					          cy.get('.spinner-border').should('not.exist');
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      describe('block rewards', () => {
 | 
				
			||||||
 | 
					        it('loads the graph', () => {
 | 
				
			||||||
 | 
					          cy.visit('/graphs/mining/block-rewards');
 | 
				
			||||||
 | 
					          cy.waitForSkeletonGone();
 | 
				
			||||||
 | 
					          cy.waitForPageIdle();
 | 
				
			||||||
 | 
					          cy.get('.spinner-border').should('not.exist');
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      describe('block sizes and weights', () => {
 | 
				
			||||||
 | 
					        it('loads the graph', () => {
 | 
				
			||||||
 | 
					          cy.visit('/graphs/mining/block-sizes-weights');
 | 
				
			||||||
 | 
					          cy.waitForSkeletonGone();
 | 
				
			||||||
 | 
					          cy.waitForPageIdle();
 | 
				
			||||||
 | 
					          cy.get('.spinner-border').should('not.exist');
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    it.skip(`Tests cannot be run on the selected BASE_MODULE ${baseModule}`);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
							
								
								
									
										88
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										88
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							@ -56,14 +56,15 @@
 | 
				
			|||||||
        "@typescript-eslint/parser": "^5.30.5",
 | 
					        "@typescript-eslint/parser": "^5.30.5",
 | 
				
			||||||
        "eslint": "^8.19.0",
 | 
					        "eslint": "^8.19.0",
 | 
				
			||||||
        "http-proxy-middleware": "~2.0.6",
 | 
					        "http-proxy-middleware": "~2.0.6",
 | 
				
			||||||
 | 
					        "prettier": "^2.7.1",
 | 
				
			||||||
        "ts-node": "~10.8.1",
 | 
					        "ts-node": "~10.8.1",
 | 
				
			||||||
        "typescript": "~4.6.4"
 | 
					        "typescript": "~4.6.4"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "optionalDependencies": {
 | 
					      "optionalDependencies": {
 | 
				
			||||||
        "@cypress/schematic": "~2.0.0",
 | 
					        "@cypress/schematic": "~2.0.0",
 | 
				
			||||||
        "cypress": "^10.0.2",
 | 
					        "cypress": "^10.3.0",
 | 
				
			||||||
        "cypress-fail-on-console-error": "~2.1.4",
 | 
					        "cypress-fail-on-console-error": "~3.0.0",
 | 
				
			||||||
        "cypress-wait-until": "^1.7.1",
 | 
					        "cypress-wait-until": "^1.7.2",
 | 
				
			||||||
        "mock-socket": "~9.1.4",
 | 
					        "mock-socket": "~9.1.4",
 | 
				
			||||||
        "start-server-and-test": "~1.14.0"
 | 
					        "start-server-and-test": "~1.14.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@ -1366,9 +1367,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@babel/helper-plugin-utils": {
 | 
					    "node_modules/@babel/helper-plugin-utils": {
 | 
				
			||||||
      "version": "7.16.7",
 | 
					      "version": "7.18.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz",
 | 
				
			||||||
      "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
 | 
					      "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">=6.9.0"
 | 
					        "node": ">=6.9.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@ -7293,9 +7294,9 @@
 | 
				
			|||||||
      "peer": true
 | 
					      "peer": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/cypress": {
 | 
					    "node_modules/cypress": {
 | 
				
			||||||
      "version": "10.0.2",
 | 
					      "version": "10.3.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.0.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.3.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-7+C4KHYBcfZrawss+Gt5PlS35rfc6ySc59JcHDVsIMm1E/J35dqE41UEXpdtwIq3549umCerNWnFADzqib4kcA==",
 | 
					      "integrity": "sha512-txkQWKzvBVnWdCuKs5Xc08gjpO89W2Dom2wpZgT9zWZT5jXxqPIxqP/NC1YArtkpmp3fN5HW8aDjYBizHLUFvg==",
 | 
				
			||||||
      "hasInstallScript": true,
 | 
					      "hasInstallScript": true,
 | 
				
			||||||
      "optional": true,
 | 
					      "optional": true,
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
@ -7350,9 +7351,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/cypress-fail-on-console-error": {
 | 
					    "node_modules/cypress-fail-on-console-error": {
 | 
				
			||||||
      "version": "2.1.4",
 | 
					      "version": "3.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cypress-fail-on-console-error/-/cypress-fail-on-console-error-2.1.4.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cypress-fail-on-console-error/-/cypress-fail-on-console-error-3.0.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-arjx2xfQN1FDM3s4HoKK0ZXszPgIZLAI61sbwaZfdo8HEIVJPdOwY+oBKM1XY9yso80rgtwlSY75KJOQTNOkdg==",
 | 
					      "integrity": "sha512-DBu5DI3gMzwFkzuOTbJ/A1xbGtYKukFoe7o07unEJlqe0f50xwB5OnAm6Pxe7J9eNtg40ZUJB8fcATqDr0qwgw==",
 | 
				
			||||||
      "optional": true,
 | 
					      "optional": true,
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "chai": "^4.3.4",
 | 
					        "chai": "^4.3.4",
 | 
				
			||||||
@ -7361,9 +7362,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/cypress-wait-until": {
 | 
					    "node_modules/cypress-wait-until": {
 | 
				
			||||||
      "version": "1.7.1",
 | 
					      "version": "1.7.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-1.7.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-1.7.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-8DL5IsBTbAxBjfYgCzdbohPq/bY+IKc63fxtso1C8RWhLnQkZbVESyaclNr76jyxfId6uyzX8+Xnt0ZwaXNtkA==",
 | 
					      "integrity": "sha512-uZ+M8/MqRcpf+FII/UZrU7g1qYZ4aVlHcgyVopnladyoBrpoaMJ4PKZDrdOJ05H5RHbr7s9Tid635X3E+ZLU/Q==",
 | 
				
			||||||
      "optional": true
 | 
					      "optional": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/cypress/node_modules/@types/node": {
 | 
					    "node_modules/cypress/node_modules/@types/node": {
 | 
				
			||||||
@ -10994,9 +10995,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/jest-worker": {
 | 
					    "node_modules/jest-worker": {
 | 
				
			||||||
      "version": "27.2.0",
 | 
					      "version": "27.5.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-laB0ZVIBz+voh/QQy9dmUuuDsadixeerrKqyVpgPz+CCWiOYjOBabUXHIXZhsdvkWbLqSHbgkAHWl5cg24Q6RA==",
 | 
					      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@types/node": "*",
 | 
					        "@types/node": "*",
 | 
				
			||||||
        "merge-stream": "^2.0.0",
 | 
					        "merge-stream": "^2.0.0",
 | 
				
			||||||
@ -14340,6 +14341,21 @@
 | 
				
			|||||||
        "node": ">= 0.8.0"
 | 
					        "node": ">= 0.8.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/prettier": {
 | 
				
			||||||
 | 
					      "version": "2.7.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
 | 
				
			||||||
 | 
					      "dev": true,
 | 
				
			||||||
 | 
					      "bin": {
 | 
				
			||||||
 | 
					        "prettier": "bin-prettier.js"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=10.13.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/prettier/prettier?sponsor=1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/pretty-bytes": {
 | 
					    "node_modules/pretty-bytes": {
 | 
				
			||||||
      "version": "5.6.0",
 | 
					      "version": "5.6.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
 | 
				
			||||||
@ -18695,9 +18711,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "@babel/helper-plugin-utils": {
 | 
					    "@babel/helper-plugin-utils": {
 | 
				
			||||||
      "version": "7.16.7",
 | 
					      "version": "7.18.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz",
 | 
				
			||||||
      "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA=="
 | 
					      "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "@babel/helper-remap-async-to-generator": {
 | 
					    "@babel/helper-remap-async-to-generator": {
 | 
				
			||||||
      "version": "7.16.8",
 | 
					      "version": "7.16.8",
 | 
				
			||||||
@ -23197,9 +23213,9 @@
 | 
				
			|||||||
      "peer": true
 | 
					      "peer": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "cypress": {
 | 
					    "cypress": {
 | 
				
			||||||
      "version": "10.0.2",
 | 
					      "version": "10.3.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.0.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.3.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-7+C4KHYBcfZrawss+Gt5PlS35rfc6ySc59JcHDVsIMm1E/J35dqE41UEXpdtwIq3549umCerNWnFADzqib4kcA==",
 | 
					      "integrity": "sha512-txkQWKzvBVnWdCuKs5Xc08gjpO89W2Dom2wpZgT9zWZT5jXxqPIxqP/NC1YArtkpmp3fN5HW8aDjYBizHLUFvg==",
 | 
				
			||||||
      "optional": true,
 | 
					      "optional": true,
 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "@cypress/request": "^2.88.10",
 | 
					        "@cypress/request": "^2.88.10",
 | 
				
			||||||
@ -23374,9 +23390,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "cypress-fail-on-console-error": {
 | 
					    "cypress-fail-on-console-error": {
 | 
				
			||||||
      "version": "2.1.4",
 | 
					      "version": "3.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cypress-fail-on-console-error/-/cypress-fail-on-console-error-2.1.4.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cypress-fail-on-console-error/-/cypress-fail-on-console-error-3.0.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-arjx2xfQN1FDM3s4HoKK0ZXszPgIZLAI61sbwaZfdo8HEIVJPdOwY+oBKM1XY9yso80rgtwlSY75KJOQTNOkdg==",
 | 
					      "integrity": "sha512-DBu5DI3gMzwFkzuOTbJ/A1xbGtYKukFoe7o07unEJlqe0f50xwB5OnAm6Pxe7J9eNtg40ZUJB8fcATqDr0qwgw==",
 | 
				
			||||||
      "optional": true,
 | 
					      "optional": true,
 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "chai": "^4.3.4",
 | 
					        "chai": "^4.3.4",
 | 
				
			||||||
@ -23385,9 +23401,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "cypress-wait-until": {
 | 
					    "cypress-wait-until": {
 | 
				
			||||||
      "version": "1.7.1",
 | 
					      "version": "1.7.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-1.7.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cypress-wait-until/-/cypress-wait-until-1.7.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-8DL5IsBTbAxBjfYgCzdbohPq/bY+IKc63fxtso1C8RWhLnQkZbVESyaclNr76jyxfId6uyzX8+Xnt0ZwaXNtkA==",
 | 
					      "integrity": "sha512-uZ+M8/MqRcpf+FII/UZrU7g1qYZ4aVlHcgyVopnladyoBrpoaMJ4PKZDrdOJ05H5RHbr7s9Tid635X3E+ZLU/Q==",
 | 
				
			||||||
      "optional": true
 | 
					      "optional": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "d": {
 | 
					    "d": {
 | 
				
			||||||
@ -26030,9 +26046,9 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "jest-worker": {
 | 
					    "jest-worker": {
 | 
				
			||||||
      "version": "27.2.0",
 | 
					      "version": "27.5.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-laB0ZVIBz+voh/QQy9dmUuuDsadixeerrKqyVpgPz+CCWiOYjOBabUXHIXZhsdvkWbLqSHbgkAHWl5cg24Q6RA==",
 | 
					      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
 | 
				
			||||||
      "requires": {
 | 
					      "requires": {
 | 
				
			||||||
        "@types/node": "*",
 | 
					        "@types/node": "*",
 | 
				
			||||||
        "merge-stream": "^2.0.0",
 | 
					        "merge-stream": "^2.0.0",
 | 
				
			||||||
@ -28514,6 +28530,12 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
 | 
				
			||||||
      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
 | 
					      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "prettier": {
 | 
				
			||||||
 | 
					      "version": "2.7.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==",
 | 
				
			||||||
 | 
					      "dev": true
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "pretty-bytes": {
 | 
					    "pretty-bytes": {
 | 
				
			||||||
      "version": "5.6.0",
 | 
					      "version": "5.6.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
 | 
				
			||||||
 | 
				
			|||||||
@ -44,6 +44,7 @@
 | 
				
			|||||||
    "test": "npm run ng -- test",
 | 
					    "test": "npm run ng -- test",
 | 
				
			||||||
    "lint": "./node_modules/.bin/eslint . --ext .ts",
 | 
					    "lint": "./node_modules/.bin/eslint . --ext .ts",
 | 
				
			||||||
    "lint:fix": "./node_modules/.bin/eslint . --ext .ts --fix",
 | 
					    "lint:fix": "./node_modules/.bin/eslint . --ext .ts --fix",
 | 
				
			||||||
 | 
					    "prettier": "prettier --write \"src/app/**/*.{js,json,css,scss,less,md,ts,html,component.html}\"",
 | 
				
			||||||
    "e2e": "npm run generate-config && npm run ng -- e2e",
 | 
					    "e2e": "npm run generate-config && npm run ng -- e2e",
 | 
				
			||||||
    "e2e:ci": "npm run cypress:run:ci",
 | 
					    "e2e:ci": "npm run cypress:run:ci",
 | 
				
			||||||
    "config:defaults:mempool": "node update-config.js TESTNET_ENABLED=true SIGNET_ENABLED=true LIQUID_ENABLED=true LIQUID_TESTNET_ENABLED=true BISQ_ENABLED=true ITEMS_PER_PAGE=25 BASE_MODULE=mempool BLOCK_WEIGHT_UNITS=4000000 && npm run generate-config",
 | 
					    "config:defaults:mempool": "node update-config.js TESTNET_ENABLED=true SIGNET_ENABLED=true LIQUID_ENABLED=true LIQUID_TESTNET_ENABLED=true BISQ_ENABLED=true ITEMS_PER_PAGE=25 BASE_MODULE=mempool BLOCK_WEIGHT_UNITS=4000000 && npm run generate-config",
 | 
				
			||||||
@ -109,14 +110,15 @@
 | 
				
			|||||||
    "@typescript-eslint/parser": "^5.30.5",
 | 
					    "@typescript-eslint/parser": "^5.30.5",
 | 
				
			||||||
    "eslint": "^8.19.0",
 | 
					    "eslint": "^8.19.0",
 | 
				
			||||||
    "http-proxy-middleware": "~2.0.6",
 | 
					    "http-proxy-middleware": "~2.0.6",
 | 
				
			||||||
 | 
					    "prettier": "^2.7.1",
 | 
				
			||||||
    "ts-node": "~10.8.1",
 | 
					    "ts-node": "~10.8.1",
 | 
				
			||||||
    "typescript": "~4.6.4"
 | 
					    "typescript": "~4.6.4"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "optionalDependencies": {
 | 
					  "optionalDependencies": {
 | 
				
			||||||
    "@cypress/schematic": "~2.0.0",
 | 
					    "@cypress/schematic": "~2.0.0",
 | 
				
			||||||
    "cypress": "^10.0.2",
 | 
					    "cypress": "^10.3.0",
 | 
				
			||||||
    "cypress-fail-on-console-error": "~2.1.4",
 | 
					    "cypress-fail-on-console-error": "~3.0.0",
 | 
				
			||||||
    "cypress-wait-until": "^1.7.1",
 | 
					    "cypress-wait-until": "^1.7.2",
 | 
				
			||||||
    "mock-socket": "~9.1.4",
 | 
					    "mock-socket": "~9.1.4",
 | 
				
			||||||
    "start-server-and-test": "~1.14.0"
 | 
					    "start-server-and-test": "~1.14.0"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
				
			|||||||
@ -2,41 +2,41 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<div class="full-container">
 | 
					<div class="full-container">
 | 
				
			||||||
  <div class="card-header mb-0 mb-md-4">
 | 
					  <div class="card-header mb-0 mb-md-4">
 | 
				
			||||||
    <span i18n="mining.block-prediction-accuracy">Block Predictions Accuracy</span>
 | 
					    <span i18n="mining.block-prediction-accuracy">Block Prediction Accuracy</span>
 | 
				
			||||||
      <button class="btn" style="margin: 0 0 4px 0px" (click)="onSaveChart()">
 | 
					      <button class="btn" style="margin: 0 0 4px 0px" (click)="onSaveChart()">
 | 
				
			||||||
      <fa-icon [icon]="['fas', 'download']" [fixedWidth]="true"></fa-icon>
 | 
					      <fa-icon [icon]="['fas', 'download']" [fixedWidth]="true"></fa-icon>
 | 
				
			||||||
    </button>
 | 
					    </button>
 | 
				
			||||||
    <form [formGroup]="radioGroupForm" class="formRadioGroup" *ngIf="(statsObservable$ | async) as stats">
 | 
					    <form [formGroup]="radioGroupForm" class="formRadioGroup" *ngIf="(statsObservable$ | async) as stats">
 | 
				
			||||||
      <div class="btn-group btn-group-toggle" ngbRadioGroup name="radioBasic" formControlName="dateSpan">
 | 
					      <div class="btn-group btn-group-toggle" ngbRadioGroup name="radioBasic" formControlName="dateSpan">
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 144">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 144">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'24h'" fragment="24h" [routerLink]="['/graphs/mining/block-predictions' | relativeUrl]"> 24h
 | 
					          <input ngbButton type="radio" [value]="'24h'" fragment="24h" [routerLink]="['/graphs/mining/block-prediction' | relativeUrl]"> 24h
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 432">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 432">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'3d'" fragment="3d" [routerLink]="['/graphs/mining/block-predictions' | relativeUrl]"> 3D
 | 
					          <input ngbButton type="radio" [value]="'3d'" fragment="3d" [routerLink]="['/graphs/mining/block-prediction' | relativeUrl]"> 3D
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 1008">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 1008">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'1w'" fragment="1w" [routerLink]="['/graphs/mining/block-predictions' | relativeUrl]"> 1W
 | 
					          <input ngbButton type="radio" [value]="'1w'" fragment="1w" [routerLink]="['/graphs/mining/block-prediction' | relativeUrl]"> 1W
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 4320">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 4320">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'1m'" fragment="1m" [routerLink]="['/graphs/mining/block-predictions' | relativeUrl]"> 1M
 | 
					          <input ngbButton type="radio" [value]="'1m'" fragment="1m" [routerLink]="['/graphs/mining/block-prediction' | relativeUrl]"> 1M
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 12960">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 12960">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'3m'" fragment="3m" [routerLink]="['/graphs/mining/block-predictions' | relativeUrl]"> 3M
 | 
					          <input ngbButton type="radio" [value]="'3m'" fragment="3m" [routerLink]="['/graphs/mining/block-prediction' | relativeUrl]"> 3M
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 25920">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 25920">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'6m'" fragment="6m" [routerLink]="['/graphs/mining/block-predictions' | relativeUrl]"> 6M
 | 
					          <input ngbButton type="radio" [value]="'6m'" fragment="6m" [routerLink]="['/graphs/mining/block-prediction' | relativeUrl]"> 6M
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 52560">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 52560">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'1y'" fragment="1y" [routerLink]="['/graphs/mining/block-predictions' | relativeUrl]"> 1Y
 | 
					          <input ngbButton type="radio" [value]="'1y'" fragment="1y" [routerLink]="['/graphs/mining/block-prediction' | relativeUrl]"> 1Y
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 105120">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 105120">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'2y'" fragment="2y" [routerLink]="['/graphs/mining/block-predictions' | relativeUrl]"> 2Y
 | 
					          <input ngbButton type="radio" [value]="'2y'" fragment="2y" [routerLink]="['/graphs/mining/block-prediction' | relativeUrl]"> 2Y
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 157680">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 157680">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'3y'" fragment="3y" [routerLink]="['/graphs/mining/block-predictions' | relativeUrl]"> 3Y
 | 
					          <input ngbButton type="radio" [value]="'3y'" fragment="3y" [routerLink]="['/graphs/mining/block-prediction' | relativeUrl]"> 3Y
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount > 157680">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount > 157680">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'all'" fragment="all" [routerLink]="['/graphs/mining/block-predictions' | relativeUrl]"> ALL
 | 
					          <input ngbButton type="radio" [value]="'all'" fragment="all" [routerLink]="['/graphs/mining/block-prediction' | relativeUrl]"> ALL
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </form>
 | 
					    </form>
 | 
				
			||||||
@ -13,9 +13,9 @@ import { RelativeUrlPipe } from 'src/app/shared/pipes/relative-url/relative-url.
 | 
				
			|||||||
import { StateService } from 'src/app/services/state.service';
 | 
					import { StateService } from 'src/app/services/state.service';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Component({
 | 
					@Component({
 | 
				
			||||||
  selector: 'app-block-predictions-graph',
 | 
					  selector: 'app-block-prediction-graph',
 | 
				
			||||||
  templateUrl: './block-predictions-graph.component.html',
 | 
					  templateUrl: './block-prediction-graph.component.html',
 | 
				
			||||||
  styleUrls: ['./block-predictions-graph.component.scss'],
 | 
					  styleUrls: ['./block-prediction-graph.component.scss'],
 | 
				
			||||||
  styles: [`
 | 
					  styles: [`
 | 
				
			||||||
    .loadingGraphs {
 | 
					    .loadingGraphs {
 | 
				
			||||||
      position: absolute;
 | 
					      position: absolute;
 | 
				
			||||||
@ -26,7 +26,7 @@ import { StateService } from 'src/app/services/state.service';
 | 
				
			|||||||
  `],
 | 
					  `],
 | 
				
			||||||
  changeDetection: ChangeDetectionStrategy.OnPush,
 | 
					  changeDetection: ChangeDetectionStrategy.OnPush,
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
export class BlockPredictionsGraphComponent implements OnInit {
 | 
					export class BlockPredictionGraphComponent implements OnInit {
 | 
				
			||||||
  @Input() right: number | string = 45;
 | 
					  @Input() right: number | string = 45;
 | 
				
			||||||
  @Input() left: number | string = 75;
 | 
					  @Input() left: number | string = 75;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -60,7 +60,7 @@ export class BlockPredictionsGraphComponent implements OnInit {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ngOnInit(): void {
 | 
					  ngOnInit(): void {
 | 
				
			||||||
    this.seoService.setTitle($localize`Block predictions accuracy`);
 | 
					    this.seoService.setTitle($localize`:@@d7d5fcf50179ad70c938491c517efb82de2c8146:Block Prediction Accuracy`);
 | 
				
			||||||
    this.miningWindowPreference = '24h';//this.miningService.getDefaultTimespan('24h');
 | 
					    this.miningWindowPreference = '24h';//this.miningService.getDefaultTimespan('24h');
 | 
				
			||||||
    this.radioGroupForm = this.formBuilder.group({ dateSpan: this.miningWindowPreference });
 | 
					    this.radioGroupForm = this.formBuilder.group({ dateSpan: this.miningWindowPreference });
 | 
				
			||||||
    this.radioGroupForm.controls.dateSpan.setValue(this.miningWindowPreference);
 | 
					    this.radioGroupForm.controls.dateSpan.setValue(this.miningWindowPreference);
 | 
				
			||||||
@ -113,13 +113,13 @@
 | 
				
			|||||||
                <tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
 | 
					                <tr *ngIf="network !== 'liquid' && network !== 'liquidtestnet'">
 | 
				
			||||||
                  <td i18n="block.miner">Miner</td>
 | 
					                  <td i18n="block.miner">Miner</td>
 | 
				
			||||||
                  <td *ngIf="stateService.env.MINING_DASHBOARD">
 | 
					                  <td *ngIf="stateService.env.MINING_DASHBOARD">
 | 
				
			||||||
                    <a placement="bottom" [routerLink]="['/mining/pool' | relativeUrl, block.extras.pool.slug]" class="badge"
 | 
					                    <a [attr.data-cy]="'block-details-miner-badge'" placement="bottom" [routerLink]="['/mining/pool' | relativeUrl, block.extras.pool.slug]" class="badge"
 | 
				
			||||||
                      [class]="block.extras.pool.name === 'Unknown' ? 'badge-secondary' : 'badge-primary'">
 | 
					                      [class]="block.extras.pool.name === 'Unknown' ? 'badge-secondary' : 'badge-primary'">
 | 
				
			||||||
                      {{ block.extras.pool.name }}
 | 
					                      {{ block.extras.pool.name }}
 | 
				
			||||||
                    </a>
 | 
					                    </a>
 | 
				
			||||||
                  </td>
 | 
					                  </td>
 | 
				
			||||||
                  <td *ngIf="!stateService.env.MINING_DASHBOARD && stateService.env.BASE_MODULE === 'mempool'">
 | 
					                  <td *ngIf="!stateService.env.MINING_DASHBOARD && stateService.env.BASE_MODULE === 'mempool'">
 | 
				
			||||||
                    <span placement="bottom" class="badge"
 | 
					                    <span [attr.data-cy]="'block-details-miner-badge'" placement="bottom" class="badge"
 | 
				
			||||||
                      [class]="block.extras.pool.name === 'Unknown' ? 'badge-secondary' : 'badge-primary'">
 | 
					                      [class]="block.extras.pool.name === 'Unknown' ? 'badge-secondary' : 'badge-primary'">
 | 
				
			||||||
                      {{ block.extras.pool.name }}
 | 
					                      {{ block.extras.pool.name }}
 | 
				
			||||||
                  </span>
 | 
					                  </span>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,31 +1,31 @@
 | 
				
			|||||||
<div class="blocks-container blockchain-blocks-container" *ngIf="(loadingBlocks$ | async) === false; else loadingBlocksTemplate">
 | 
					<div class="blocks-container blockchain-blocks-container" *ngIf="(loadingBlocks$ | async) === false; else loadingBlocksTemplate">
 | 
				
			||||||
  <div *ngFor="let block of blocks; let i = index; trackBy: trackByBlocksFn" >
 | 
					  <div *ngFor="let block of blocks; let i = index; trackBy: trackByBlocksFn" >
 | 
				
			||||||
    <div class="text-center bitcoin-block mined-block blockchain-blocks-{{ i }}" id="bitcoin-block-{{ block.height }}" [ngStyle]="blockStyles[i]" [class.blink-bg]="(specialBlocks[block.height] !== undefined)">
 | 
					    <div [attr.data-cy]="'bitcoin-block-' + i" class="text-center bitcoin-block mined-block blockchain-blocks-{{ i }}" id="bitcoin-block-{{ block.height }}" [ngStyle]="blockStyles[i]" [class.blink-bg]="(specialBlocks[block.height] !== undefined)">
 | 
				
			||||||
      <a draggable="false" [routerLink]="['/block/' | relativeUrl, block.id]" [state]="{ data: { block: block } }"
 | 
					      <a draggable="false" [routerLink]="['/block/' | relativeUrl, block.id]" [state]="{ data: { block: block } }"
 | 
				
			||||||
        class="blockLink" [ngClass]="{'disabled': (this.stateService.blockScrolling$ | async)}"> </a>
 | 
					        class="blockLink" [ngClass]="{'disabled': (this.stateService.blockScrolling$ | async)}"> </a>
 | 
				
			||||||
      <div class="block-height">
 | 
					      <div [attr.data-cy]="'bitcoin-block-' + i + '-height'" class="block-height">
 | 
				
			||||||
        <a [routerLink]="['/block/' | relativeUrl, block.id]" [state]="{ data: { block: block } }">{{ block.height }}</a>
 | 
					        <a [routerLink]="['/block/' | relativeUrl, block.id]" [state]="{ data: { block: block } }">{{ block.height }}</a>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      <div class="block-body">
 | 
					      <div class="block-body">
 | 
				
			||||||
        <div class="fees">
 | 
					        <div [attr.data-cy]="'bitcoin-block-' + i + '-fees'" class="fees">
 | 
				
			||||||
          ~{{ block?.extras?.medianFee | number:feeRounding }} <ng-container i18n="shared.sat-vbyte|sat/vB">sat/vB</ng-container>
 | 
					          ~{{ block?.extras?.medianFee | number:feeRounding }} <ng-container i18n="shared.sat-vbyte|sat/vB">sat/vB</ng-container>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="fee-span">
 | 
					        <div [attr.data-cy]="'bitcoin-block-' + i + '-fee-span'" class="fee-span">
 | 
				
			||||||
          {{ block?.extras?.feeRange[1] | number:feeRounding }} - {{ block?.extras?.feeRange[block?.extras?.feeRange.length - 1] | number:feeRounding }} <ng-container i18n="shared.sat-vbyte|sat/vB">sat/vB</ng-container>
 | 
					          {{ block?.extras?.feeRange[1] | number:feeRounding }} - {{ block?.extras?.feeRange[block?.extras?.feeRange.length - 1] | number:feeRounding }} <ng-container i18n="shared.sat-vbyte|sat/vB">sat/vB</ng-container>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div *ngIf="showMiningInfo" class="block-size">
 | 
					        <div [attr.data-cy]="'bitcoin-block-' + i + '-total-fees'" *ngIf="showMiningInfo" class="block-size">
 | 
				
			||||||
          <app-amount [satoshis]="block.extras?.totalFees ?? 0" digitsInfo="1.2-3" [noFiat]="true"></app-amount>
 | 
					          <app-amount [satoshis]="block.extras?.totalFees ?? 0" digitsInfo="1.2-3" [noFiat]="true"></app-amount>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div *ngIf="!showMiningInfo" class="block-size" [innerHTML]="'‎' + (block.size | bytes: 2)"></div>
 | 
					        <div [attr.data-cy]="'bitcoin-block-' + i + 'block-size'" *ngIf="!showMiningInfo" class="block-size" [innerHTML]="'‎' + (block.size | bytes: 2)"></div>
 | 
				
			||||||
        <div class="transaction-count">
 | 
					        <div [attr.data-cy]="'bitcoin-block-' + i + '-transactions'" class="transaction-count">
 | 
				
			||||||
          <ng-container *ngTemplateOutlet="block.tx_count === 1 ? transactionsSingular : transactionsPlural; context: {$implicit: block.tx_count | number}"></ng-container>
 | 
					          <ng-container *ngTemplateOutlet="block.tx_count === 1 ? transactionsSingular : transactionsPlural; context: {$implicit: block.tx_count | number}"></ng-container>
 | 
				
			||||||
          <ng-template #transactionsSingular let-i i18n="shared.transaction-count.singular">{{ i }} transaction</ng-template>
 | 
					          <ng-template #transactionsSingular let-i i18n="shared.transaction-count.singular">{{ i }} transaction</ng-template>
 | 
				
			||||||
          <ng-template #transactionsPlural let-i i18n="shared.transaction-count.plural">{{ i }} transactions</ng-template>
 | 
					          <ng-template #transactionsPlural let-i i18n="shared.transaction-count.plural">{{ i }} transactions</ng-template>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div class="time-difference"><app-time-since [time]="block.timestamp" [fastRender]="true"></app-time-since></div>
 | 
					        <div [attr.data-cy]="'bitcoin-block-' + i + '-time'" class="time-difference"><app-time-since [time]="block.timestamp" [fastRender]="true"></app-time-since></div>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      <div class="animated" [class]="showMiningInfo ? 'show' : 'hide'" *ngIf="block.extras?.pool != undefined">
 | 
					      <div class="animated" [class]="showMiningInfo ? 'show' : 'hide'" *ngIf="block.extras?.pool != undefined">
 | 
				
			||||||
        <a class="badge badge-primary" [routerLink]="[('/mining/pool/' + block.extras.pool.slug) | relativeUrl]">
 | 
					        <a [attr.data-cy]="'bitcoin-block-' + i + '-pool'" class="badge badge-primary" [routerLink]="[('/mining/pool/' + block.extras.pool.slug) | relativeUrl]">
 | 
				
			||||||
          {{ block.extras.pool.name}}</a>
 | 
					          {{ block.extras.pool.name}}</a>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
				
			|||||||
@ -19,7 +19,7 @@
 | 
				
			|||||||
      <a class="dropdown-item" routerLinkActive="active"
 | 
					      <a class="dropdown-item" routerLinkActive="active"
 | 
				
			||||||
        [routerLink]="['/graphs/mining/block-sizes-weights' | relativeUrl]" i18n="mining.block-sizes-weights">Block Sizes and Weights</a>
 | 
					        [routerLink]="['/graphs/mining/block-sizes-weights' | relativeUrl]" i18n="mining.block-sizes-weights">Block Sizes and Weights</a>
 | 
				
			||||||
      <a class="dropdown-item" routerLinkActive="active"
 | 
					      <a class="dropdown-item" routerLinkActive="active"
 | 
				
			||||||
        [routerLink]="['/graphs/mining/block-predictions' | relativeUrl]" i18n="mining.block-prediction-accuracy">Blocks Predictions Accuracy</a>
 | 
					        [routerLink]="['/graphs/mining/block-prediction' | relativeUrl]" i18n="mining.block-prediction-accuracy">Block Prediction Accuracy</a>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
				
			|||||||
@ -28,22 +28,22 @@
 | 
				
			|||||||
    <form [formGroup]="radioGroupForm" class="formRadioGroup" *ngIf="(hashrateObservable$ | async) as stats">
 | 
					    <form [formGroup]="radioGroupForm" class="formRadioGroup" *ngIf="(hashrateObservable$ | async) as stats">
 | 
				
			||||||
      <div class="btn-group btn-group-toggle" ngbRadioGroup name="radioBasic" formControlName="dateSpan">
 | 
					      <div class="btn-group btn-group-toggle" ngbRadioGroup name="radioBasic" formControlName="dateSpan">
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 12960">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 12960">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'3m'" fragment="3m" [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]"> 3M
 | 
					          <input ngbButton type="radio" [value]="'3m'" fragment="3m" [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]" [attr.data-cy]="'3m'"> 3M
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 25920">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 25920">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'6m'" fragment="6m" [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]"> 6M
 | 
					          <input ngbButton type="radio" [value]="'6m'" fragment="6m" [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]" [attr.data-cy]="'6m'"> 6M
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 52560">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 52560">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'1y'" fragment="1y" [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]"> 1Y
 | 
					          <input ngbButton type="radio" [value]="'1y'" fragment="1y" [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]" [attr.data-cy]="'1y'"> 1Y
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 105120">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 105120">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'2y'" fragment="2y" [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]"> 2Y
 | 
					          <input ngbButton type="radio" [value]="'2y'" fragment="2y" [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]" [attr.data-cy]="'2y'"> 2Y
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 157680">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 157680">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'3y'" fragment="3y" [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]"> 3Y
 | 
					          <input ngbButton type="radio" [value]="'3y'" fragment="3y" [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]" [attr.data-cy]="'3y'"> 3Y
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'all'" fragment="all" [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]"> ALL
 | 
					          <input ngbButton type="radio" [value]="'all'" fragment="all" [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]" [attr.data-cy]="'all'"> ALL
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </form>
 | 
					    </form>
 | 
				
			||||||
 | 
				
			|||||||
@ -10,19 +10,19 @@
 | 
				
			|||||||
    <form [formGroup]="radioGroupForm" class="formRadioGroup" *ngIf="(hashrateObservable$ | async) as stats">
 | 
					    <form [formGroup]="radioGroupForm" class="formRadioGroup" *ngIf="(hashrateObservable$ | async) as stats">
 | 
				
			||||||
      <div class="btn-group btn-group-toggle" ngbRadioGroup name="radioBasic" formControlName="dateSpan">
 | 
					      <div class="btn-group btn-group-toggle" ngbRadioGroup name="radioBasic" formControlName="dateSpan">
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 25920">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 25920">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'6m'" fragment="6m" [routerLink]="['/graphs/mining/pools-dominance' | relativeUrl]"> 6M
 | 
					          <input ngbButton type="radio" [value]="'6m'" fragment="6m" [routerLink]="['/graphs/mining/pools-dominance' | relativeUrl]" [attr.data-cy]="'6m'"> 6M
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 52560">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 52560">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'1y'" fragment="1y" [routerLink]="['/graphs/mining/pools-dominance' | relativeUrl]"> 1Y
 | 
					          <input ngbButton type="radio" [value]="'1y'" fragment="1y" [routerLink]="['/graphs/mining/pools-dominance' | relativeUrl]" [attr.data-cy]="'1y'"> 1Y
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 105120">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 105120">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'2y'" fragment="2y" [routerLink]="['/graphs/mining/pools-dominance' | relativeUrl]"> 2Y
 | 
					          <input ngbButton type="radio" [value]="'2y'" fragment="2y" [routerLink]="['/graphs/mining/pools-dominance' | relativeUrl]" [attr.data-cy]="'2y'"> 2Y
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 157680">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.blockCount >= 157680">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'3y'" fragment="3y" [routerLink]="['/graphs/mining/pools-dominance' | relativeUrl]"> 3Y
 | 
					          <input ngbButton type="radio" [value]="'3y'" fragment="3y" [routerLink]="['/graphs/mining/pools-dominance' | relativeUrl]" [attr.data-cy]="'3y'"> 3Y
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'all'" fragment="all" [routerLink]="['/graphs/mining/pools-dominance' | relativeUrl]"> ALL
 | 
					          <input ngbButton type="radio" [value]="'all'" fragment="all" [routerLink]="['/graphs/mining/pools-dominance' | relativeUrl]" [attr.data-cy]="'all'"> ALL
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </form>
 | 
					    </form>
 | 
				
			||||||
 | 
				
			|||||||
@ -2,26 +2,26 @@
 | 
				
			|||||||
  <div class="mempool-blocks-container" *ngIf="(difficultyAdjustments$ | async) as da;">
 | 
					  <div class="mempool-blocks-container" *ngIf="(difficultyAdjustments$ | async) as da;">
 | 
				
			||||||
    <div class="flashing">
 | 
					    <div class="flashing">
 | 
				
			||||||
      <ng-template ngFor let-projectedBlock [ngForOf]="mempoolBlocks$ | async" let-i="index" [ngForTrackBy]="trackByFn">
 | 
					      <ng-template ngFor let-projectedBlock [ngForOf]="mempoolBlocks$ | async" let-i="index" [ngForTrackBy]="trackByFn">
 | 
				
			||||||
        <div class="bitcoin-block text-center mempool-block" id="mempool-block-{{ i }}" [ngStyle]="mempoolBlockStyles[i]" [class.blink-bg]="projectedBlock.blink">
 | 
					        <div [attr.data-cy]="'mempool-block-' + i" class="bitcoin-block text-center mempool-block" id="mempool-block-{{ i }}" [ngStyle]="mempoolBlockStyles[i]" [class.blink-bg]="projectedBlock.blink">
 | 
				
			||||||
          <a draggable="false" [routerLink]="['/mempool-block/' | relativeUrl, i]"
 | 
					          <a draggable="false" [routerLink]="['/mempool-block/' | relativeUrl, i]"
 | 
				
			||||||
            class="blockLink" [ngClass]="{'disabled': (this.stateService.blockScrolling$ | async)}"> </a>
 | 
					            class="blockLink" [ngClass]="{'disabled': (this.stateService.blockScrolling$ | async)}"> </a>
 | 
				
			||||||
          <div class="block-body">
 | 
					          <div class="block-body">
 | 
				
			||||||
            <div class="fees">
 | 
					            <div [attr.data-cy]="'mempool-block-' + i + '-fees'" class="fees">
 | 
				
			||||||
              ~{{ projectedBlock.medianFee | number:feeRounding }} <span i18n="shared.sat-vbyte|sat/vB">sat/vB</span>
 | 
					              ~{{ projectedBlock.medianFee | number:feeRounding }} <span i18n="shared.sat-vbyte|sat/vB">sat/vB</span>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="fee-span">
 | 
					            <div [attr.data-cy]="'mempool-block-' + i + '-fee-span'" class="fee-span">
 | 
				
			||||||
              {{ projectedBlock.feeRange[0] | number:feeRounding }} - {{ projectedBlock.feeRange[projectedBlock.feeRange.length - 1] | number:feeRounding }} <span i18n="shared.sat-vbyte|sat/vB">sat/vB</span>
 | 
					              {{ projectedBlock.feeRange[0] | number:feeRounding }} - {{ projectedBlock.feeRange[projectedBlock.feeRange.length - 1] | number:feeRounding }} <span i18n="shared.sat-vbyte|sat/vB">sat/vB</span>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div *ngIf="showMiningInfo" class="block-size">
 | 
					            <div *ngIf="showMiningInfo" class="block-size">
 | 
				
			||||||
              <app-amount [satoshis]="projectedBlock.totalFees" digitsInfo="1.2-3" [noFiat]="true"></app-amount>
 | 
					              <app-amount [attr.data-cy]="'mempool-block-' + i + '-total-fees'" [satoshis]="projectedBlock.totalFees" digitsInfo="1.2-3" [noFiat]="true"></app-amount>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div *ngIf="!showMiningInfo" class="block-size" [innerHTML]="'‎' + (projectedBlock.blockSize | bytes: 2)"></div>
 | 
					            <div *ngIf="!showMiningInfo" class="block-size" [innerHTML]="'‎' + (projectedBlock.blockSize | bytes: 2)"></div>
 | 
				
			||||||
            <div class="transaction-count">
 | 
					            <div [attr.data-cy]="'mempool-block-' + i + '-transaction-count'" class="transaction-count">
 | 
				
			||||||
              <ng-container *ngTemplateOutlet="projectedBlock.nTx === 1 ? transactionsSingular : transactionsPlural; context: {$implicit: projectedBlock.nTx | number}"></ng-container>
 | 
					              <ng-container *ngTemplateOutlet="projectedBlock.nTx === 1 ? transactionsSingular : transactionsPlural; context: {$implicit: projectedBlock.nTx | number}"></ng-container>
 | 
				
			||||||
              <ng-template #transactionsSingular let-i i18n="shared.transaction-count.singular">{{ i }} transaction</ng-template>
 | 
					              <ng-template #transactionsSingular let-i i18n="shared.transaction-count.singular">{{ i }} transaction</ng-template>
 | 
				
			||||||
              <ng-template #transactionsPlural let-i i18n="shared.transaction-count.plural">{{ i }} transactions</ng-template>
 | 
					              <ng-template #transactionsPlural let-i i18n="shared.transaction-count.plural">{{ i }} transactions</ng-template>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="time-difference" *ngIf="projectedBlock.blockVSize <= stateService.blockVSize; else mergedBlock">
 | 
					            <div [attr.data-cy]="'mempool-block-' + i + '-time'" class="time-difference" *ngIf="projectedBlock.blockVSize <= stateService.blockVSize; else mergedBlock">
 | 
				
			||||||
              <ng-template [ngIf]="network === 'liquid' || network === 'liquidtestnet'" [ngIfElse]="timeDiffMainnet">
 | 
					              <ng-template [ngIf]="network === 'liquid' || network === 'liquidtestnet'" [ngIfElse]="timeDiffMainnet">
 | 
				
			||||||
                <app-time-until [time]="(1 * i) + now + 61000" [fastRender]="false" [fixedRender]="true"></app-time-until>
 | 
					                <app-time-until [time]="(1 * i) + now + 61000" [fastRender]="false" [fixedRender]="true"></app-time-until>
 | 
				
			||||||
              </ng-template>
 | 
					              </ng-template>
 | 
				
			||||||
@ -30,7 +30,7 @@
 | 
				
			|||||||
              </ng-template>
 | 
					              </ng-template>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <ng-template #mergedBlock>
 | 
					            <ng-template #mergedBlock>
 | 
				
			||||||
              <div class="time-difference">
 | 
					              <div [attr.data-cy]="'mempool-block-' + i + '-blocks'" class="time-difference">
 | 
				
			||||||
                <b>(<ng-container *ngTemplateOutlet="blocksPlural; context: {$implicit: projectedBlock.blockVSize / stateService.blockVSize | ceil }"></ng-container>)</b>
 | 
					                <b>(<ng-container *ngTemplateOutlet="blocksPlural; context: {$implicit: projectedBlock.blockVSize / stateService.blockVSize | ceil }"></ng-container>)</b>
 | 
				
			||||||
                <ng-template #blocksPlural let-i i18n="shared.blocks">{{ i }} <span class="shared-block">blocks</span></ng-template>
 | 
					                <ng-template #blocksPlural let-i i18n="shared.blocks">{{ i }} <span class="shared-block">blocks</span></ng-template>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
 | 
				
			|||||||
@ -7,7 +7,7 @@
 | 
				
			|||||||
    <!-- Temporary stuff here - Will be moved to a component once we have more useful data to show -->
 | 
					    <!-- Temporary stuff here - Will be moved to a component once we have more useful data to show -->
 | 
				
			||||||
    <div class="col">
 | 
					    <div class="col">
 | 
				
			||||||
      <div class="main-title">
 | 
					      <div class="main-title">
 | 
				
			||||||
        <span i18n="mining.reward-stats">Reward stats</span> 
 | 
					        <span [attr.data-cy]="'reward-stats'" i18n="mining.reward-stats">Reward stats</span> 
 | 
				
			||||||
        <span style="font-size: xx-small" i18n="mining.144-blocks">(144 blocks)</span>
 | 
					        <span style="font-size: xx-small" i18n="mining.144-blocks">(144 blocks)</span>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      <div class="card-wrapper">
 | 
					      <div class="card-wrapper">
 | 
				
			||||||
@ -22,15 +22,15 @@
 | 
				
			|||||||
    <!-- difficulty adjustment -->
 | 
					    <!-- difficulty adjustment -->
 | 
				
			||||||
    <div class="col">
 | 
					    <div class="col">
 | 
				
			||||||
      <div class="main-title" i18n="dashboard.difficulty-adjustment">Difficulty Adjustment</div>
 | 
					      <div class="main-title" i18n="dashboard.difficulty-adjustment">Difficulty Adjustment</div>
 | 
				
			||||||
      <app-difficulty [showTitle]="false" [showProgress]="false" [showHalving]="true"></app-difficulty>
 | 
					      <app-difficulty [attr.data-cy]="'difficulty-adjustment'" [showTitle]="false" [showProgress]="false" [showHalving]="true"></app-difficulty>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <!-- pool distribution -->
 | 
					    <!-- pool distribution -->
 | 
				
			||||||
    <div class="col" style="margin-bottom: 1.47rem">
 | 
					    <div class="col" style="margin-bottom: 1.47rem">
 | 
				
			||||||
      <div class="card graph-card">
 | 
					      <div class="card graph-card">
 | 
				
			||||||
        <div class="card-body pl-2 pr-2">
 | 
					        <div class="card-body pl-2 pr-2">
 | 
				
			||||||
          <app-pool-ranking [widget]=true></app-pool-ranking>
 | 
					          <app-pool-ranking [attr.data-cy]="'pool-distribution'" [widget]=true></app-pool-ranking>
 | 
				
			||||||
          <div class="mt-1"><a [routerLink]="['/graphs/mining/pools' | relativeUrl]" i18n="dashboard.view-more">View more »</a></div>
 | 
					          <div class="mt-1"><a [attr.data-cy]="'pool-distribution-view-more'" [routerLink]="['/graphs/mining/pools' | relativeUrl]" i18n="dashboard.view-more">View more »</a></div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
@ -39,7 +39,7 @@
 | 
				
			|||||||
    <div class="col" style="margin-bottom: 1.47rem">
 | 
					    <div class="col" style="margin-bottom: 1.47rem">
 | 
				
			||||||
      <div class="card">
 | 
					      <div class="card">
 | 
				
			||||||
        <div class="card-body pl-lg-3 pr-lg-3 pl-2 pr-2">
 | 
					        <div class="card-body pl-lg-3 pr-lg-3 pl-2 pr-2">
 | 
				
			||||||
          <app-hashrate-chart [widget]="true"></app-hashrate-chart>
 | 
					          <app-hashrate-chart [attr.data-cy]="'hashrate-graph'" [widget]="true"></app-hashrate-chart>
 | 
				
			||||||
          <div class="mt-1"><a [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]" fragment="1y" i18n="dashboard.view-more">View more »</a></div>
 | 
					          <div class="mt-1"><a [routerLink]="['/graphs/mining/hashrate-difficulty' | relativeUrl]" fragment="1y" i18n="dashboard.view-more">View more »</a></div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
@ -54,7 +54,7 @@
 | 
				
			|||||||
            <span> </span>
 | 
					            <span> </span>
 | 
				
			||||||
            <fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true" style="vertical-align: 'text-top'; font-size: 13px; color: '#4a68b9'"></fa-icon>
 | 
					            <fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true" style="vertical-align: 'text-top'; font-size: 13px; color: '#4a68b9'"></fa-icon>
 | 
				
			||||||
          </a>
 | 
					          </a>
 | 
				
			||||||
          <app-blocks-list [widget]=true></app-blocks-list>
 | 
					          <app-blocks-list [attr.data-cy]="'latest-blocks'" [widget]=true></app-blocks-list>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
@ -68,7 +68,7 @@
 | 
				
			|||||||
            <span> </span>
 | 
					            <span> </span>
 | 
				
			||||||
            <fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true" style="vertical-align: 'text-top'; font-size: 13px; color: '#4a68b9'"></fa-icon>
 | 
					            <fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true" style="vertical-align: 'text-top'; font-size: 13px; color: '#4a68b9'"></fa-icon>
 | 
				
			||||||
          </a>
 | 
					          </a>
 | 
				
			||||||
          <app-difficulty-adjustments-table></app-difficulty-adjustments-table>
 | 
					          <app-difficulty-adjustments-table [attr.data-cy]="'difficulty-adjustments-table'"></app-difficulty-adjustments-table>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
				
			|||||||
@ -40,34 +40,34 @@
 | 
				
			|||||||
      *ngIf="!widget && (miningStatsObservable$ | async) as stats">
 | 
					      *ngIf="!widget && (miningStatsObservable$ | async) as stats">
 | 
				
			||||||
      <div class="btn-group btn-group-toggle" ngbRadioGroup name="radioBasic" formControlName="dateSpan">
 | 
					      <div class="btn-group btn-group-toggle" ngbRadioGroup name="radioBasic" formControlName="dateSpan">
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 144">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 144">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'24h'" fragment="24h" [routerLink]="['/graphs/mining/pools' | relativeUrl]"> 24h
 | 
					          <input ngbButton type="radio" [value]="'24h'" fragment="24h" [routerLink]="['/graphs/mining/pools' | relativeUrl]" [attr.data-cy]="'24h'"> 24h
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 432">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 432">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'3d'" fragment="3d" [routerLink]="['/graphs/mining/pools' | relativeUrl]"> 3D
 | 
					          <input ngbButton type="radio" [value]="'3d'" fragment="3d" [routerLink]="['/graphs/mining/pools' | relativeUrl]" [attr.data-cy]="'3d'"> 3D
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 1008">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 1008">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'1w'" fragment="1w" [routerLink]="['/graphs/mining/pools' | relativeUrl]"> 1W
 | 
					          <input ngbButton type="radio" [value]="'1w'" fragment="1w" [routerLink]="['/graphs/mining/pools' | relativeUrl]" [attr.data-cy]="'1w'"> 1W
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 4320">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 4320">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'1m'" fragment="1m" [routerLink]="['/graphs/mining/pools' | relativeUrl]"> 1M
 | 
					          <input ngbButton type="radio" [value]="'1m'" fragment="1m" [routerLink]="['/graphs/mining/pools' | relativeUrl]" [attr.data-cy]="'1m'"> 1M
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 12960">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 12960">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'3m'" fragment="3m" [routerLink]="['/graphs/mining/pools' | relativeUrl]"> 3M
 | 
					          <input ngbButton type="radio" [value]="'3m'" fragment="3m" [routerLink]="['/graphs/mining/pools' | relativeUrl]" [attr.data-cy]="'3m'"> 3M
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 25920">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 25920">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'6m'" fragment="6m" [routerLink]="['/graphs/mining/pools' | relativeUrl]"> 6M
 | 
					          <input ngbButton type="radio" [value]="'6m'" fragment="6m" [routerLink]="['/graphs/mining/pools' | relativeUrl]" [attr.data-cy]="'6m'"> 6M
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 52560">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 52560">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'1y'" fragment="1y" [routerLink]="['/graphs/mining/pools' | relativeUrl]"> 1Y
 | 
					          <input ngbButton type="radio" [value]="'1y'" fragment="1y" [routerLink]="['/graphs/mining/pools' | relativeUrl]" [attr.data-cy]="'1y'"> 1Y
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 105120">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 105120">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'2y'" fragment="2y" [routerLink]="['/graphs/mining/pools' | relativeUrl]"> 2Y
 | 
					          <input ngbButton type="radio" [value]="'2y'" fragment="2y" [routerLink]="['/graphs/mining/pools' | relativeUrl]" [attr.data-cy]="'2y'"> 2Y
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 157680">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm" *ngIf="stats.totalBlockCount >= 157680">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'3y'" fragment="3y" [routerLink]="['/graphs/mining/pools' | relativeUrl]"> 3Y
 | 
					          <input ngbButton type="radio" [value]="'3y'" fragment="3y" [routerLink]="['/graphs/mining/pools' | relativeUrl]" [attr.data-cy]="'3y'"> 3Y
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
        <label ngbButtonLabel class="btn-primary btn-sm">
 | 
					        <label ngbButtonLabel class="btn-primary btn-sm">
 | 
				
			||||||
          <input ngbButton type="radio" [value]="'all'" fragment="all" [routerLink]="['/graphs/mining/pools' | relativeUrl]"><span i18n>All</span>
 | 
					          <input ngbButton type="radio" [value]="'all'" fragment="all" [routerLink]="['/graphs/mining/pools' | relativeUrl]" [attr.data-cy]="'all'"><span i18n>All</span>
 | 
				
			||||||
        </label>
 | 
					        </label>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
    </form>
 | 
					    </form>
 | 
				
			||||||
@ -95,7 +95,7 @@
 | 
				
			|||||||
          <th class="d-none d-md-block" i18n="mining.empty-blocks">Empty blocks</th>
 | 
					          <th class="d-none d-md-block" i18n="mining.empty-blocks">Empty blocks</th>
 | 
				
			||||||
        </tr>
 | 
					        </tr>
 | 
				
			||||||
      </thead>
 | 
					      </thead>
 | 
				
			||||||
      <tbody *ngIf="(miningStatsObservable$ | async) as miningStats">
 | 
					      <tbody [attr.data-cy]="'pools-table'" *ngIf="(miningStatsObservable$ | async) as miningStats">
 | 
				
			||||||
        <tr *ngFor="let pool of miningStats.pools">
 | 
					        <tr *ngFor="let pool of miningStats.pools">
 | 
				
			||||||
          <td class="d-none d-md-block">{{ pool.rank }}</td>
 | 
					          <td class="d-none d-md-block">{{ pool.rank }}</td>
 | 
				
			||||||
          <td class="text-right">
 | 
					          <td class="text-right">
 | 
				
			||||||
 | 
				
			|||||||
@ -22,7 +22,7 @@ import { DashboardComponent } from '../dashboard/dashboard.component';
 | 
				
			|||||||
import { MiningDashboardComponent } from '../components/mining-dashboard/mining-dashboard.component';
 | 
					import { MiningDashboardComponent } from '../components/mining-dashboard/mining-dashboard.component';
 | 
				
			||||||
import { HashrateChartComponent } from '../components/hashrate-chart/hashrate-chart.component';
 | 
					import { HashrateChartComponent } from '../components/hashrate-chart/hashrate-chart.component';
 | 
				
			||||||
import { HashrateChartPoolsComponent } from '../components/hashrates-chart-pools/hashrate-chart-pools.component';
 | 
					import { HashrateChartPoolsComponent } from '../components/hashrates-chart-pools/hashrate-chart-pools.component';
 | 
				
			||||||
import { BlockPredictionsGraphComponent } from '../components/block-predictions-graph/block-predictions-graph.component';
 | 
					import { BlockPredictionGraphComponent } from '../components/block-prediction-graph/block-prediction-graph.component';
 | 
				
			||||||
import { CommonModule } from '@angular/common';
 | 
					import { CommonModule } from '@angular/common';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@NgModule({
 | 
					@NgModule({
 | 
				
			||||||
@ -48,7 +48,7 @@ import { CommonModule } from '@angular/common';
 | 
				
			|||||||
    LbtcPegsGraphComponent,
 | 
					    LbtcPegsGraphComponent,
 | 
				
			||||||
    HashrateChartComponent,
 | 
					    HashrateChartComponent,
 | 
				
			||||||
    HashrateChartPoolsComponent,
 | 
					    HashrateChartPoolsComponent,
 | 
				
			||||||
    BlockPredictionsGraphComponent,
 | 
					    BlockPredictionGraphComponent,
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
  imports: [
 | 
					  imports: [
 | 
				
			||||||
    CommonModule,
 | 
					    CommonModule,
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import { NgModule } from '@angular/core';
 | 
					import { NgModule } from '@angular/core';
 | 
				
			||||||
import { RouterModule, Routes } from '@angular/router';
 | 
					import { RouterModule, Routes } from '@angular/router';
 | 
				
			||||||
import { BlockPredictionsGraphComponent } from '../components/block-predictions-graph/block-predictions-graph.component';
 | 
					import { BlockPredictionGraphComponent } from '../components/block-prediction-graph/block-prediction-graph.component';
 | 
				
			||||||
import { BlockFeeRatesGraphComponent } from '../components/block-fee-rates-graph/block-fee-rates-graph.component';
 | 
					import { BlockFeeRatesGraphComponent } from '../components/block-fee-rates-graph/block-fee-rates-graph.component';
 | 
				
			||||||
import { BlockFeesGraphComponent } from '../components/block-fees-graph/block-fees-graph.component';
 | 
					import { BlockFeesGraphComponent } from '../components/block-fees-graph/block-fees-graph.component';
 | 
				
			||||||
import { BlockRewardsGraphComponent } from '../components/block-rewards-graph/block-rewards-graph.component';
 | 
					import { BlockRewardsGraphComponent } from '../components/block-rewards-graph/block-rewards-graph.component';
 | 
				
			||||||
@ -94,8 +94,8 @@ const routes: Routes = [
 | 
				
			|||||||
            redirectTo: 'mempool',
 | 
					            redirectTo: 'mempool',
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
          {
 | 
					          {
 | 
				
			||||||
            path: 'mining/block-predictions',
 | 
					            path: 'mining/block-prediction',
 | 
				
			||||||
            component: BlockPredictionsGraphComponent,
 | 
					            component: BlockPredictionGraphComponent,
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
 | 
				
			|||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -3,7 +3,7 @@ Description=Bitcoind-signet
 | 
				
			|||||||
After=network.target
 | 
					After=network.target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
ExecStart=/usr/local/bin/bitcoind -conf=bitcoin-signet.conf -daemon -signet -printtoconsole -pid=/bitcoin/bitcoind-signet.pid
 | 
					ExecStart=/usr/local/bin/bitcoind -conf=bitcoin.conf -daemon -signet -printtoconsole -pid=/bitcoin/bitcoind-signet.pid
 | 
				
			||||||
ExecStop=/usr/local/bin/bitcoin-cli -signet stop
 | 
					ExecStop=/usr/local/bin/bitcoin-cli -signet stop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Type=forking
 | 
					Type=forking
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ Description=Bitcoind-testnet
 | 
				
			|||||||
After=network.target
 | 
					After=network.target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
ExecStart=/usr/local/bin/bitcoind -conf=bitcoin-testnet.conf -daemon -testnet -printtoconsole -pid=/bitcoin/bitcoind-testnet.pid
 | 
					ExecStart=/usr/local/bin/bitcoind -conf=bitcoin.conf -daemon -testnet -printtoconsole -pid=/bitcoin/bitcoind-testnet.pid
 | 
				
			||||||
ExecStop=/usr/local/bin/bitcoin-cli -testnet stop
 | 
					ExecStop=/usr/local/bin/bitcoin-cli -testnet stop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Type=forking
 | 
					Type=forking
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										22
									
								
								production/linux/elements-testnet.service
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								production/linux/elements-testnet.service
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					[Unit]
 | 
				
			||||||
 | 
					Description=Elementsd
 | 
				
			||||||
 | 
					After=network.target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Service]
 | 
				
			||||||
 | 
					ExecStart=/usr/local/bin/elementsd -daemon -printtoconsole -chain=liquidtestnet -pid=/elements/elements-testnet.pid
 | 
				
			||||||
 | 
					ExecStop=/usr/local/bin/elements-cli stop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Type=forking
 | 
				
			||||||
 | 
					PIDFile=/elements/elements-testnet.pid
 | 
				
			||||||
 | 
					Restart=on-failure
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					User=elements
 | 
				
			||||||
 | 
					Group=elements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PrivateTmp=true
 | 
				
			||||||
 | 
					ProtectSystem=full
 | 
				
			||||||
 | 
					NoNewPrivileges=true
 | 
				
			||||||
 | 
					PrivateDevices=true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Install]
 | 
				
			||||||
 | 
					WantedBy=multi-user.target
 | 
				
			||||||
@ -1,17 +1,17 @@
 | 
				
			|||||||
[Unit]
 | 
					[Unit]
 | 
				
			||||||
Description=Liquid
 | 
					Description=Elementsd
 | 
				
			||||||
After=network.target
 | 
					After=network.target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
ExecStart=/usr/local/bin/elementsd -daemon -printtoconsole -pid=/liquid/liquid.pid
 | 
					ExecStart=/usr/local/bin/elementsd -daemon -printtoconsole -chain=liquidv1 -pid=/elements/elements.pid
 | 
				
			||||||
ExecStop=/usr/local/bin/elements-cli stop
 | 
					ExecStop=/usr/local/bin/elements-cli stop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Type=forking
 | 
					Type=forking
 | 
				
			||||||
PIDFile=/liquid/liquid.pid
 | 
					PIDFile=/elements/elements.pid
 | 
				
			||||||
Restart=on-failure
 | 
					Restart=on-failure
 | 
				
			||||||
 | 
					
 | 
				
			||||||
User=liquid
 | 
					User=elements
 | 
				
			||||||
Group=liquid
 | 
					Group=elements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PrivateTmp=true
 | 
					PrivateTmp=true
 | 
				
			||||||
ProtectSystem=full
 | 
					ProtectSystem=full
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user