figure out font rendering and selection

This commit is contained in:
Ronja 2020-02-20 21:12:55 +01:00
parent 3f730301fe
commit 2d597906ae
27 changed files with 207 additions and 294 deletions

BIN
Mockup.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -5,19 +5,7 @@
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
html, body {
margin: 0;
padding: 0;
}
canvas {
image-rendering: -moz-crisp-edges;
image-rendering: -webkit-crisp-edges;
image-rendering: pixelated;
image-rendering: crisp-edges;
}
</style>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
</body>

View file

@ -9,11 +9,6 @@ export class Name extends Component{
return `${this.first} ${this.last}`
}
copy(values: any){
if(values.first)
this.first = values?.first
}
reset(){
this.first = "firstname"
this.last = "lastname"

View file

@ -4,11 +4,13 @@ import { Vector } from "../../Datatypes/vector";
//todo: consider making this a systemstatecomponent so system order isn't as critical for removing sprites
export class SpriteRenderer extends Component{
texture: Texture
offset: Vector
texture = <Texture>null
offset = new Vector(0)
scale = 1 //todo: remove when all textures have the correct size!
reset() :void {
this.texture = null
this.offset = new Vector(0, 0)
this.scale = 1
}
}

View file

@ -0,0 +1,27 @@
export class Observable<T>{
value: T
listeners: ((value:T)=>void)[]
constructor(value?:T){
this.value = value || null
this.listeners = []
}
set(value: T){
this.value = value
for(let listener of this.listeners){
listener(value)
}
}
onChange(listener: (value:T)=>void):void{
this.listeners.push(listener)
}
removeAllListeners(listener: (value:T)=>void):void{
this.listeners = []
}
}

View file

@ -11,7 +11,9 @@ export class Point implements IPoint{
x: number
y: number
constructor(x: number, y: number){
constructor(x: number, y?: number){
if(y === undefined)
y = x
this.x = x
this.y = y
}

View file

@ -5,7 +5,9 @@ export class Vector implements IPoint{
x: number
y: number
constructor(x: number, y: number){
constructor(x: number, y?: number){
if(y===undefined)
y = x
this.x = x
this.y = y
}

View file

@ -2,10 +2,23 @@ import { System, Entity, Not } from "ecsy"
import { PixiRepresentation } from "../Components/rendering/pixiRepresentation";
import { Clickable } from "../Components/clickable";
import { InitializedClickable } from "../Components/initializedClickable";
import globals from "../globals";
import { interaction } from "pixi.js";
export class ClickableSystem extends System {
priority = 80
init(){
globals.app.stage.interactive = true
globals.app.stage.on("click",
(event:interaction.InteractionEvent) => {
if(event.target == event.currentTarget)
globals.selected.set(null)
})
}
// This method will get called on every frame by default
execute(delta : number) {
// Iterate through all the entities on the query

View file

@ -14,7 +14,7 @@ export class DoorSystem extends System {
let doorOffset: IPoint = door.open ? door.openOffset : door.closedOffset
let doorTex: Texture = door.open ? door.openTex : door.closedTex
entity.addComponent(SpriteRenderer, <SpriteRenderer>{texture: doorTex, offset: doorOffset})
entity.addComponent(SpriteRenderer, <SpriteRenderer>{texture: doorTex, offset: doorOffset, scale:2})
})
this.queries.changedDoors.changed.forEach((entity: Entity) => {

View file

@ -0,0 +1,50 @@
import { Human } from "../Components/human";
import { Container, DisplayObject, Text } from "pixi.js";
import { AABB } from "../Datatypes/aabb";
import { System, Entity } from "ecsy";
import globals from "../globals";
import { Name } from "../Components/name";
// MovableSystem
export class InfoSystem extends System {
priority = 80
dirty: boolean
root: Container
elements: {[id: string]:DisplayObject} = {}
init(){
globals.selected.onChange(_ => this.dirty = true)
//todo: make this more flexible for other resolutions
let bounds = new AABB(0, 162, 162, 126)
this.root = globals.app.stage.addChild(new Container())
this.root.position = bounds.min()
this.root.width = bounds.size.x
this.root.height = bounds.size.y
let name = new Text('Name: ',{fontFamily : 'babyblocks', fontSize: 8, fill : 0xffffff});
name.x = 2
this.root.addChild(name)
this.elements.name = name
globals.selected.onChange(selected => this.select(selected))
}
execute(delta : number) {
}
select(entity: Entity){
(this.elements.name as Text).text = `Name: ${entity?.getComponent(Name)?.fullName() || "-"}`
}
static queries = {
UIComponent: {
components: [ Human ]
},
}
queries: any;
}

View file

@ -15,7 +15,7 @@ export class VisibleHumanSystem extends System {
// add sprite at start
this.queries.newHumans.results.forEach((entity: Entity) => {
let texture = entity.getComponent(Appearance).idleTexture
entity.addComponent(SpriteRenderer, <SpriteRenderer>{texture: texture, offset: new Vector(-texture.width/2, -texture.height)})
entity.addComponent(SpriteRenderer, <SpriteRenderer>{texture: texture, offset: new Vector(-texture.width/2, -texture.height), scale:2})
})
//update sprite texture
this.queries.visibleHumans.changed.forEach((entity: Entity) => {

View file

@ -3,6 +3,7 @@ import { Not, Entity, System } from "ecsy";
import { DebugRect } from "../../Components/rendering/debugRect";
import { SpriteRenderer } from "../../Components/rendering/spriteRenderer";
import globals from "../../globals";
import { DebugLine } from "../../Components/rendering/debugLine";
export class PixiCleanupSystem extends System {
@ -21,7 +22,7 @@ export class PixiCleanupSystem extends System {
static queries = {
oldRepresentations: {
// add all draw components here as not thingy otherwise your representation will be killed
components: [ PixiRepresentation, Not(DebugRect), Not(SpriteRenderer) ]
components: [ PixiRepresentation, Not(DebugRect), Not(SpriteRenderer), Not(DebugLine)]
},
}
queries: any;

View file

@ -5,6 +5,7 @@ import { Sprite, DisplayObject } from "pixi.js";
import { PixiRepresentation } from "../../Components/rendering/pixiRepresentation";
import { addOrSetComponent } from "../../util";
import globals from "../../globals";
import { Point } from "../../Datatypes/point";
// MovableSystem
export class SpriteSystem extends System {
@ -20,7 +21,8 @@ export class SpriteSystem extends System {
let renderer = entity.getComponent(SpriteRenderer)
let pos = entity.getComponent(Position)
let sprite = new Sprite(renderer.texture)
sprite.position = pos.value.add(renderer.offset)
sprite.scale = new Point(renderer.scale)
sprite.position = pos.value.add(renderer.offset.scale(renderer.scale))
globals.app.stage.addChild(sprite)
addOrSetComponent(entity, PixiRepresentation, <PixiRepresentation>{value: <DisplayObject>sprite})
})
@ -32,7 +34,7 @@ export class SpriteSystem extends System {
let pos = entity.getComponent(Position)
let object = entity.getComponent(PixiRepresentation).value as Sprite
object.texture = renderer.texture
object.position = pos.value.add(renderer.offset)
object.position = pos.value.add(renderer.offset.scale(renderer.scale))
})
}

View file

@ -1,9 +1,9 @@
import { AABB } from "./Datatypes/aabb"
export const canvasWidth = 81
export const canvasHeight = 144
export const canvasWidth = 162
export const canvasHeight = 288
export const roomBounds = new AABB(10, 17, 62, 56)
export const roomBounds = new AABB(19, 34, 125, 113)
export const FirstNames = [
"Jules",
@ -11,8 +11,7 @@ export const FirstNames = [
"Sarah",
"Simon",
"Ronja",
"Marko",
"Wachter"
"Marko"
]
export const LastNames = [

View file

@ -1,7 +1,9 @@
import { World } from "ecsy";
import { World, Entity } from "ecsy";
import { Application } from "pixi.js";
import { Observable } from "./Datatypes/observable";
export default {
world: <World>null,
app: <Application>null,
selected: new Observable<Entity>(),
}

View file

@ -1,29 +1,15 @@
import { Application, Ticker, settings, SCALE_MODES } from "pixi.js"
import { Application, settings, SCALE_MODES, Ticker } from "pixi.js";
import globals from "./globals";
import { canvasWidth, canvasHeight } from "./constants";
import { loadResources } from "./resources";
import { setup } from "./setup";
import { setup } from "./setup"
import { loadResources } from "./Resources"
import { DoorSystem } from "./Systems/DoorSystem"
import { SpriteSystem } from "./Systems/rendering/SpriteSystem"
import { RenderSystem } from "./Systems/rendering/RenderSystem"
import { TestSystem } from "./Systems/TestSystem"
import { AdventureReturnSystem } from "./Systems/AdventureReturnSystem"
import { VisibleHumanSystem } from "./Systems/VisibleHumanSystem"
import { DebugRenderSystem } from "./Systems/rendering/DebugRenderSystem"
import { PixiCleanupSystem } from "./Systems/rendering/PixiCleanupSystem"
import { ZOrderSystem } from "./Systems/rendering/ZOrderSystem"
import { PathWalkerSystem } from "./Systems/PathWalkerSystem"
import { RandomWalkSystem } from "./Systems/RandomWalkSystem"
import { World } from "ecsy"
import globals from "./globals"
import { canvasWidth, canvasHeight } from "./constants"
import { ClickableSystem } from "./Systems/ClickableSystem"
// Initialize pixi
globals.app = new Application({
width: canvasWidth,
height: canvasHeight,
backgroundColor: 0x000000,
backgroundColor: 0x10101010,
resolution: 1,
antialias: false,
})
@ -42,23 +28,6 @@ function recalculateSize(){
globals.app.view.style.height = canvasHeight * multiplier + "px"
}
// Create world and register the systems on it
//we could also register components here but they should get automatically registered once used for the first time
globals.world = new World()
globals.world
.registerSystem(TestSystem) //prio -100
.registerSystem(AdventureReturnSystem) //prio -100
.registerSystem(DoorSystem) //prio 0
.registerSystem(RandomWalkSystem) //prio 0
.registerSystem(PathWalkerSystem) //prio 50
.registerSystem(VisibleHumanSystem) //prio 50
.registerSystem(SpriteSystem) //prio 70
.registerSystem(ClickableSystem) //prio 80
.registerSystem(DebugRenderSystem) //prio 90
.registerSystem(ZOrderSystem) //prio 98
.registerSystem(PixiCleanupSystem) //prio 99
.registerSystem(RenderSystem) //prio 100
loadResources(init)

View file

@ -1,10 +1,11 @@
import { Loader } from "pixi.js"
import { Loader, } from "pixi.js"
export function loadResources(init: Function){
Loader.shared.add("Door", "assets/Door.json")
.add("Background", "assets/Background.png")
.add("Human", "assets/Human.png")
.add("pixelfont_fnt","assets/Fonts/Visitor2.fnt")
.load(setup)
function setup(loader: Loader){

View file

@ -6,23 +6,58 @@ import globals from "./globals";
import { createRandomHuman } from "./util";
import { Position } from "./Components/position";
import { Point } from "./Datatypes/point";
import { World } from "ecsy";
import { TestSystem } from "./Systems/TestSystem";
import { AdventureReturnSystem } from "./Systems/AdventureReturnSystem";
import { DoorSystem } from "./Systems/DoorSystem";
import { RandomWalkSystem } from "./Systems/RandomWalkSystem";
import { PathWalkerSystem } from "./Systems/PathWalkerSystem";
import { VisibleHumanSystem } from "./Systems/VisibleHumanSystem";
import { SpriteSystem } from "./Systems/rendering/SpriteSystem";
import { ClickableSystem } from "./Systems/ClickableSystem";
import { InfoSystem } from "./Systems/InfoSystem";
import { DebugRenderSystem } from "./Systems/rendering/DebugRenderSystem";
import { ZOrderSystem } from "./Systems/rendering/ZOrderSystem";
import { PixiCleanupSystem } from "./Systems/rendering/PixiCleanupSystem";
import { RenderSystem } from "./Systems/rendering/RenderSystem";
import { Vector } from "./Datatypes/vector";
export function setup(){
// Create world and register the systems on it
//we could also register components here but they should get automatically registered once used for the first time
globals.world = new World()
globals.world
.registerSystem(TestSystem) //prio -100
.registerSystem(AdventureReturnSystem) //prio -100
.registerSystem(DoorSystem) //prio 0
.registerSystem(RandomWalkSystem) //prio 0
.registerSystem(PathWalkerSystem) //prio 50
.registerSystem(VisibleHumanSystem) //prio 50
.registerSystem(SpriteSystem) //prio 70
.registerSystem(ClickableSystem) //prio 80
.registerSystem(InfoSystem) //prio 80
.registerSystem(DebugRenderSystem) //prio 90
.registerSystem(ZOrderSystem) //prio 98
.registerSystem(PixiCleanupSystem) //prio 99
.registerSystem(RenderSystem) //prio 100
let resources = Loader.shared.resources;
//base sprites without entity representation
const bgTex = new Sprite(resources["Background"].texture)
bgTex.scale = new Point(2) //TODO make texture of correct size
globals.app.stage.addChild(bgTex)
//start entities
//door
globals.world.createEntity()
.addComponent(Position, <Position>{value: new Point(38, 2)})
.addComponent(Position, <Position>{value: new Point(76, 4)})
.addComponent(Door, <Door>{open: true,
openOffset: {x:0, y:0}, openTex: resources["Door"].spritesheet.textures[0],
closedOffset: {x:0, y:0}, closedTex: resources["Door"].spritesheet.textures[1]})
openOffset: new Vector(0), openTex: resources["Door"].spritesheet.textures[0],
closedOffset: new Vector(0), closedTex: resources["Door"].spritesheet.textures[1]})
//debug room bounds
globals.world.createEntity()

View file

@ -7,8 +7,9 @@ import { InCabin } from "./Components/inCabin"
import { OrderZ } from "./Components/rendering/orderZ"
import { WalkRandomly } from "./Components/walkRandomly"
import { Position } from "./Components/position"
import { roomBounds } from "./constants"
import { roomBounds, FirstNames, LastNames } from "./constants"
import { Clickable } from "./Components/clickable"
import globals from "./globals"
export function addOrSetComponent(entity: Entity, Component: ComponentConstructor<Component>, values: any) {
@ -29,7 +30,7 @@ export function addOrSetComponent(entity: Entity, Component: ComponentConstructo
}
export function randomArrayValue(array: any[]):any{
let randomIndex = Math.random() * array.length
let randomIndex = Math.floor(Math.random() * array.length)
return array[randomIndex]
}
@ -38,12 +39,12 @@ export function createRandomHuman(world: World){
let entity = world.createEntity()
entity
.addComponent(Human)
.addComponent(Name, <Name>{first: "mary", last:"sue"})
.addComponent(Name, <Name>{first: randomArrayValue(FirstNames), last:randomArrayValue(LastNames)})
.addComponent(Appearance, <Appearance>{idleTexture: resources["Human"].texture}) //Todo: generate appearance from body traits instead?
.addComponent(InCabin)
.addComponent(Position, <Position>{value: roomBounds.randomPoint()})
.addComponent(OrderZ)
.addComponent(WalkRandomly)
//todo: change this into selecing the human instead of killing it...
.addComponent(Clickable, { actions: { "click": (event: interaction.InteractionEvent) => {entity.remove();} }})
.addComponent(Clickable, { actions: { "click": (event: interaction.InteractionEvent) => {globals.selected.set(entity)} }})
}

View file

@ -1,6 +1,7 @@
html, body {
margin: 0;
margin: 10;
padding: 0;
background-color: rgb(198, 221, 235);
}
canvas {
@ -8,4 +9,30 @@ canvas {
image-rendering: -webkit-crisp-edges;
image-rendering: pixelated;
image-rendering: crisp-edges;
}
canvas, img { /* makes a change, noticeable [28/05/16] */
image-rendering: optimizeSpeed;
image-rendering: -moz-crisp-edges;
image-rendering: -webkit-optimize-contrast;
image-rendering: optimize-contrast;
image-rendering: pixelated;
-ms-interpolation-mode: nearest-neighbor;
}
@font-face {
font-family: 'pinch';
src: url('assets/Fonts/pinch.woff2') format('woff2'),
url('assets/Fonts/pinch.woff') format('woff');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'babyblocks';
src: url('assets/Fonts/BabyBlocks.woff2') format('woff2'),
url('assets/Fonts/BabyBlocks.woff') format('woff'),
url('assets/Fonts/BabyBlocks.ttf') format('ttf');
font-weight: normal;
font-style: normal;
}

View file

@ -494,11 +494,6 @@
resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
abbrev@1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
version "1.3.7"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
@ -572,19 +567,11 @@ anymatch@^2.0.0:
micromatch "^3.1.4"
normalize-path "^2.1.1"
aproba@^1.0.3, aproba@^1.1.1:
aproba@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
are-we-there-yet@~1.1.2:
version "1.1.5"
resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
dependencies:
delegates "^1.0.0"
readable-stream "^2.0.6"
arr-diff@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
@ -1130,11 +1117,6 @@ console-browserify@^1.1.0:
resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
console-control-strings@^1.0.0, console-control-strings@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
constants-browserify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
@ -1270,7 +1252,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
dependencies:
ms "2.0.0"
debug@^3.0.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6:
debug@^3.0.0, debug@^3.1.1, debug@^3.2.5:
version "3.2.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
@ -1306,11 +1288,6 @@ deep-equal@^1.0.1:
object-keys "^1.1.1"
regexp.prototype.flags "^1.2.0"
deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
default-gateway@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b"
@ -1361,11 +1338,6 @@ del@^4.1.1:
pify "^4.0.1"
rimraf "^2.6.3"
delegates@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
depd@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
@ -1389,11 +1361,6 @@ detect-file@^1.0.0:
resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
detect-libc@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
detect-node@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
@ -1905,13 +1872,6 @@ from2@^2.1.0:
inherits "^2.0.1"
readable-stream "^2.0.0"
fs-minipass@^1.2.5:
version "1.2.7"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==
dependencies:
minipass "^2.6.0"
fs-write-stream-atomic@^1.0.8:
version "1.0.10"
resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
@ -1940,20 +1900,6 @@ function-bind@^1.1.1:
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
gauge@~2.7.3:
version "2.7.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
dependencies:
aproba "^1.0.3"
console-control-strings "^1.0.0"
has-unicode "^2.0.0"
object-assign "^4.1.0"
signal-exit "^3.0.0"
string-width "^1.0.1"
strip-ansi "^3.0.1"
wide-align "^1.1.0"
get-caller-file@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
@ -2063,11 +2009,6 @@ has-symbols@^1.0.0, has-symbols@^1.0.1:
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
has-unicode@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
has-value@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
@ -2262,7 +2203,7 @@ https-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
iconv-lite@0.4.24, iconv-lite@^0.4.4:
iconv-lite@0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@ -2279,13 +2220,6 @@ iferr@^0.1.5:
resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
ignore-walk@^3.0.1:
version "3.0.3"
resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37"
integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==
dependencies:
minimatch "^3.0.4"
import-local@2.0.0, import-local@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
@ -2327,7 +2261,7 @@ inherits@2.0.3:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
ini@^1.3.4, ini@^1.3.5:
version "1.3.5"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
@ -2877,21 +2811,6 @@ minimist@^1.2.0:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
version "2.9.0"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==
dependencies:
safe-buffer "^5.1.2"
yallist "^3.0.0"
minizlib@^1.2.1:
version "1.3.3"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==
dependencies:
minipass "^2.9.0"
mississippi@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
@ -2916,7 +2835,7 @@ mixin-deep@^1.2.0:
for-in "^1.0.2"
is-extendable "^1.0.1"
mkdirp@^0.5.0, mkdirp@^0.5.1:
mkdirp@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
@ -2985,15 +2904,6 @@ nanomatch@^1.2.9:
snapdragon "^0.8.1"
to-regex "^3.0.1"
needle@^2.2.1:
version "2.3.2"
resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.2.tgz#3342dea100b7160960a450dc8c22160ac712a528"
integrity sha512-DUzITvPVDUy6vczKKYTnWc/pBZ0EnjMJnQ3y+Jo5zfKFimJs7S3HFCxCRZYB9FUZcrzUQr3WsmvZgddMEIZv6w==
dependencies:
debug "^3.2.6"
iconv-lite "^0.4.4"
sax "^1.2.4"
negotiator@0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
@ -3050,30 +2960,6 @@ node-libs-browser@^2.2.1:
util "^0.11.0"
vm-browserify "^1.0.1"
node-pre-gyp@*:
version "0.14.0"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83"
integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==
dependencies:
detect-libc "^1.0.2"
mkdirp "^0.5.1"
needle "^2.2.1"
nopt "^4.0.1"
npm-packlist "^1.1.6"
npmlog "^4.0.2"
rc "^1.2.7"
rimraf "^2.6.1"
semver "^5.3.0"
tar "^4.4.2"
nopt@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=
dependencies:
abbrev "1"
osenv "^0.1.4"
normalize-path@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
@ -3086,27 +2972,6 @@ normalize-path@^3.0.0:
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
npm-bundled@^1.0.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b"
integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==
dependencies:
npm-normalize-package-bin "^1.0.1"
npm-normalize-package-bin@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2"
integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==
npm-packlist@^1.1.6:
version "1.4.8"
resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e"
integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==
dependencies:
ignore-walk "^3.0.1"
npm-bundled "^1.0.1"
npm-normalize-package-bin "^1.0.1"
npm-run-path@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
@ -3114,16 +2979,6 @@ npm-run-path@^2.0.0:
dependencies:
path-key "^2.0.0"
npmlog@^4.0.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
dependencies:
are-we-there-yet "~1.1.2"
console-control-strings "~1.1.0"
gauge "~2.7.3"
set-blocking "~2.0.0"
nth-check@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
@ -3136,7 +2991,7 @@ number-is-nan@^1.0.0:
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
object-assign@^4.0.1, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
@ -3240,11 +3095,6 @@ os-browserify@^0.3.0:
resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
os-homedir@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
os-locale@^3.0.0, os-locale@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
@ -3254,19 +3104,6 @@ os-locale@^3.0.0, os-locale@^3.1.0:
lcid "^2.0.0"
mem "^4.0.0"
os-tmpdir@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
osenv@^0.1.4:
version "0.1.5"
resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
dependencies:
os-homedir "^1.0.0"
os-tmpdir "^1.0.0"
p-defer@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
@ -3638,17 +3475,7 @@ raw-body@2.4.0:
iconv-lite "0.4.24"
unpipe "1.0.0"
rc@^1.2.7:
version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
dependencies:
deep-extend "^0.6.0"
ini "~1.3.0"
minimist "^1.2.0"
strip-json-comments "~2.0.1"
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
@ -3789,7 +3616,7 @@ retry@^0.12.0:
resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3:
rimraf@^2.5.4, rimraf@^2.6.3:
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
@ -3833,11 +3660,6 @@ safe-regex@^1.1.0:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
sax@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
schema-utils@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
@ -3859,7 +3681,7 @@ selfsigned@^1.10.7:
dependencies:
node-forge "0.9.0"
semver@^5.3.0, semver@^5.5.0, semver@^5.6.0:
semver@^5.5.0, semver@^5.6.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@ -3916,7 +3738,7 @@ serve-static@1.14.1:
parseurl "~1.3.3"
send "0.17.1"
set-blocking@^2.0.0, set-blocking@~2.0.0:
set-blocking@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
@ -4151,7 +3973,7 @@ string-width@^1.0.1:
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1:
string-width@^2.0.0, string-width@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
@ -4224,11 +4046,6 @@ strip-eof@^1.0.0:
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
supports-color@6.1.0, supports-color@^6.1.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
@ -4248,19 +4065,6 @@ tapable@^1.0.0, tapable@^1.1.3:
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
tar@^4.4.2:
version "4.4.13"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
dependencies:
chownr "^1.1.1"
fs-minipass "^1.2.5"
minipass "^2.8.6"
minizlib "^1.2.1"
mkdirp "^0.5.0"
safe-buffer "^5.1.2"
yallist "^3.0.3"
terser-webpack-plugin@^1.4.3:
version "1.4.3"
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c"
@ -4690,13 +4494,6 @@ which@^1.2.14, which@^1.2.9, which@^1.3.1:
dependencies:
isexe "^2.0.0"
wide-align@^1.1.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
dependencies:
string-width "^1.0.2 || 2"
worker-farm@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
@ -4743,7 +4540,7 @@ xtend@^4.0.0, xtend@~4.0.1:
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
yallist@^3.0.2:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==