Compare commits
	
		
			5 Commits
		
	
	
		
			593386b16b
			...
			3cc35348ff
		
	
	| Author | SHA1 | Date | 
|---|---|---|
| 
							
							
								 | 
						3cc35348ff | |
| 
							
							
								 | 
						48b1808497 | |
| 
							
							
								 | 
						ab53a80c4d | |
| 
							
							
								 | 
						f690246a7e | |
| 
							
							
								 | 
						39a269d10a | 
| 
						 | 
					@ -11,7 +11,7 @@ class RedirectIfNotInitializedMiddleware
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * @var array<int, string>
 | 
					     * @var array<int, string>
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public array $dontRedirect = ['initialize.form', 'initialize.store'];
 | 
					    public array $dontRedirect = ['initialize.form', 'initialize.store', 'nami.login-check', 'nami.search'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Handle an incoming request.
 | 
					     * Handle an incoming request.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,9 +13,7 @@ use App\Initialize\InitializeMembers;
 | 
				
			||||||
use App\Initialize\InitializeNationalities;
 | 
					use App\Initialize\InitializeNationalities;
 | 
				
			||||||
use App\Initialize\InitializeRegions;
 | 
					use App\Initialize\InitializeRegions;
 | 
				
			||||||
use App\Setting\NamiSettings;
 | 
					use App\Setting\NamiSettings;
 | 
				
			||||||
use Illuminate\Console\Command;
 | 
					 | 
				
			||||||
use Illuminate\Http\RedirectResponse;
 | 
					use Illuminate\Http\RedirectResponse;
 | 
				
			||||||
use Illuminate\Validation\ValidationException;
 | 
					 | 
				
			||||||
use Lorisleiva\Actions\ActionRequest;
 | 
					use Lorisleiva\Actions\ActionRequest;
 | 
				
			||||||
use Lorisleiva\Actions\Concerns\AsAction;
 | 
					use Lorisleiva\Actions\Concerns\AsAction;
 | 
				
			||||||
use Zoomyboy\LaravelNami\Nami;
 | 
					use Zoomyboy\LaravelNami\Nami;
 | 
				
			||||||
| 
						 | 
					@ -60,6 +58,7 @@ class InitializeAction
 | 
				
			||||||
            'mglnr' => 'required|numeric',
 | 
					            'mglnr' => 'required|numeric',
 | 
				
			||||||
            'password' => 'required|string',
 | 
					            'password' => 'required|string',
 | 
				
			||||||
            'group_id' => 'required|numeric',
 | 
					            'group_id' => 'required|numeric',
 | 
				
			||||||
 | 
					            'params' => 'required|array',
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,32 +72,17 @@ class InitializeAction
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function asController(ActionRequest $request): RedirectResponse
 | 
					    public function asController(ActionRequest $request, NamiSettings $settings): RedirectResponse
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $api = Nami::freshLogin($request->input('mglnr'), $request->input('password'));
 | 
					        $api = Nami::freshLogin($request->input('mglnr'), $request->input('password'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!$api->hasGroup($request->input('group_id'))) {
 | 
					        $settings->mglnr = (int) $request->input('mglnr');
 | 
				
			||||||
            throw ValidationException::withMessages(['nami' => 'Gruppierung nicht gefunden.']);
 | 
					        $settings->password = $request->input('password');
 | 
				
			||||||
        }
 | 
					        $settings->default_group_id = (int) $request->input('group_id');
 | 
				
			||||||
 | 
					        $settings->search_params = $request->input('params');
 | 
				
			||||||
        $this->setApi((int) $request->input('mglnr'), $request->input('password'), (int) $request->input('group_id'));
 | 
					 | 
				
			||||||
        self::dispatch();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return redirect()->route('home')->success('Initialisierung beauftragt. Wir benachrichtigen dich per Mail wenn alles fertig ist.');
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public function asCommand(Command $command): void
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        $this->setApi((int) $command->option('mglnr'), $command->option('password'), (int) $command->option('group'));
 | 
					 | 
				
			||||||
        self::dispatch();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private function setApi(int $mglnr, string $password, int $groupId): void
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        $settings = app(NamiSettings::class);
 | 
					 | 
				
			||||||
        $settings->mglnr = $mglnr;
 | 
					 | 
				
			||||||
        $settings->password = $password;
 | 
					 | 
				
			||||||
        $settings->default_group_id = $groupId;
 | 
					 | 
				
			||||||
        $settings->save();
 | 
					        $settings->save();
 | 
				
			||||||
 | 
					        self::dispatch();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return redirect()->route('home');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,39 @@
 | 
				
			||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace App\Initialize\Actions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Illuminate\Http\Response;
 | 
				
			||||||
 | 
					use Lorisleiva\Actions\ActionRequest;
 | 
				
			||||||
 | 
					use Lorisleiva\Actions\Concerns\AsAction;
 | 
				
			||||||
 | 
					use Zoomyboy\LaravelNami\Nami;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class NamiLoginCheckAction
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    use AsAction;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param array{mglnr: string, password: string} $input
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function handle(array $input): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        Nami::freshLogin((int) $input['mglnr'], $input['password']);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return array<string, string>
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function rules(): array
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					            'mglnr' => 'required|numeric|min:0',
 | 
				
			||||||
 | 
					            'password' => 'required|string',
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function asController(ActionRequest $request): Response
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->handle($request->validated());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return response()->noContent();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,47 @@
 | 
				
			||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace App\Initialize\Actions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Illuminate\Contracts\Pagination\LengthAwarePaginator;
 | 
				
			||||||
 | 
					use Lorisleiva\Actions\ActionRequest;
 | 
				
			||||||
 | 
					use Lorisleiva\Actions\Concerns\AsAction;
 | 
				
			||||||
 | 
					use Zoomyboy\LaravelNami\Api;
 | 
				
			||||||
 | 
					use Zoomyboy\LaravelNami\Data\MemberEntry;
 | 
				
			||||||
 | 
					use Zoomyboy\LaravelNami\Nami;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class NamiSearchAction
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    use AsAction;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param array<string, mixed> $params
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return LengthAwarePaginator<MemberEntry>
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function handle(Api $api, int $page, array $params): LengthAwarePaginator
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return $api->pageSearch($params, $page, 10);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return array<string, string>
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function rules(): array
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					            'mglnr' => 'required|numeric|min:0',
 | 
				
			||||||
 | 
					            'password' => 'required|string',
 | 
				
			||||||
 | 
					            'params' => 'array',
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @return LengthAwarePaginator<MemberEntry>
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function asController(ActionRequest $request): LengthAwarePaginator
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $api = Nami::login($request->input('mglnr'), $request->input('password'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $this->handle($api, $request->input('page', 1), $request->input('params'));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -21,9 +21,10 @@ class InitializeMembers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function handle(Api $api): void
 | 
					    public function handle(Api $api): void
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        $settings = app(NamiSettings::class);
 | 
				
			||||||
        Redis::delete('members');
 | 
					        Redis::delete('members');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $jobs = $api->search([])->map(function (NamiMemberEntry $member) use ($api) {
 | 
					        $jobs = $api->search($settings->search_params)->map(function (NamiMemberEntry $member) use ($api) {
 | 
				
			||||||
            return FullMemberAction::makeJob($api, $member->groupId, $member->id, 'members');
 | 
					            return FullMemberAction::makeJob($api, $member->groupId, $member->id, 'members');
 | 
				
			||||||
        })->toArray();
 | 
					        })->toArray();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,6 +15,9 @@ class NamiSettings extends Settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public int $default_group_id;
 | 
					    public int $default_group_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** @var array<string, string> */
 | 
				
			||||||
 | 
					    public array $search_params;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static function group(): string
 | 
					    public static function group(): string
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return 'nami';
 | 
					        return 'nami';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,11 @@
 | 
				
			||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Spatie\LaravelSettings\Migrations\SettingsMigration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class CreateNamiSearchSetting extends SettingsMigration
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public function up(): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->migrator->add('nami.search_params', []);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,7 @@
 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "@inertiajs/inertia": "^0.11.0",
 | 
					                "@inertiajs/inertia": "^0.11.0",
 | 
				
			||||||
                "@inertiajs/inertia-vue": "^0.8.0",
 | 
					                "@inertiajs/inertia-vue": "^0.8.0",
 | 
				
			||||||
 | 
					                "@tailwindcss/typography": "^0.5.9",
 | 
				
			||||||
                "lodash": "^4.17.21",
 | 
					                "lodash": "^4.17.21",
 | 
				
			||||||
                "merge": "^2.1.1",
 | 
					                "merge": "^2.1.1",
 | 
				
			||||||
                "pinia": "^2.0.35",
 | 
					                "pinia": "^2.0.35",
 | 
				
			||||||
| 
						 | 
					@ -1994,7 +1995,6 @@
 | 
				
			||||||
            "version": "2.1.5",
 | 
					            "version": "2.1.5",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
 | 
				
			||||||
            "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
 | 
					            "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "@nodelib/fs.stat": "2.0.5",
 | 
					                "@nodelib/fs.stat": "2.0.5",
 | 
				
			||||||
                "run-parallel": "^1.1.9"
 | 
					                "run-parallel": "^1.1.9"
 | 
				
			||||||
| 
						 | 
					@ -2007,7 +2007,6 @@
 | 
				
			||||||
            "version": "2.0.5",
 | 
					            "version": "2.0.5",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
 | 
				
			||||||
            "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
 | 
					            "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
                "node": ">= 8"
 | 
					                "node": ">= 8"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -2016,7 +2015,6 @@
 | 
				
			||||||
            "version": "1.2.8",
 | 
					            "version": "1.2.8",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
 | 
				
			||||||
            "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
 | 
					            "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "@nodelib/fs.scandir": "2.1.5",
 | 
					                "@nodelib/fs.scandir": "2.1.5",
 | 
				
			||||||
                "fastq": "^1.6.0"
 | 
					                "fastq": "^1.6.0"
 | 
				
			||||||
| 
						 | 
					@ -2227,6 +2225,32 @@
 | 
				
			||||||
                "node": ">= 10"
 | 
					                "node": ">= 10"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@tailwindcss/typography": {
 | 
				
			||||||
 | 
					            "version": "0.5.9",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.9.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "lodash.castarray": "^4.4.0",
 | 
				
			||||||
 | 
					                "lodash.isplainobject": "^4.0.6",
 | 
				
			||||||
 | 
					                "lodash.merge": "^4.6.2",
 | 
				
			||||||
 | 
					                "postcss-selector-parser": "6.0.10"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "peerDependencies": {
 | 
				
			||||||
 | 
					                "tailwindcss": ">=3.0.0 || insiders"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": {
 | 
				
			||||||
 | 
					            "version": "6.0.10",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
 | 
				
			||||||
 | 
					            "dependencies": {
 | 
				
			||||||
 | 
					                "cssesc": "^3.0.0",
 | 
				
			||||||
 | 
					                "util-deprecate": "^1.0.2"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "engines": {
 | 
				
			||||||
 | 
					                "node": ">=4"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        "node_modules/@trysound/sax": {
 | 
					        "node_modules/@trysound/sax": {
 | 
				
			||||||
            "version": "0.2.0",
 | 
					            "version": "0.2.0",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
 | 
				
			||||||
| 
						 | 
					@ -2856,7 +2880,6 @@
 | 
				
			||||||
            "version": "1.8.2",
 | 
					            "version": "1.8.2",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
 | 
				
			||||||
            "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
 | 
					            "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "acorn": "^7.0.0",
 | 
					                "acorn": "^7.0.0",
 | 
				
			||||||
                "acorn-walk": "^7.0.0",
 | 
					                "acorn-walk": "^7.0.0",
 | 
				
			||||||
| 
						 | 
					@ -2867,7 +2890,6 @@
 | 
				
			||||||
            "version": "7.4.1",
 | 
					            "version": "7.4.1",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
 | 
				
			||||||
            "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
 | 
					            "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "bin": {
 | 
					            "bin": {
 | 
				
			||||||
                "acorn": "bin/acorn"
 | 
					                "acorn": "bin/acorn"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					@ -2879,7 +2901,6 @@
 | 
				
			||||||
            "version": "7.2.0",
 | 
					            "version": "7.2.0",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
 | 
				
			||||||
            "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
 | 
					            "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
                "node": ">=0.4.0"
 | 
					                "node": ">=0.4.0"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -2986,7 +3007,6 @@
 | 
				
			||||||
            "version": "3.1.3",
 | 
					            "version": "3.1.3",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
 | 
				
			||||||
            "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
 | 
					            "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "normalize-path": "^3.0.0",
 | 
					                "normalize-path": "^3.0.0",
 | 
				
			||||||
                "picomatch": "^2.0.4"
 | 
					                "picomatch": "^2.0.4"
 | 
				
			||||||
| 
						 | 
					@ -2998,8 +3018,7 @@
 | 
				
			||||||
        "node_modules/arg": {
 | 
					        "node_modules/arg": {
 | 
				
			||||||
            "version": "5.0.2",
 | 
					            "version": "5.0.2",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
 | 
				
			||||||
            "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
 | 
					            "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="
 | 
				
			||||||
            "dev": true
 | 
					 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "node_modules/argparse": {
 | 
					        "node_modules/argparse": {
 | 
				
			||||||
            "version": "2.0.1",
 | 
					            "version": "2.0.1",
 | 
				
			||||||
| 
						 | 
					@ -3230,7 +3249,6 @@
 | 
				
			||||||
            "version": "2.2.0",
 | 
					            "version": "2.2.0",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
 | 
				
			||||||
            "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
 | 
					            "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
                "node": ">=8"
 | 
					                "node": ">=8"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -3325,7 +3343,6 @@
 | 
				
			||||||
            "version": "3.0.2",
 | 
					            "version": "3.0.2",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
 | 
				
			||||||
            "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
 | 
					            "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "fill-range": "^7.0.1"
 | 
					                "fill-range": "^7.0.1"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					@ -3527,7 +3544,6 @@
 | 
				
			||||||
            "version": "2.0.1",
 | 
					            "version": "2.0.1",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
 | 
				
			||||||
            "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
 | 
					            "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
                "node": ">= 6"
 | 
					                "node": ">= 6"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -3589,7 +3605,6 @@
 | 
				
			||||||
            "version": "3.5.3",
 | 
					            "version": "3.5.3",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
 | 
				
			||||||
            "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
 | 
					            "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "funding": [
 | 
					            "funding": [
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    "type": "individual",
 | 
					                    "type": "individual",
 | 
				
			||||||
| 
						 | 
					@ -3616,7 +3631,6 @@
 | 
				
			||||||
            "version": "5.1.2",
 | 
					            "version": "5.1.2",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
 | 
				
			||||||
            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
 | 
					            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "is-glob": "^4.0.1"
 | 
					                "is-glob": "^4.0.1"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					@ -4208,7 +4222,6 @@
 | 
				
			||||||
            "version": "3.0.0",
 | 
					            "version": "3.0.0",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
 | 
				
			||||||
            "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
 | 
					            "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "bin": {
 | 
					            "bin": {
 | 
				
			||||||
                "cssesc": "bin/cssesc"
 | 
					                "cssesc": "bin/cssesc"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					@ -4375,7 +4388,6 @@
 | 
				
			||||||
            "version": "1.0.1",
 | 
					            "version": "1.0.1",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
 | 
				
			||||||
            "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==",
 | 
					            "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "funding": {
 | 
					            "funding": {
 | 
				
			||||||
                "url": "https://github.com/sponsors/ljharb"
 | 
					                "url": "https://github.com/sponsors/ljharb"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -4428,7 +4440,6 @@
 | 
				
			||||||
            "version": "5.2.1",
 | 
					            "version": "5.2.1",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
 | 
				
			||||||
            "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
 | 
					            "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "acorn-node": "^1.8.2",
 | 
					                "acorn-node": "^1.8.2",
 | 
				
			||||||
                "defined": "^1.0.0",
 | 
					                "defined": "^1.0.0",
 | 
				
			||||||
| 
						 | 
					@ -4444,8 +4455,7 @@
 | 
				
			||||||
        "node_modules/didyoumean": {
 | 
					        "node_modules/didyoumean": {
 | 
				
			||||||
            "version": "1.2.2",
 | 
					            "version": "1.2.2",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
 | 
				
			||||||
            "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
 | 
					            "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="
 | 
				
			||||||
            "dev": true
 | 
					 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "node_modules/diffie-hellman": {
 | 
					        "node_modules/diffie-hellman": {
 | 
				
			||||||
            "version": "5.0.3",
 | 
					            "version": "5.0.3",
 | 
				
			||||||
| 
						 | 
					@ -4479,8 +4489,7 @@
 | 
				
			||||||
        "node_modules/dlv": {
 | 
					        "node_modules/dlv": {
 | 
				
			||||||
            "version": "1.1.3",
 | 
					            "version": "1.1.3",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
 | 
				
			||||||
            "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
 | 
					            "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="
 | 
				
			||||||
            "dev": true
 | 
					 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        "node_modules/dns-equal": {
 | 
					        "node_modules/dns-equal": {
 | 
				
			||||||
            "version": "1.0.0",
 | 
					            "version": "1.0.0",
 | 
				
			||||||
| 
						 | 
					@ -5077,7 +5086,6 @@
 | 
				
			||||||
            "version": "3.2.12",
 | 
					            "version": "3.2.12",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
 | 
				
			||||||
            "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
 | 
					            "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "@nodelib/fs.stat": "^2.0.2",
 | 
					                "@nodelib/fs.stat": "^2.0.2",
 | 
				
			||||||
                "@nodelib/fs.walk": "^1.2.3",
 | 
					                "@nodelib/fs.walk": "^1.2.3",
 | 
				
			||||||
| 
						 | 
					@ -5093,7 +5101,6 @@
 | 
				
			||||||
            "version": "5.1.2",
 | 
					            "version": "5.1.2",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
 | 
				
			||||||
            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
 | 
					            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "is-glob": "^4.0.1"
 | 
					                "is-glob": "^4.0.1"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					@ -5126,7 +5133,6 @@
 | 
				
			||||||
            "version": "1.15.0",
 | 
					            "version": "1.15.0",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
 | 
				
			||||||
            "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
 | 
					            "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "reusify": "^1.0.4"
 | 
					                "reusify": "^1.0.4"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -5211,7 +5217,6 @@
 | 
				
			||||||
            "version": "7.0.1",
 | 
					            "version": "7.0.1",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
 | 
				
			||||||
            "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
 | 
					            "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "to-regex-range": "^5.0.1"
 | 
					                "to-regex-range": "^5.0.1"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					@ -5402,7 +5407,6 @@
 | 
				
			||||||
            "version": "2.3.2",
 | 
					            "version": "2.3.2",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
 | 
				
			||||||
            "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
 | 
					            "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "hasInstallScript": true,
 | 
					            "hasInstallScript": true,
 | 
				
			||||||
            "optional": true,
 | 
					            "optional": true,
 | 
				
			||||||
            "os": [
 | 
					            "os": [
 | 
				
			||||||
| 
						 | 
					@ -5482,7 +5486,6 @@
 | 
				
			||||||
            "version": "6.0.2",
 | 
					            "version": "6.0.2",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
 | 
				
			||||||
            "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
 | 
					            "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "is-glob": "^4.0.3"
 | 
					                "is-glob": "^4.0.3"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					@ -6063,7 +6066,6 @@
 | 
				
			||||||
            "version": "2.1.0",
 | 
					            "version": "2.1.0",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
 | 
				
			||||||
            "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
 | 
					            "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "binary-extensions": "^2.0.0"
 | 
					                "binary-extensions": "^2.0.0"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					@ -6107,7 +6109,6 @@
 | 
				
			||||||
            "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",
 | 
				
			||||||
            "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
 | 
					            "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
                "node": ">=0.10.0"
 | 
					                "node": ">=0.10.0"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -6124,7 +6125,6 @@
 | 
				
			||||||
            "version": "4.0.3",
 | 
					            "version": "4.0.3",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
 | 
				
			||||||
            "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
 | 
					            "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "is-extglob": "^2.1.1"
 | 
					                "is-extglob": "^2.1.1"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					@ -6136,7 +6136,6 @@
 | 
				
			||||||
            "version": "7.0.0",
 | 
					            "version": "7.0.0",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
 | 
				
			||||||
            "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
 | 
					            "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
                "node": ">=0.12.0"
 | 
					                "node": ">=0.12.0"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -6497,7 +6496,6 @@
 | 
				
			||||||
            "version": "2.1.0",
 | 
					            "version": "2.1.0",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
 | 
				
			||||||
            "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
 | 
					            "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
                "node": ">=10"
 | 
					                "node": ">=10"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -6551,6 +6549,11 @@
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
 | 
				
			||||||
            "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
 | 
					            "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/lodash.castarray": {
 | 
				
			||||||
 | 
					            "version": "4.4.0",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q=="
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        "node_modules/lodash.clonedeep": {
 | 
					        "node_modules/lodash.clonedeep": {
 | 
				
			||||||
            "version": "4.5.0",
 | 
					            "version": "4.5.0",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
 | 
				
			||||||
| 
						 | 
					@ -6572,6 +6575,11 @@
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
 | 
				
			||||||
            "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
 | 
					            "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        "node_modules/lodash.isplainobject": {
 | 
				
			||||||
 | 
					            "version": "4.0.6",
 | 
				
			||||||
 | 
					            "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
 | 
				
			||||||
 | 
					            "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        "node_modules/lodash.memoize": {
 | 
					        "node_modules/lodash.memoize": {
 | 
				
			||||||
            "version": "4.1.2",
 | 
					            "version": "4.1.2",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
 | 
				
			||||||
| 
						 | 
					@ -6732,7 +6740,6 @@
 | 
				
			||||||
            "version": "1.4.1",
 | 
					            "version": "1.4.1",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
 | 
				
			||||||
            "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
 | 
					            "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
                "node": ">= 8"
 | 
					                "node": ">= 8"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -6750,7 +6757,6 @@
 | 
				
			||||||
            "version": "4.0.5",
 | 
					            "version": "4.0.5",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
 | 
				
			||||||
            "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
 | 
					            "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "braces": "^3.0.2",
 | 
					                "braces": "^3.0.2",
 | 
				
			||||||
                "picomatch": "^2.3.1"
 | 
					                "picomatch": "^2.3.1"
 | 
				
			||||||
| 
						 | 
					@ -6886,7 +6892,6 @@
 | 
				
			||||||
            "version": "1.2.8",
 | 
					            "version": "1.2.8",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
 | 
				
			||||||
            "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
 | 
					            "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "funding": {
 | 
					            "funding": {
 | 
				
			||||||
                "url": "https://github.com/sponsors/ljharb"
 | 
					                "url": "https://github.com/sponsors/ljharb"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -7023,7 +7028,6 @@
 | 
				
			||||||
            "version": "3.0.0",
 | 
					            "version": "3.0.0",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
 | 
				
			||||||
            "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
 | 
					            "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
                "node": ">=0.10.0"
 | 
					                "node": ">=0.10.0"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -7085,7 +7089,6 @@
 | 
				
			||||||
            "version": "3.0.0",
 | 
					            "version": "3.0.0",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
 | 
				
			||||||
            "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
 | 
					            "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
                "node": ">= 6"
 | 
					                "node": ">= 6"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -7415,7 +7418,6 @@
 | 
				
			||||||
            "version": "2.3.1",
 | 
					            "version": "2.3.1",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
 | 
				
			||||||
            "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
 | 
					            "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
                "node": ">=8.6"
 | 
					                "node": ">=8.6"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					@ -7676,7 +7678,6 @@
 | 
				
			||||||
            "version": "4.0.1",
 | 
					            "version": "4.0.1",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
 | 
				
			||||||
            "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
 | 
					            "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "camelcase-css": "^2.0.1"
 | 
					                "camelcase-css": "^2.0.1"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					@ -7695,7 +7696,6 @@
 | 
				
			||||||
            "version": "3.1.4",
 | 
					            "version": "3.1.4",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
 | 
				
			||||||
            "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
 | 
					            "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "lilconfig": "^2.0.5",
 | 
					                "lilconfig": "^2.0.5",
 | 
				
			||||||
                "yaml": "^1.10.2"
 | 
					                "yaml": "^1.10.2"
 | 
				
			||||||
| 
						 | 
					@ -7903,7 +7903,6 @@
 | 
				
			||||||
            "version": "6.0.0",
 | 
					            "version": "6.0.0",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz",
 | 
				
			||||||
            "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==",
 | 
					            "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "postcss-selector-parser": "^6.0.10"
 | 
					                "postcss-selector-parser": "^6.0.10"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					@ -8103,7 +8102,6 @@
 | 
				
			||||||
            "version": "6.0.11",
 | 
					            "version": "6.0.11",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz",
 | 
				
			||||||
            "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==",
 | 
					            "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "cssesc": "^3.0.0",
 | 
					                "cssesc": "^3.0.0",
 | 
				
			||||||
                "util-deprecate": "^1.0.2"
 | 
					                "util-deprecate": "^1.0.2"
 | 
				
			||||||
| 
						 | 
					@ -8298,7 +8296,6 @@
 | 
				
			||||||
            "version": "1.2.3",
 | 
					            "version": "1.2.3",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
 | 
				
			||||||
            "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
 | 
					            "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "funding": [
 | 
					            "funding": [
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    "type": "github",
 | 
					                    "type": "github",
 | 
				
			||||||
| 
						 | 
					@ -8318,7 +8315,6 @@
 | 
				
			||||||
            "version": "5.1.1",
 | 
					            "version": "5.1.1",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
 | 
				
			||||||
            "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
 | 
					            "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
                "node": ">=10"
 | 
					                "node": ">=10"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					@ -8417,7 +8413,6 @@
 | 
				
			||||||
            "version": "3.6.0",
 | 
					            "version": "3.6.0",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
 | 
				
			||||||
            "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
 | 
					            "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "picomatch": "^2.2.1"
 | 
					                "picomatch": "^2.2.1"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					@ -8623,7 +8618,6 @@
 | 
				
			||||||
            "version": "1.0.4",
 | 
					            "version": "1.0.4",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
 | 
				
			||||||
            "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
 | 
					            "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
                "iojs": ">=1.0.0",
 | 
					                "iojs": ">=1.0.0",
 | 
				
			||||||
                "node": ">=0.10.0"
 | 
					                "node": ">=0.10.0"
 | 
				
			||||||
| 
						 | 
					@ -8658,7 +8652,6 @@
 | 
				
			||||||
            "version": "1.2.0",
 | 
					            "version": "1.2.0",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
 | 
				
			||||||
            "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
 | 
					            "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "funding": [
 | 
					            "funding": [
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    "type": "github",
 | 
					                    "type": "github",
 | 
				
			||||||
| 
						 | 
					@ -9356,7 +9349,6 @@
 | 
				
			||||||
            "version": "3.2.7",
 | 
					            "version": "3.2.7",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz",
 | 
				
			||||||
            "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==",
 | 
					            "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "arg": "^5.0.2",
 | 
					                "arg": "^5.0.2",
 | 
				
			||||||
                "chokidar": "^3.5.3",
 | 
					                "chokidar": "^3.5.3",
 | 
				
			||||||
| 
						 | 
					@ -9526,7 +9518,6 @@
 | 
				
			||||||
            "version": "5.0.1",
 | 
					            "version": "5.0.1",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
 | 
				
			||||||
            "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
 | 
					            "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "dependencies": {
 | 
					            "dependencies": {
 | 
				
			||||||
                "is-number": "^7.0.0"
 | 
					                "is-number": "^7.0.0"
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					@ -10568,7 +10559,6 @@
 | 
				
			||||||
            "version": "4.0.2",
 | 
					            "version": "4.0.2",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
 | 
				
			||||||
            "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
 | 
					            "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
                "node": ">=0.4"
 | 
					                "node": ">=0.4"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -10591,7 +10581,6 @@
 | 
				
			||||||
            "version": "1.10.2",
 | 
					            "version": "1.10.2",
 | 
				
			||||||
            "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
 | 
					            "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
 | 
				
			||||||
            "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
 | 
					            "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
 | 
				
			||||||
            "dev": true,
 | 
					 | 
				
			||||||
            "engines": {
 | 
					            "engines": {
 | 
				
			||||||
                "node": ">= 6"
 | 
					                "node": ">= 6"
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,6 +27,7 @@
 | 
				
			||||||
    "dependencies": {
 | 
					    "dependencies": {
 | 
				
			||||||
        "@inertiajs/inertia": "^0.11.0",
 | 
					        "@inertiajs/inertia": "^0.11.0",
 | 
				
			||||||
        "@inertiajs/inertia-vue": "^0.8.0",
 | 
					        "@inertiajs/inertia-vue": "^0.8.0",
 | 
				
			||||||
 | 
					        "@tailwindcss/typography": "^0.5.9",
 | 
				
			||||||
        "lodash": "^4.17.21",
 | 
					        "lodash": "^4.17.21",
 | 
				
			||||||
        "merge": "^2.1.1",
 | 
					        "merge": "^2.1.1",
 | 
				
			||||||
        "pinia": "^2.0.35",
 | 
					        "pinia": "^2.0.35",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1 +1 @@
 | 
				
			||||||
Subproject commit 75983ebb4bad205629b57e18915b2f15fa38e835
 | 
					Subproject commit 33875d36fa5bd6fab4147e95f4aa705092f42d93
 | 
				
			||||||
| 
						 | 
					@ -1,110 +1,111 @@
 | 
				
			||||||
.tooltip {
 | 
					.tooltip {
 | 
				
			||||||
  display: block !important;
 | 
					    display: block !important;
 | 
				
			||||||
  z-index: 10000;
 | 
					    max-width: 50vw;
 | 
				
			||||||
 | 
					    z-index: 10000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .tooltip-inner {
 | 
					    .tooltip-inner {
 | 
				
			||||||
    @apply bg-primary-900;
 | 
					        @apply bg-primary-900;
 | 
				
			||||||
    color: white;
 | 
					        color: white;
 | 
				
			||||||
    border-radius: 8px;
 | 
					        border-radius: 8px;
 | 
				
			||||||
    padding: 5px 10px 4px;
 | 
					        padding: 5px 10px 4px;
 | 
				
			||||||
  }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  .tooltip-arrow {
 | 
					 | 
				
			||||||
    width: 0;
 | 
					 | 
				
			||||||
    height: 0;
 | 
					 | 
				
			||||||
    border-style: solid;
 | 
					 | 
				
			||||||
    position: absolute;
 | 
					 | 
				
			||||||
    margin: 5px;
 | 
					 | 
				
			||||||
    border-color: black;
 | 
					 | 
				
			||||||
    @apply border-primary-900;
 | 
					 | 
				
			||||||
    z-index: 1;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &[x-placement^="top"] {
 | 
					 | 
				
			||||||
    margin-bottom: 5px;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .tooltip-arrow {
 | 
					    .tooltip-arrow {
 | 
				
			||||||
      border-width: 5px 5px 0 5px;
 | 
					        width: 0;
 | 
				
			||||||
      border-left-color: transparent !important;
 | 
					        height: 0;
 | 
				
			||||||
      border-right-color: transparent !important;
 | 
					        border-style: solid;
 | 
				
			||||||
      border-bottom-color: transparent !important;
 | 
					        position: absolute;
 | 
				
			||||||
      bottom: -5px;
 | 
					        margin: 5px;
 | 
				
			||||||
      left: calc(50% - 5px);
 | 
					        border-color: black;
 | 
				
			||||||
      margin-top: 0;
 | 
					        @apply border-primary-900;
 | 
				
			||||||
      margin-bottom: 0;
 | 
					        z-index: 1;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &[x-placement^="bottom"] {
 | 
					 | 
				
			||||||
    margin-top: 5px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .tooltip-arrow {
 | 
					 | 
				
			||||||
      border-width: 0 5px 5px 5px;
 | 
					 | 
				
			||||||
      border-left-color: transparent !important;
 | 
					 | 
				
			||||||
      border-right-color: transparent !important;
 | 
					 | 
				
			||||||
      border-top-color: transparent !important;
 | 
					 | 
				
			||||||
      top: -5px;
 | 
					 | 
				
			||||||
      left: calc(50% - 5px);
 | 
					 | 
				
			||||||
      margin-top: 0;
 | 
					 | 
				
			||||||
      margin-bottom: 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &[x-placement^="right"] {
 | 
					 | 
				
			||||||
    margin-left: 5px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .tooltip-arrow {
 | 
					 | 
				
			||||||
      border-width: 5px 5px 5px 0;
 | 
					 | 
				
			||||||
      border-left-color: transparent !important;
 | 
					 | 
				
			||||||
      border-top-color: transparent !important;
 | 
					 | 
				
			||||||
      border-bottom-color: transparent !important;
 | 
					 | 
				
			||||||
      left: -5px;
 | 
					 | 
				
			||||||
      top: calc(50% - 5px);
 | 
					 | 
				
			||||||
      margin-left: 0;
 | 
					 | 
				
			||||||
      margin-right: 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &[x-placement^="left"] {
 | 
					 | 
				
			||||||
    margin-right: 5px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .tooltip-arrow {
 | 
					 | 
				
			||||||
      border-width: 5px 0 5px 5px;
 | 
					 | 
				
			||||||
      border-top-color: transparent !important;
 | 
					 | 
				
			||||||
      border-right-color: transparent !important;
 | 
					 | 
				
			||||||
      border-bottom-color: transparent !important;
 | 
					 | 
				
			||||||
      right: -5px;
 | 
					 | 
				
			||||||
      top: calc(50% - 5px);
 | 
					 | 
				
			||||||
      margin-left: 0;
 | 
					 | 
				
			||||||
      margin-right: 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  &.popover {
 | 
					 | 
				
			||||||
    $color: #f9f9f9;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .popover-inner {
 | 
					 | 
				
			||||||
      background: $color;
 | 
					 | 
				
			||||||
      color: black;
 | 
					 | 
				
			||||||
      padding: 24px;
 | 
					 | 
				
			||||||
      border-radius: 5px;
 | 
					 | 
				
			||||||
      box-shadow: 0 5px 30px rgba(black, .1);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .popover-arrow {
 | 
					    &[x-placement^='top'] {
 | 
				
			||||||
      border-color: $color;
 | 
					        margin-bottom: 5px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .tooltip-arrow {
 | 
				
			||||||
 | 
					            border-width: 5px 5px 0 5px;
 | 
				
			||||||
 | 
					            border-left-color: transparent !important;
 | 
				
			||||||
 | 
					            border-right-color: transparent !important;
 | 
				
			||||||
 | 
					            border-bottom-color: transparent !important;
 | 
				
			||||||
 | 
					            bottom: -5px;
 | 
				
			||||||
 | 
					            left: calc(50% - 5px);
 | 
				
			||||||
 | 
					            margin-top: 0;
 | 
				
			||||||
 | 
					            margin-bottom: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  &[aria-hidden='true'] {
 | 
					    &[x-placement^='bottom'] {
 | 
				
			||||||
    visibility: hidden;
 | 
					        margin-top: 5px;
 | 
				
			||||||
    opacity: 0;
 | 
					 | 
				
			||||||
    transition: opacity .15s, visibility .15s;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  &[aria-hidden='false'] {
 | 
					        .tooltip-arrow {
 | 
				
			||||||
    visibility: visible;
 | 
					            border-width: 0 5px 5px 5px;
 | 
				
			||||||
    opacity: 1;
 | 
					            border-left-color: transparent !important;
 | 
				
			||||||
    transition: opacity .15s;
 | 
					            border-right-color: transparent !important;
 | 
				
			||||||
  }
 | 
					            border-top-color: transparent !important;
 | 
				
			||||||
 | 
					            top: -5px;
 | 
				
			||||||
 | 
					            left: calc(50% - 5px);
 | 
				
			||||||
 | 
					            margin-top: 0;
 | 
				
			||||||
 | 
					            margin-bottom: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    &[x-placement^='right'] {
 | 
				
			||||||
 | 
					        margin-left: 5px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .tooltip-arrow {
 | 
				
			||||||
 | 
					            border-width: 5px 5px 5px 0;
 | 
				
			||||||
 | 
					            border-left-color: transparent !important;
 | 
				
			||||||
 | 
					            border-top-color: transparent !important;
 | 
				
			||||||
 | 
					            border-bottom-color: transparent !important;
 | 
				
			||||||
 | 
					            left: -5px;
 | 
				
			||||||
 | 
					            top: calc(50% - 5px);
 | 
				
			||||||
 | 
					            margin-left: 0;
 | 
				
			||||||
 | 
					            margin-right: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    &[x-placement^='left'] {
 | 
				
			||||||
 | 
					        margin-right: 5px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .tooltip-arrow {
 | 
				
			||||||
 | 
					            border-width: 5px 0 5px 5px;
 | 
				
			||||||
 | 
					            border-top-color: transparent !important;
 | 
				
			||||||
 | 
					            border-right-color: transparent !important;
 | 
				
			||||||
 | 
					            border-bottom-color: transparent !important;
 | 
				
			||||||
 | 
					            right: -5px;
 | 
				
			||||||
 | 
					            top: calc(50% - 5px);
 | 
				
			||||||
 | 
					            margin-left: 0;
 | 
				
			||||||
 | 
					            margin-right: 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    &.popover {
 | 
				
			||||||
 | 
					        $color: #f9f9f9;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .popover-inner {
 | 
				
			||||||
 | 
					            background: $color;
 | 
				
			||||||
 | 
					            color: black;
 | 
				
			||||||
 | 
					            padding: 24px;
 | 
				
			||||||
 | 
					            border-radius: 5px;
 | 
				
			||||||
 | 
					            box-shadow: 0 5px 30px rgba(black, 0.1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .popover-arrow {
 | 
				
			||||||
 | 
					            border-color: $color;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    &[aria-hidden='true'] {
 | 
				
			||||||
 | 
					        visibility: hidden;
 | 
				
			||||||
 | 
					        opacity: 0;
 | 
				
			||||||
 | 
					        transition: opacity 0.15s, visibility 0.15s;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    &[aria-hidden='false'] {
 | 
				
			||||||
 | 
					        visibility: visible;
 | 
				
			||||||
 | 
					        opacity: 1;
 | 
				
			||||||
 | 
					        transition: opacity 0.15s;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,9 +1,13 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
    <label class="flex relative field-switch cursor-pointer" :for="id" :class="{
 | 
					    <label
 | 
				
			||||||
        'items-center flex-row-reverse space-x-3 space-x-reverse justify-end': inline,
 | 
					        class="flex relative field-switch cursor-pointer"
 | 
				
			||||||
        'flex-col': !inline,
 | 
					        :for="id"
 | 
				
			||||||
        [sizes[size].wrap]: true,
 | 
					        :class="{
 | 
				
			||||||
    }">
 | 
					            'items-center flex-row-reverse space-x-3 space-x-reverse justify-end': inline,
 | 
				
			||||||
 | 
					            'flex-col': !inline,
 | 
				
			||||||
 | 
					            [sizes[size].wrap]: true,
 | 
				
			||||||
 | 
					        }"
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
        <span
 | 
					        <span
 | 
				
			||||||
            v-if="label"
 | 
					            v-if="label"
 | 
				
			||||||
            class="font-semibold leading-none text-gray-400"
 | 
					            class="font-semibold leading-none text-gray-400"
 | 
				
			||||||
| 
						 | 
					@ -13,37 +17,20 @@
 | 
				
			||||||
            }"
 | 
					            }"
 | 
				
			||||||
            >{{ label }}</span
 | 
					            >{{ label }}</span
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
        <div class="relative inner-field mt-1" :class="`h-field-${fieldSize}`">
 | 
					        <div class="relative flex items-center inner-field mt-1" :class="`h-field-${fieldSize}`">
 | 
				
			||||||
            <input
 | 
					            <span>
 | 
				
			||||||
                :id="id"
 | 
					                <input :id="id" type="checkbox" :name="name" :value="value" v-model="v" :disabled="disabled" class="absolute peer" @keypress="$emit('keypress', $event)" />
 | 
				
			||||||
                type="checkbox"
 | 
					                <span class="relative cursor-pointer peer-focus:bg-red-500 flex grow display" :class="{'bg-switch': v === true, 'bg-gray-700': v === false}">
 | 
				
			||||||
                :name="name"
 | 
					                    <span><svg-sprite class="relative text-gray-400 flex-none" :class="{'w-2 h-2': size === 'sm' || size == 'xs', 'w-4 h-4': size === 'base'}" src="check"></svg-sprite></span>
 | 
				
			||||||
                :value="value"
 | 
					                    <span><svg-sprite class="relative text-gray-400 flex-none" :class="{'w-2 h-2': size === 'sm' || size == 'xs', 'w-4 h-4': size === 'base'}" src="close"></svg-sprite></span>
 | 
				
			||||||
                v-model="v"
 | 
					                    <var class="absolute overlay bg-gray-400 rounded top-0"></var>
 | 
				
			||||||
                :disabled="disabled"
 | 
					                </span>
 | 
				
			||||||
                class="absolute peer"
 | 
					 | 
				
			||||||
                @keypress="$emit('keypress', $event)"
 | 
					 | 
				
			||||||
            />
 | 
					 | 
				
			||||||
            <span
 | 
					 | 
				
			||||||
                class="relative cursor-pointer peer-focus:bg-red-500 flex grow display"
 | 
					 | 
				
			||||||
                :class="{'bg-switch': v === true, 'bg-gray-700': v === false}"
 | 
					 | 
				
			||||||
            >
 | 
					 | 
				
			||||||
                <span
 | 
					 | 
				
			||||||
                    ><svg-sprite
 | 
					 | 
				
			||||||
                        class="relative text-gray-400 flex-none"
 | 
					 | 
				
			||||||
                        :class="{'w-2 h-2': size === 'sm' || size == 'xs', 'w-4 h-4': size === 'base'}"
 | 
					 | 
				
			||||||
                        src="check"
 | 
					 | 
				
			||||||
                    ></svg-sprite
 | 
					 | 
				
			||||||
                ></span>
 | 
					 | 
				
			||||||
                <span
 | 
					 | 
				
			||||||
                    ><svg-sprite
 | 
					 | 
				
			||||||
                        class="relative text-gray-400 flex-none"
 | 
					 | 
				
			||||||
                        :class="{'w-2 h-2': size === 'sm' || size == 'xs', 'w-4 h-4': size === 'base'}"
 | 
					 | 
				
			||||||
                        src="close"
 | 
					 | 
				
			||||||
                    ></svg-sprite
 | 
					 | 
				
			||||||
                ></span>
 | 
					 | 
				
			||||||
                <var class="absolute overlay bg-gray-400 rounded top-0"></var>
 | 
					 | 
				
			||||||
            </span>
 | 
					            </span>
 | 
				
			||||||
 | 
					            <div v-if="hint" class="ml-2 info-wrap">
 | 
				
			||||||
 | 
					                <div v-tooltip="hint">
 | 
				
			||||||
 | 
					                    <svg-sprite src="info-button" class="info-button w-4 h-4 text-primary-700"></svg-sprite>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    </label>
 | 
					    </label>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
| 
						 | 
					@ -73,6 +60,9 @@ export default {
 | 
				
			||||||
        event: 'input',
 | 
					        event: 'input',
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    props: {
 | 
					    props: {
 | 
				
			||||||
 | 
					        hint: {
 | 
				
			||||||
 | 
					            default: null,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        inline: {
 | 
					        inline: {
 | 
				
			||||||
            default: false,
 | 
					            default: false,
 | 
				
			||||||
            type: Boolean,
 | 
					            type: Boolean,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -362,12 +362,6 @@ export default {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style scope>
 | 
					<style scope>
 | 
				
			||||||
.bg-inset {
 | 
					.bg-inset {
 | 
				
			||||||
    background: linear-gradient(
 | 
					    background: linear-gradient(to bottom, hsl(247.5, 66.7%, 97.6%) 0%, hsl(247.5, 66.7%, 97.6%) 41%, hsl(0deg 0% 100%) 41%, hsl(180deg 0% 100%) 100%);
 | 
				
			||||||
        to bottom,
 | 
					 | 
				
			||||||
        hsl(247.5, 66.7%, 97.6%) 0%,
 | 
					 | 
				
			||||||
        hsl(247.5, 66.7%, 97.6%) 41%,
 | 
					 | 
				
			||||||
        hsl(0deg 0% 100%) 41%,
 | 
					 | 
				
			||||||
        hsl(180deg 0% 100%) 100%
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,7 +21,8 @@
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
    props: {
 | 
					    props: {
 | 
				
			||||||
        only: {
 | 
					        only: {
 | 
				
			||||||
            required: true,
 | 
					            default: null,
 | 
				
			||||||
 | 
					            required: false,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        value: {
 | 
					        value: {
 | 
				
			||||||
            required: true,
 | 
					            required: true,
 | 
				
			||||||
| 
						 | 
					@ -33,6 +34,11 @@ export default {
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    methods: {
 | 
					    methods: {
 | 
				
			||||||
        goto(page) {
 | 
					        goto(page) {
 | 
				
			||||||
 | 
					            if (this.$listeners.reload) {
 | 
				
			||||||
 | 
					                this.$emit('reload', page.page);
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var params = new URLSearchParams(window.location.search);
 | 
					            var params = new URLSearchParams(window.location.search);
 | 
				
			||||||
            params.set('page', page.page);
 | 
					            params.set('page', page.page);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					    <div id="app" class="bg-gray-900 font-sans flex flex-col grow items-center justify-center">
 | 
				
			||||||
 | 
					        <v-notification class="fixed z-40 right-0 bottom-0 mb-3 mr-3"></v-notification>
 | 
				
			||||||
 | 
					        <div class="bg-gray-800 rounded-xl overflow-hidden shadow-lg p-6">
 | 
				
			||||||
 | 
					            <slot></slot>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					    components: {
 | 
				
			||||||
 | 
					        VNotification: () => import('../components/VNotification.vue'),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
| 
						 | 
					@ -1,37 +1,211 @@
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
    <page-layout>
 | 
					    <div>
 | 
				
			||||||
        <div class="p-6 grid h-full items-center justify-center">
 | 
					        <div v-if="step === 0">
 | 
				
			||||||
            <div class="rounded border-primary-700 border border-solid p-6">
 | 
					            <div class="prose prose-invert">
 | 
				
			||||||
                <div class="text-lg text-gray-200 text-sm">
 | 
					                <p>Willkommen im Adrema-Setup.<br /></p>
 | 
				
			||||||
                    Willkommen bei ScoutRobot.<br />
 | 
					                <p>
 | 
				
			||||||
                    Bitte gib deine Zugangsdaten ein,<br />
 | 
					                    Bitte gib deine NaMi-Zugangsdaten ein,<br />
 | 
				
			||||||
                    um eine erste Synchronisation durchzuführen.
 | 
					                    um eine erste Synchronisation durchzuführen.
 | 
				
			||||||
                </div>
 | 
					                </p>
 | 
				
			||||||
                <form @submit.prevent="submit" class="grid gap-3 mt-5">
 | 
					 | 
				
			||||||
                    <f-text v-model="values.mglnr" label="Mitgliedsnummer" name="mglnr" id="mglnr"></f-text>
 | 
					 | 
				
			||||||
                    <f-text v-model="values.password" type="password" label="Passwort" name="password" id="password"></f-text>
 | 
					 | 
				
			||||||
                    <f-text v-model="values.group_id" label="Gruppierungsnummer" name="group_id" id="group_id"></f-text>
 | 
					 | 
				
			||||||
                    <button type="submit" class="btn w-full btn-primary mt-6 inline-block">Jetzt initialisieren</button>
 | 
					 | 
				
			||||||
                </form>
 | 
					 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
 | 
					            <form @submit.prevent="check" class="grid gap-3 mt-5">
 | 
				
			||||||
 | 
					                <f-text v-model="values.mglnr" label="Mitgliedsnummer" name="mglnr" id="mglnr" type="tel" required></f-text>
 | 
				
			||||||
 | 
					                <f-text v-model="values.password" type="password" label="Passwort" name="password" id="password" required></f-text>
 | 
				
			||||||
 | 
					                <button type="submit" class="btn w-full btn-primary mt-6 inline-block">Weiter</button>
 | 
				
			||||||
 | 
					            </form>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    </page-layout>
 | 
					        <div v-if="step === 1" class="flex flex-col" style="width: 90vw; height: 90vh">
 | 
				
			||||||
 | 
					            <form @submit.prevent="storeSearch" class="border-2 border-primary-700 border-solid p-3 rounded-lg grid grid-cols-3 gap-3 flex-none">
 | 
				
			||||||
 | 
					                <div class="prose prose-invert max-w-none col-span-full">
 | 
				
			||||||
 | 
					                    <p>
 | 
				
			||||||
 | 
					                        Lege hier die Suchkriterien für den Abruf der Mitglieder-Daten fest. Mit diesen Suchkriterien wird im Anschluss eine Mitgliedersuche in NaMi durchgeführt. Alle Mitglieder, die
 | 
				
			||||||
 | 
					                        dann dort auftauchen werden in die Adrema übernommen. Dir wird hier eine Vorschau eingeblendet, damit du sicherstellen kannst, dass die Suchkriterien die richtigen sind.
 | 
				
			||||||
 | 
					                    </p>
 | 
				
			||||||
 | 
					                    <p>
 | 
				
			||||||
 | 
					                        Außerdem werden diese Suchkriterien bei jedem neuen Abgleich (der automatisch täglich erfolgt) angewendet. Du kannst die Suchkriterien in den globalen Einstellungen jederzeit
 | 
				
			||||||
 | 
					                        ändern.
 | 
				
			||||||
 | 
					                    </p>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					                <f-text
 | 
				
			||||||
 | 
					                    v-model="values.params.gruppierung1Id"
 | 
				
			||||||
 | 
					                    label="Diözesan-Gruppierung"
 | 
				
			||||||
 | 
					                    name="gruppierung1Id"
 | 
				
			||||||
 | 
					                    id="gruppierung1Id"
 | 
				
			||||||
 | 
					                    type="tel"
 | 
				
			||||||
 | 
					                    size="sm"
 | 
				
			||||||
 | 
					                    @input="search"
 | 
				
			||||||
 | 
					                    hint="Gruppierungs-Nummer einer Diözese, auf die die Mitglieder passen sollen. I.d.R. ist das die Gruppierungsnummer deiner Diözese. Entspricht dem Feld '1. Ebene' in der NaMi Suche."
 | 
				
			||||||
 | 
					                ></f-text>
 | 
				
			||||||
 | 
					                <f-text
 | 
				
			||||||
 | 
					                    v-model="values.params.gruppierung2Id"
 | 
				
			||||||
 | 
					                    label="Bezirks-Gruppierung"
 | 
				
			||||||
 | 
					                    name="gruppierung2Id"
 | 
				
			||||||
 | 
					                    id="gruppierung2Id"
 | 
				
			||||||
 | 
					                    type="tel"
 | 
				
			||||||
 | 
					                    hint="Gruppierungs-Nummer eines Bezirks, auf die die Mitglieder passen sollen. I.d.R. ist das die Gruppierungsnummer deines Bezirks. Entspricht dem Feld '2. Ebene' in der NaMi Suche. Fülle dieses Feld aus, um Mitglieder auf einen bestimmten Bezirk zu begrenzen."
 | 
				
			||||||
 | 
					                    :disabled="!values.params.gruppierung1Id"
 | 
				
			||||||
 | 
					                    @input="search"
 | 
				
			||||||
 | 
					                    size="sm"
 | 
				
			||||||
 | 
					                ></f-text>
 | 
				
			||||||
 | 
					                <f-text
 | 
				
			||||||
 | 
					                    v-model="values.params.gruppierung3Id"
 | 
				
			||||||
 | 
					                    label="Stammes-Gruppierung"
 | 
				
			||||||
 | 
					                    name="gruppierung3Id"
 | 
				
			||||||
 | 
					                    id="gruppierung3Id"
 | 
				
			||||||
 | 
					                    type="tel"
 | 
				
			||||||
 | 
					                    size="sm"
 | 
				
			||||||
 | 
					                    @input="search"
 | 
				
			||||||
 | 
					                    hint="Gruppierungs-Nummer deines Stammes, auf die die Mitglieder passen sollen. I.d.R. ist das die Gruppierungsnummer deines Stammes. Entspricht dem Feld '3. Ebene' in der NaMi Suche. Fülle dieses Feld aus, um Mitglieder auf einen bestimmten Stamm zu beschränken."
 | 
				
			||||||
 | 
					                    :disabled="!values.params.gruppierung1Id || !values.params.gruppierung2Id"
 | 
				
			||||||
 | 
					                ></f-text>
 | 
				
			||||||
 | 
					                <f-select
 | 
				
			||||||
 | 
					                    v-model="values.params.mglStatusId"
 | 
				
			||||||
 | 
					                    label="Mitglieds-Status"
 | 
				
			||||||
 | 
					                    name="mglStatusId"
 | 
				
			||||||
 | 
					                    id="mglStatusId"
 | 
				
			||||||
 | 
					                    size="sm"
 | 
				
			||||||
 | 
					                    @input="search"
 | 
				
			||||||
 | 
					                    :options="states"
 | 
				
			||||||
 | 
					                    hint="Wähle hier etwas aus, um nur aktive oder nur inaktive Mitglieder zu synchronisieren. Wir empfehlen dir, dies so zu belassen und Mitglieder ohne 'Datenweiterverwendung' gänzlich zu löschen, um Karteileichen zu entfernen."
 | 
				
			||||||
 | 
					                ></f-select>
 | 
				
			||||||
 | 
					                <f-switch
 | 
				
			||||||
 | 
					                    v-model="values.params.inGrp"
 | 
				
			||||||
 | 
					                    label="In Gruppierung suchen"
 | 
				
			||||||
 | 
					                    name="inGrp"
 | 
				
			||||||
 | 
					                    id="inGrp"
 | 
				
			||||||
 | 
					                    @input="search"
 | 
				
			||||||
 | 
					                    hint="Mitglieder finden, die direktes Mitglied in der kleinsten befüllten Gruppierung sind."
 | 
				
			||||||
 | 
					                    size="sm"
 | 
				
			||||||
 | 
					                ></f-switch>
 | 
				
			||||||
 | 
					                <f-switch
 | 
				
			||||||
 | 
					                    v-model="values.params.unterhalbGrp"
 | 
				
			||||||
 | 
					                    label="Unterhalb Gruppierung suchen"
 | 
				
			||||||
 | 
					                    name="unterhalbGrp"
 | 
				
			||||||
 | 
					                    id="unterhalbGrp"
 | 
				
			||||||
 | 
					                    @input="search"
 | 
				
			||||||
 | 
					                    hint="Mitglieder finden, die direktes Mitglied in einer Untergruppe der kleinsten befüllten Gruppierung sind."
 | 
				
			||||||
 | 
					                    size="sm"
 | 
				
			||||||
 | 
					                ></f-switch>
 | 
				
			||||||
 | 
					                <div class="col-span-full">
 | 
				
			||||||
 | 
					                    <button type="submit" class="btn btn-primary btn-sm">Weiter</button>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </form>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <section class="grow border-2 border-primary-700 border-solid p-3 rounded-lg mt-4" v-if="preview !== null && preview.data.length">
 | 
				
			||||||
 | 
					                <table cellspacing="0" cellpadding="0" border="0" class="custom-table custom-table-sm hidden md:table">
 | 
				
			||||||
 | 
					                    <thead>
 | 
				
			||||||
 | 
					                        <th>GruppierungsNr</th>
 | 
				
			||||||
 | 
					                        <th>MitgliedsNr</th>
 | 
				
			||||||
 | 
					                        <th>Nachname</th>
 | 
				
			||||||
 | 
					                        <th>Vorname</th>
 | 
				
			||||||
 | 
					                        <th>Geburtsdatum</th>
 | 
				
			||||||
 | 
					                    </thead>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    <tr v-for="(member, index) in preview.data" :key="index">
 | 
				
			||||||
 | 
					                        <td v-text="member.groupId"></td>
 | 
				
			||||||
 | 
					                        <td v-text="member.memberId"></td>
 | 
				
			||||||
 | 
					                        <td v-text="member.lastname"></td>
 | 
				
			||||||
 | 
					                        <td v-text="member.firstname"></td>
 | 
				
			||||||
 | 
					                        <td v-text="member.birthday_human"></td>
 | 
				
			||||||
 | 
					                    </tr>
 | 
				
			||||||
 | 
					                </table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <div v-if="preview !== null" class="px-6">
 | 
				
			||||||
 | 
					                    <v-pages class="mt-4" :value="preview" @reload="reloadPage"></v-pages>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					            </section>
 | 
				
			||||||
 | 
					            <section class="grow items-center justify-center flex text-xl text-gray-200 border-2 border-primary-700 border-solid p-3 rounded-lg mt-4" v-else>Keine Mitglieder gefunden</section>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					        <div v-if="step === 2">
 | 
				
			||||||
 | 
					            <div class="prose prose-invert">
 | 
				
			||||||
 | 
					                <p>Bitte gib hier deine Standard-Gruppierungsnummer ein.</p>
 | 
				
			||||||
 | 
					                <p>Dieser Gruppierung werden Mitglieder automatisch zugeordnet,<br />falls nichts anderes angegeben wurde.</p>
 | 
				
			||||||
 | 
					                <p>I.d.R. ist das z.B. die Nummer deines Stammes, wenn du als StaVo mit Adrema Daten verwaltest.</p>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <form @submit.prevent="submit" class="grid gap-3 mt-5">
 | 
				
			||||||
 | 
					                <f-text v-model="values.group_id" label="Gruppierungs-Nummer" name="groupId" id="groupId" type="tel" required></f-text>
 | 
				
			||||||
 | 
					                <button type="submit" class="btn w-full btn-primary mt-6 inline-block">Weiter</button>
 | 
				
			||||||
 | 
					            </form>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					        <div v-if="step === 3">
 | 
				
			||||||
 | 
					            <div class="prose prose-invert">
 | 
				
			||||||
 | 
					                <p>Wir werden nun die Mitgliederdaten anhand deiner festgelegten Kriterien abrufen.</p>
 | 
				
			||||||
 | 
					                <p>Per Klick auf "Abschließen" gelangst du zum Dashboard</p>
 | 
				
			||||||
 | 
					                <p>Viel Spaß mit Adrema</p>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <a href="/" class="mt-5 inline-block btn btn-primary">Abschließen</a>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
 | 
					import InstallLayout from '../../layouts/InstallLayout.vue';
 | 
				
			||||||
 | 
					import hasFlash from '../../mixins/hasFlash.js';
 | 
				
			||||||
 | 
					import debounce from 'lodash/debounce';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
 | 
					    layout: InstallLayout,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mixins: [hasFlash],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    data: function () {
 | 
					    data: function () {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
 | 
					            preview: null,
 | 
				
			||||||
 | 
					            states: [
 | 
				
			||||||
 | 
					                {id: 'INAKTIV', name: 'Inaktiv'},
 | 
				
			||||||
 | 
					                {id: 'AKTIV', name: 'Aktiv'},
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            step: 0,
 | 
				
			||||||
            values: {
 | 
					            values: {
 | 
				
			||||||
                mglnr: '',
 | 
					                mglnr: '',
 | 
				
			||||||
                password: '',
 | 
					                password: '',
 | 
				
			||||||
                group_id: '',
 | 
					                group_id: '',
 | 
				
			||||||
 | 
					                params: {
 | 
				
			||||||
 | 
					                    mglStatusId: 'AKTIV',
 | 
				
			||||||
 | 
					                    gruppierung1Id: '',
 | 
				
			||||||
 | 
					                    gruppierung2Id: '',
 | 
				
			||||||
 | 
					                    gruppierung3Id: '',
 | 
				
			||||||
 | 
					                    inGrp: true,
 | 
				
			||||||
 | 
					                    unterhalbGrp: true,
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    methods: {
 | 
					    methods: {
 | 
				
			||||||
        submit() {
 | 
					        async submit() {
 | 
				
			||||||
            this.$inertia.post('/initialize', this.values);
 | 
					            try {
 | 
				
			||||||
 | 
					                await this.axios.post('/initialize', this.values);
 | 
				
			||||||
 | 
					                this.step = 3;
 | 
				
			||||||
 | 
					            } catch (e) {
 | 
				
			||||||
 | 
					                this.errorsFromException(e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        async storeSearch() {
 | 
				
			||||||
 | 
					            this.values.group_id = this.values.params.gruppierung3Id ? this.values.params.gruppierung3Id : this.values.params.gruppierung2Id;
 | 
				
			||||||
 | 
					            this.step = 2;
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        async reloadPage(page) {
 | 
				
			||||||
 | 
					            await this.loadSearchResult(page);
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        async check() {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                await this.axios.post('/nami/login-check', this.values);
 | 
				
			||||||
 | 
					                this.step = 1;
 | 
				
			||||||
 | 
					                await this.loadSearchResult(1);
 | 
				
			||||||
 | 
					            } catch (e) {
 | 
				
			||||||
 | 
					                this.errorsFromException(e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        search: debounce(async function () {
 | 
				
			||||||
 | 
					            await this.loadSearchResult(1);
 | 
				
			||||||
 | 
					        }, 500),
 | 
				
			||||||
 | 
					        async loadSearchResult(page) {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                var result = await this.axios.post('/nami/search', {...this.values, page: page});
 | 
				
			||||||
 | 
					                this.preview = result.data;
 | 
				
			||||||
 | 
					            } catch (e) {
 | 
				
			||||||
 | 
					                this.errorsFromException(e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,6 +17,8 @@ use App\Dashboard\Actions\IndexAction as DashboardIndexAction;
 | 
				
			||||||
use App\Efz\ShowEfzDocumentAction;
 | 
					use App\Efz\ShowEfzDocumentAction;
 | 
				
			||||||
use App\Initialize\Actions\InitializeAction;
 | 
					use App\Initialize\Actions\InitializeAction;
 | 
				
			||||||
use App\Initialize\Actions\InitializeFormAction;
 | 
					use App\Initialize\Actions\InitializeFormAction;
 | 
				
			||||||
 | 
					use App\Initialize\Actions\NamiLoginCheckAction;
 | 
				
			||||||
 | 
					use App\Initialize\Actions\NamiSearchAction;
 | 
				
			||||||
use App\Member\Actions\ExportAction;
 | 
					use App\Member\Actions\ExportAction;
 | 
				
			||||||
use App\Member\Actions\MemberResyncAction;
 | 
					use App\Member\Actions\MemberResyncAction;
 | 
				
			||||||
use App\Member\Actions\MemberShowAction;
 | 
					use App\Member\Actions\MemberShowAction;
 | 
				
			||||||
| 
						 | 
					@ -38,6 +40,8 @@ Route::group(['namespace' => 'App\\Http\\Controllers'], function (): void {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Route::group(['middleware' => 'auth:web'], function (): void {
 | 
					Route::group(['middleware' => 'auth:web'], function (): void {
 | 
				
			||||||
    Route::get('/', DashboardIndexAction::class)->name('home');
 | 
					    Route::get('/', DashboardIndexAction::class)->name('home');
 | 
				
			||||||
 | 
					    Route::post('/nami/login-check', NamiLoginCheckAction::class)->name('nami.login-check');
 | 
				
			||||||
 | 
					    Route::post('/nami/search', NamiSearchAction::class)->name('nami.search');
 | 
				
			||||||
    Route::post('/api/member/search', SearchAction::class)->name('member.search');
 | 
					    Route::post('/api/member/search', SearchAction::class)->name('member.search');
 | 
				
			||||||
    Route::get('/initialize', InitializeFormAction::class)->name('initialize.form');
 | 
					    Route::get('/initialize', InitializeFormAction::class)->name('initialize.form');
 | 
				
			||||||
    Route::post('/initialize', InitializeAction::class)->name('initialize.store');
 | 
					    Route::post('/initialize', InitializeAction::class)->name('initialize.store');
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,7 @@
 | 
				
			||||||
const {colors} = require('tailwindcss/defaultTheme');
 | 
					const {colors} = require('tailwindcss/defaultTheme');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = {
 | 
					module.exports = {
 | 
				
			||||||
    content: [
 | 
					    content: ['resources/js/views/**/*.vue', 'resources/js/components/**/*.vue', 'resources/js/layouts/**/*.vue', 'resources/views/**/*.blade.php'],
 | 
				
			||||||
        'resources/js/views/**/*.vue',
 | 
					 | 
				
			||||||
        'resources/js/components/**/*.vue',
 | 
					 | 
				
			||||||
        'resources/js/layouts/**/*.vue',
 | 
					 | 
				
			||||||
        'resources/views/**/*.blade.php',
 | 
					 | 
				
			||||||
    ],
 | 
					 | 
				
			||||||
    theme: {
 | 
					    theme: {
 | 
				
			||||||
        extend: {
 | 
					        extend: {
 | 
				
			||||||
            colors: {
 | 
					            colors: {
 | 
				
			||||||
| 
						 | 
					@ -30,4 +25,6 @@ module.exports = {
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    plugins: [require('@tailwindcss/typography')],
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,10 +5,10 @@ namespace Tests\Feature\Initialize;
 | 
				
			||||||
use App\Initialize\Actions\InitializeAction;
 | 
					use App\Initialize\Actions\InitializeAction;
 | 
				
			||||||
use App\Setting\NamiSettings;
 | 
					use App\Setting\NamiSettings;
 | 
				
			||||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
 | 
					use Illuminate\Foundation\Testing\DatabaseTransactions;
 | 
				
			||||||
 | 
					use Illuminate\Support\Facades\Queue;
 | 
				
			||||||
use Tests\RequestFactories\InitializeRequestFactory;
 | 
					use Tests\RequestFactories\InitializeRequestFactory;
 | 
				
			||||||
use Tests\TestCase;
 | 
					use Tests\TestCase;
 | 
				
			||||||
use Zoomyboy\LaravelNami\Authentication\Auth;
 | 
					use Zoomyboy\LaravelNami\Authentication\Auth;
 | 
				
			||||||
use Zoomyboy\LaravelNami\Fakes\GroupFake;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class InitializeActionTest extends TestCase
 | 
					class InitializeActionTest extends TestCase
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -23,22 +23,6 @@ class InitializeActionTest extends TestCase
 | 
				
			||||||
        $response->assertRedirect('/login');
 | 
					        $response->assertRedirect('/login');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function testItSetsSettingsBeforeRunningInitializer(): void
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        $this->withoutExceptionHandling()->login();
 | 
					 | 
				
			||||||
        InitializeAction::partialMock()->shouldReceive('handle')->andReturn(true);
 | 
					 | 
				
			||||||
        Auth::success(12345, 'secret');
 | 
					 | 
				
			||||||
        app(GroupFake::class)->fetches(null, [185 => ['name' => 'testgroup']]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        $response = $this->post('/initialize', $this->factory()->withCredentials(12345, 'secret')->withGroup(185)->create());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        $response->assertRedirect('/');
 | 
					 | 
				
			||||||
        $settings = app(NamiSettings::class);
 | 
					 | 
				
			||||||
        $this->assertEquals(12345, $settings->mglnr);
 | 
					 | 
				
			||||||
        $this->assertEquals('secret', $settings->password);
 | 
					 | 
				
			||||||
        $this->assertEquals(185, $settings->default_group_id);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public function testItValidatesSetupInfo(): void
 | 
					    public function testItValidatesSetupInfo(): void
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $this->login();
 | 
					        $this->login();
 | 
				
			||||||
| 
						 | 
					@ -59,15 +43,20 @@ class InitializeActionTest extends TestCase
 | 
				
			||||||
        $this->assertErrors(['nami' => 'NaMi Login fehlgeschlagen.'], $response);
 | 
					        $this->assertErrors(['nami' => 'NaMi Login fehlgeschlagen.'], $response);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function testItValidatesGroupExistance(): void
 | 
					    public function testItSetsSettings(): void
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        Queue::fake();
 | 
				
			||||||
 | 
					        Auth::success(100222, 'secret');
 | 
				
			||||||
        $this->login();
 | 
					        $this->login();
 | 
				
			||||||
        Auth::success(12345, 'secret');
 | 
					 | 
				
			||||||
        app(GroupFake::class)->fetches(null, []);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $response = $this->post('/initialize', $this->factory()->withCredentials(12345, 'secret')->withGroup(185)->create());
 | 
					        $response = $this->post('/initialize', $this->factory()->withCredentials(100222, 'secret')->withGroup(77)->withParams(['gruppierung1Id' => '66777'])->create());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $this->assertErrors(['nami' => 'Gruppierung nicht gefunden.'], $response);
 | 
					        $response->assertRedirect('/');
 | 
				
			||||||
 | 
					        $settings = app(NamiSettings::class);
 | 
				
			||||||
 | 
					        $this->assertEquals(100222, $settings->mglnr);
 | 
				
			||||||
 | 
					        $this->assertEquals('secret', $settings->password);
 | 
				
			||||||
 | 
					        $this->assertEquals(77, $settings->default_group_id);
 | 
				
			||||||
 | 
					        $this->assertEquals('66777', $settings->search_params['gruppierung1Id']);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private function factory(): InitializeRequestFactory
 | 
					    private function factory(): InitializeRequestFactory
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,7 @@ class InitializeMembersTest extends TestCase
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $this->loginNami();
 | 
					        $this->loginNami();
 | 
				
			||||||
        $api = app(NamiSettings::class)->login();
 | 
					        $api = app(NamiSettings::class)->login();
 | 
				
			||||||
        app(SearchFake::class)->fetches(1, 0, [
 | 
					        app(SearchFake::class)->fetches(1, 0, 100, [
 | 
				
			||||||
            MemberEntry::factory()->toMember(['groupId' => 100, 'id' => 20]),
 | 
					            MemberEntry::factory()->toMember(['groupId' => 100, 'id' => 20]),
 | 
				
			||||||
        ]);
 | 
					        ]);
 | 
				
			||||||
        FullMemberAction::shouldRun()->once()->shouldReceive('configureJob');
 | 
					        FullMemberAction::shouldRun()->once()->shouldReceive('configureJob');
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,7 @@ class InitializeMembersTest extends TestCase
 | 
				
			||||||
    public function testFetchesMembersViaCommandLine(): void
 | 
					    public function testFetchesMembersViaCommandLine(): void
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $this->loginNami();
 | 
					        $this->loginNami();
 | 
				
			||||||
        app(SearchFake::class)->fetches(1, 0, [
 | 
					        app(SearchFake::class)->fetches(1, 0, 100, [
 | 
				
			||||||
            MemberEntry::factory()->toMember(['groupId' => 100, 'id' => 20]),
 | 
					            MemberEntry::factory()->toMember(['groupId' => 100, 'id' => 20]),
 | 
				
			||||||
        ]);
 | 
					        ]);
 | 
				
			||||||
        FullMemberAction::shouldRun()->once()->shouldReceive('configureJob');
 | 
					        FullMemberAction::shouldRun()->once()->shouldReceive('configureJob');
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,94 @@
 | 
				
			||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Tests\Feature\Initializer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Illuminate\Foundation\Testing\DatabaseTransactions;
 | 
				
			||||||
 | 
					use Tests\TestCase;
 | 
				
			||||||
 | 
					use Zoomyboy\LaravelNami\Authentication\Auth;
 | 
				
			||||||
 | 
					use Zoomyboy\LaravelNami\Data\MemberEntry;
 | 
				
			||||||
 | 
					use Zoomyboy\LaravelNami\Fakes\SearchFake;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SearchTest extends TestCase
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    use DatabaseTransactions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function setUp(): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        parent::setUp();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->login();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testItSearchesForMembers(): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->withoutExceptionHandling();
 | 
				
			||||||
 | 
					        app(SearchFake::class)->fetches(1, 0, 10, [
 | 
				
			||||||
 | 
					            MemberEntry::factory()->state(['id' => 2, 'groupId' => 100, 'firstname' => 'Max', 'lastname' => 'Muster', 'birthday' => '2013-07-04 00:00:00'])->toMember(),
 | 
				
			||||||
 | 
					            MemberEntry::factory()->state(['id' => 2, 'groupId' => 150, 'firstname' => 'Jane', 'lastname' => 'Muster', 'birthday' => '2013-07-04 00:00:00'])->toMember(),
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					        Auth::success(333, 'secret');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $repsonse = $this->postJson('/nami/search', [
 | 
				
			||||||
 | 
					            'params' => [
 | 
				
			||||||
 | 
					                'gruppierung1Id' => 100,
 | 
				
			||||||
 | 
					                'gruppierung2Id' => 101,
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            'mglnr' => 333,
 | 
				
			||||||
 | 
					            'password' => 'secret',
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $repsonse->assertOk();
 | 
				
			||||||
 | 
					        $repsonse->assertJsonPath('data.0.birthday_human', '04.07.2013');
 | 
				
			||||||
 | 
					        $repsonse->assertJsonPath('data.0.firstname', 'Max');
 | 
				
			||||||
 | 
					        $repsonse->assertJsonPath('data.0.lastname', 'Muster');
 | 
				
			||||||
 | 
					        $repsonse->assertJsonPath('data.0.id', 2);
 | 
				
			||||||
 | 
					        $repsonse->assertJsonPath('data.0.groupId', 100);
 | 
				
			||||||
 | 
					        app(SearchFake::class)->assertFetched(1, 0, 10, [
 | 
				
			||||||
 | 
					            'gruppierung1Id' => 100,
 | 
				
			||||||
 | 
					            'gruppierung2Id' => 101,
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testItDoesntNeedFirstname(): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->withoutExceptionHandling();
 | 
				
			||||||
 | 
					        app(SearchFake::class)->fetches(1, 0, 10, [
 | 
				
			||||||
 | 
					            MemberEntry::factory()->noFirstname()->toMember(),
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					        Auth::success(333, 'secret');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->postJson('/nami/search', [
 | 
				
			||||||
 | 
					            'params' => [],
 | 
				
			||||||
 | 
					            'mglnr' => 333,
 | 
				
			||||||
 | 
					            'password' => 'secret',
 | 
				
			||||||
 | 
					            'birthday_human' => null,
 | 
				
			||||||
 | 
					            'agegroup' => null,
 | 
				
			||||||
 | 
					        ])->assertJsonPath('data.0.firstname', null);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testItGetsPageInformation(): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->withoutExceptionHandling();
 | 
				
			||||||
 | 
					        app(SearchFake::class)->fetches(2, 10, 10, [
 | 
				
			||||||
 | 
					            MemberEntry::factory()->toMember(),
 | 
				
			||||||
 | 
					            MemberEntry::factory()->toMember(),
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					        Auth::success(333, 'secret');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $response = $this->postJson('/nami/search', [
 | 
				
			||||||
 | 
					            'params' => [
 | 
				
			||||||
 | 
					                'gruppierung1Id' => 100,
 | 
				
			||||||
 | 
					                'gruppierung2Id' => 101,
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            'page' => 2,
 | 
				
			||||||
 | 
					            'mglnr' => 333,
 | 
				
			||||||
 | 
					            'password' => 'secret',
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $response->assertOk();
 | 
				
			||||||
 | 
					        app(SearchFake::class)->assertFetched(2, 10, 10, [
 | 
				
			||||||
 | 
					            'gruppierung1Id' => 100,
 | 
				
			||||||
 | 
					            'gruppierung2Id' => 101,
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,53 @@
 | 
				
			||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Tests\Feature\Initializer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use Illuminate\Foundation\Testing\DatabaseTransactions;
 | 
				
			||||||
 | 
					use Tests\TestCase;
 | 
				
			||||||
 | 
					use Zoomyboy\LaravelNami\Authentication\Auth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ValidateLoginTest extends TestCase
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    use DatabaseTransactions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function setUp(): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        parent::setUp();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->login();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testItValidatesLogin(): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        Auth::success(333, 'secret');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->postJson('/nami/login-check', [
 | 
				
			||||||
 | 
					            'mglnr' => 333,
 | 
				
			||||||
 | 
					            'password' => 'secret',
 | 
				
			||||||
 | 
					        ])->assertStatus(204);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testItNeedsPasswordAndMglnr(): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->postJson('/nami/login-check', [
 | 
				
			||||||
 | 
					            'mglnr' => '',
 | 
				
			||||||
 | 
					            'password' => '',
 | 
				
			||||||
 | 
					        ])->assertJsonValidationErrors(['mglnr', 'password']);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testMglnrShouldBeNumeric(): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->postJson('/nami/login-check', [
 | 
				
			||||||
 | 
					            'mglnr' => 'aaa',
 | 
				
			||||||
 | 
					            'password' => 'secret',
 | 
				
			||||||
 | 
					        ])->assertJsonValidationErrors(['mglnr']);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function testLoginCanFail(): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->postJson('/nami/login-check', [
 | 
				
			||||||
 | 
					            'mglnr' => '111',
 | 
				
			||||||
 | 
					            'password' => 'secret',
 | 
				
			||||||
 | 
					        ])->assertJsonValidationErrors(['nami' => 'NaMi Login fehlgeschlagen.']);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -9,9 +9,16 @@ class InitializeRequestFactory extends RequestFactory
 | 
				
			||||||
    public function definition(): array
 | 
					    public function definition(): array
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return [
 | 
					        return [
 | 
				
			||||||
            'group_id' => $this->faker->numberBetween(100, 200),
 | 
					            'group_id' => (string) $this->faker->numberBetween(100, 200),
 | 
				
			||||||
            'password' => $this->faker->word(),
 | 
					            'password' => $this->faker->word(),
 | 
				
			||||||
            'mglnr' => $this->faker->numberBetween(100, 200),
 | 
					            'mglnr' => (string) $this->faker->numberBetween(100, 200),
 | 
				
			||||||
 | 
					            'params' => [
 | 
				
			||||||
 | 
					                'gruppierung1Id' => $this->faker->numberBetween(100000, 200000),
 | 
				
			||||||
 | 
					                'gruppierung2Id' => $this->faker->numberBetween(100000, 200000),
 | 
				
			||||||
 | 
					                'gruppierung3Id' => $this->faker->numberBetween(100000, 200000),
 | 
				
			||||||
 | 
					                'inGrp' => $this->faker->boolean(),
 | 
				
			||||||
 | 
					                'unterhalbGrp' => $this->faker->boolean(),
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,6 +39,16 @@ class InitializeRequestFactory extends RequestFactory
 | 
				
			||||||
        ]);
 | 
					        ]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param array<string, string|int|bool> $params
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function withParams(array $params): self
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return $this->state([
 | 
				
			||||||
 | 
					            'params' => $params,
 | 
				
			||||||
 | 
					        ]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function withGroup(int $group): self
 | 
					    public function withGroup(int $group): self
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return $this->state([
 | 
					        return $this->state([
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue