<commit_before>import m from 'mithril';
import h from '../h';

const footer = {
    view() {
        return m('footer.main-footer.main-footer-neg',
            [
                m('section.w-container',
                    m('.w-row',
                        [
                            m('.w-col.w-col-9',
                                m('.w-row',
                                    [
                                        m('.w-col.w-col-4.w-col-small-4.w-col-tiny-4.w-hidden-tiny',
                                            [
                                                m('.footer-full-signature-text.fontsize-small',
                                                    'Welcome'
                                                ),
                                                m('a.link-footer[href=\'http://www.citizensupported.org/start?ref=citizensupported_footer\']',
                                                    [
                                                        'How it works',
                                                        m.trust(' '),
                                                        m('span.badge.badge-success',
                                                            'New'
                                                        )
                                                    ]
                                                ),
                                                m('a.link-footer[href=\'https://www.citizensupported.org/team?ref=citizensupported_footer\']',
                                                    [
                                                        ' Our team ',
                                                        m.trust('<'),
                                                        '3'
                                                    ]
                                                ),
                                                m('a.link-footer[href=\'https://www.citizensupported.org/jobs\']',
                                                    ' Jobs'
                                                ),
                                                m('a.link-footer[href=\'http://facebook.com/citizensupported\']',
                                                    ' Facebook'
                                                ),
                                                m('a.link-footer[href=\'http://twitter.com/citznsupported\']',
                                                    ' Twitter'
                                                ),
                                                m('a.link-footer[href=\'http://instagram.com/citizensupported\']',
                                                    ' Instagram'
                                                ),
                                                m('a.link-footer[href=\'http://github.com/citizensupported/citizensupported\']',
                                                    ' Github'
                                                ),
                                                m('a.link-footer[href=\'http://blog.citizensupported.org\']',
                                                    ' Blog'
                                                )
                                            ]
                                        ),
                                        m('.w-col.w-col-4.w-col-small-4.w-col-tiny-4.footer-full-firstcolumn',
                                            [
                                                m('.footer-full-signature-text.fontsize-small',
                                                    'Help'
                                                ),
                                                m('a.link-footer[href=\'https://citizensupported.zendesk.com/hc/en-us/requests/new\'][target="_BLANK"]',
                                                    ' Contact'
                                                ),
                                                m('a.link-footer[href=\'https://www.citizensupported.org/press?ref=citizensupported_footer\']',
                                                    ' Press'
                                                ),
                                                m('a.link-footer[href=\'https://citizensupported.zendesk.com/hc/en-us/community/topics?ref=citizensupported_footer/\']',
                                                    ' Support Center'
                                                ),
                                                m('a.link-footer[href=\'/terms-of-use\']',
                                                    ' Terms of Use'
                                                ),
                                                m('a.link-footer[href=\'/privacy-policy\']',
                                                    ' Privacy Policy'
                                                )
                                            ]
                                        ),
                                        m('.w-col.w-col-4.w-col-small-4.w-col-tiny-4.footer-full-lastcolumn',
                                            [
                                                m('.footer-full-signature-text.fontsize-small',
                                                    'Browse'
                                                ),
                                                m('a.w-hidden-small.w-hidden-tiny.link-footer[href=\'/start?ref=citizensupported_footer\']',
                                                    ' Fund your activism'
                                                ),
                                                m('a.link-footer[href=\'/explore?ref=citizensupported_footer\']',
                                                    ' Explore protests'
                                                ),
                                                m('a.w-hidden-main.w-hidden-medium.w-hidden-small.link-footer[href=\'http://blog.citizensupported.org?ref=citizensupported_footer\']',
                                                    ' Blog'
                                                ),
                                                m('a.w-hidden-main.w-hidden-medium.w-hidden-small.link-footer[href=\'https://equipecatarse.zendesk.com/account/dropboxes/20298537\']',
                                                    ' Contact'
                                                ),
                                                m('a.w-hidden-tiny.link-footer[href=\'/explore?filter=score&ref=citizensupported_footer\']',
                                                    ' Popular'
                                                ),
                                                m('a.w-hidden-tiny.link-footer[href=\'/explore?filter=online&ref=citizensupported_footer\']',
                                                    ' Just started'
                                                ),
                                                m('a.w-hidden-tiny.link-footer[href=\'/explore?filter=finished&ref=citizensupported_footer\']',
                                                    ' Finished'
                                                )
                                            ]
                                        )
                                    ]
                                )
                            ),
                            m('.w-col.w-col-3.column-social-media-footer',
                                [
                                    m('.footer-full-signature-text.fontsize-small',
                                        'Subscribe to our news'
                                    ),
                                    m('.w-form',
                                        m(`form[accept-charset='UTF-8'][action='${h.getMailchimpUrl()}'][id='mailee-form'][method='post']`,
                                            [
                                                m('.w-form.footer-newsletter',
                                                    m('input.w-input.text-field.prefix[id=\'EMAIL\'][label=\'email\'][name=\'EMAIL\'][placeholder=\'Type your email\'][type=\'email\']')
                                                ),
                                                m('button.w-inline-block.btn.btn-edit.postfix.btn-attached[style="padding:0;"]',
                                                    m('img.footer-news-icon[alt=\'Icon newsletter\'][src=\'/assets/catarse_bootstrap/icon-newsletter.png\']')
                                                )
                                            ]
                                        )
                                    ),
                                    m('.footer-full-signature-text.fontsize-small',
                                        'Social Networks'
                                    ),
                                    m('.w-widget.w-widget-facebook.u-marginbottom-20',
                                        m('.facebook',
                                            m('.fb-like[data-colorscheme=\'dark\'][data-href=\'http://facebook.com/citizensupported\'][data-layout=\'button_count\'][data-send=\'false\'][data-show-faces=\'false\'][data-title=\'\'][data-width=\'260\']')
                                        )
                                    ),
                                    m('.w-widget.w-widget-twitter', [
                                        m(`a.twitter-follow-button[href="http://twitter.com/citznsupported"][data-button="blue"][data-text-color="#FFFFFF][data-link-color="#FFFFFF"][data-width="224px"]`)
                                    ]),
                                    m('.u-margintop-30',
                                        [
                                            m('.footer-full-signature-text.fontsize-small',
                                                'Change language'
                                            ),
                                            m('[id=\'google_translate_element\']')
                                        ]
                                    )
                                ]
                            )
                        ]
                    )
                ),
                m('.w-container',
                    m('.footer-full-copyleft',
                        [
                            m('img.u-marginbottom-20[alt=\'Logo footer\'][src=\"/assets/catarse_bootstrap/logo_big.png\"]'),
                            m('.lineheight-loose',
                                m('a.link-footer-inline[href=\'http://github.com/citizensupported/citizensupported\']',
                                    'Made with love | 2016 | Open source'
                                )
                            )
                        ]
                    )
                )
            ]
        );
    }
};

export default footer;
<commit_msg>1256446-140427403 move jobs up to beneath Our Team link [Finishes #140427403]<commit_after>import m from 'mithril';
import h from '../h';

const footer = {
    view() {
        return m('footer.main-footer.main-footer-neg',
            [
                m('section.w-container',
                    m('.w-row',
                        [
                            m('.w-col.w-col-9',
                                m('.w-row',
                                    [
                                        m('.w-col.w-col-4.w-col-small-4.w-col-tiny-4.w-hidden-tiny',
                                            [
                                                m('.footer-full-signature-text.fontsize-small',
                                                    'Welcome'
                                                ),
                                                m('a.link-footer[href=\'http://www.citizensupported.org/start?ref=citizensupported_footer\']',
                                                    [
                                                        'How it works',
                                                        m.trust(' '),
                                                        m('span.badge.badge-success',
                                                            'New'
                                                        )
                                                    ]
                                                ),
                                                m('a.link-footer[href=\'https://www.citizensupported.org/team?ref=citizensupported_footer\']',
                                                    [
                                                        ' Our team ',
                                                        m.trust('<'),
                                                        '3'
                                                    ]
                                                ),
                                                m('a.link-footer[href=\'https://www.citizensupported.org/jobs\']',
                                                   [
                                                        ' Jobs',
                                                       m.trust(' '),
                                                       m('span.badge.badge-success',
                                                           'New'
                                                       )
                                                   ]
                                                ),
                                                m('a.link-footer[href=\'http://facebook.com/citizensupported\']',
                                                    ' Facebook'
                                                ),
                                                m('a.link-footer[href=\'http://twitter.com/citznsupported\']',
                                                    ' Twitter'
                                                ),
                                                m('a.link-footer[href=\'http://instagram.com/citizensupported\']',
                                                    ' Instagram'
                                                ),
                                                m('a.link-footer[href=\'http://github.com/citizensupported/citizensupported\']',
                                                    ' Github'
                                                ),
                                                m('a.link-footer[href=\'http://blog.citizensupported.org\']',
                                                    ' Blog'
                                                )
                                            ]
                                        ),
                                        m('.w-col.w-col-4.w-col-small-4.w-col-tiny-4.footer-full-firstcolumn',
                                            [
                                                m('.footer-full-signature-text.fontsize-small',
                                                    'Help'
                                                ),
                                                m('a.link-footer[href=\'https://citizensupported.zendesk.com/hc/en-us/requests/new\'][target="_BLANK"]',
                                                    ' Contact'
                                                ),
                                                m('a.link-footer[href=\'https://www.citizensupported.org/press?ref=citizensupported_footer\']',
                                                    ' Press'
                                                ),
                                                m('a.link-footer[href=\'https://citizensupported.zendesk.com/hc/en-us/community/topics?ref=citizensupported_footer/\']',
                                                    ' Support Center'
                                                ),
                                                m('a.link-footer[href=\'/terms-of-use\']',
                                                    ' Terms of Use'
                                                ),
                                                m('a.link-footer[href=\'/privacy-policy\']',
                                                    ' Privacy Policy'
                                                )
                                            ]
                                        ),
                                        m('.w-col.w-col-4.w-col-small-4.w-col-tiny-4.footer-full-lastcolumn',
                                            [
                                                m('.footer-full-signature-text.fontsize-small',
                                                    'Browse'
                                                ),
                                                m('a.w-hidden-small.w-hidden-tiny.link-footer[href=\'/start?ref=citizensupported_footer\']',
                                                    ' Fund your activism'
                                                ),
                                                m('a.link-footer[href=\'/explore?ref=citizensupported_footer\']',
                                                    ' Explore protests'
                                                ),
                                                m('a.w-hidden-main.w-hidden-medium.w-hidden-small.link-footer[href=\'http://blog.citizensupported.org?ref=citizensupported_footer\']',
                                                    ' Blog'
                                                ),
                                                m('a.w-hidden-main.w-hidden-medium.w-hidden-small.link-footer[href=\'https://equipecatarse.zendesk.com/account/dropboxes/20298537\']',
                                                    ' Contact'
                                                ),
                                                m('a.w-hidden-tiny.link-footer[href=\'/explore?filter=score&ref=citizensupported_footer\']',
                                                    ' Popular'
                                                ),
                                                m('a.w-hidden-tiny.link-footer[href=\'/explore?filter=online&ref=citizensupported_footer\']',
                                                    ' Just started'
                                                ),
                                                m('a.w-hidden-tiny.link-footer[href=\'/explore?filter=finished&ref=citizensupported_footer\']',
                                                    ' Finished'
                                                )
                                            ]
                                        )
                                    ]
                                )
                            ),
                            m('.w-col.w-col-3.column-social-media-footer',
                                [
                                    m('.footer-full-signature-text.fontsize-small',
                                        'Subscribe to our news'
                                    ),
                                    m('.w-form',
                                        m(`form[accept-charset='UTF-8'][action='${h.getMailchimpUrl()}'][id='mailee-form'][method='post']`,
                                            [
                                                m('.w-form.footer-newsletter',
                                                    m('input.w-input.text-field.prefix[id=\'EMAIL\'][label=\'email\'][name=\'EMAIL\'][placeholder=\'Type your email\'][type=\'email\']')
                                                ),
                                                m('button.w-inline-block.btn.btn-edit.postfix.btn-attached[style="padding:0;"]',
                                                    m('img.footer-news-icon[alt=\'Icon newsletter\'][src=\'/assets/catarse_bootstrap/icon-newsletter.png\']')
                                                )
                                            ]
                                        )
                                    ),
                                    m('.footer-full-signature-text.fontsize-small',
                                        'Social Networks'
                                    ),
                                    m('.w-widget.w-widget-facebook.u-marginbottom-20',
                                        m('.facebook',
                                            m('.fb-like[data-colorscheme=\'dark\'][data-href=\'http://facebook.com/citizensupported\'][data-layout=\'button_count\'][data-send=\'false\'][data-show-faces=\'false\'][data-title=\'\'][data-width=\'260\']')
                                        )
                                    ),
                                    m('.w-widget.w-widget-twitter', [
                                        m(`a.twitter-follow-button[href="http://twitter.com/citznsupported"][data-button="blue"][data-text-color="#FFFFFF][data-link-color="#FFFFFF"][data-width="224px"]`)
                                    ]),
                                    m('.u-margintop-30',
                                        [
                                            m('.footer-full-signature-text.fontsize-small',
                                                'Change language'
                                            ),
                                            m('[id=\'google_translate_element\']')
                                        ]
                                    )
                                ]
                            )
                        ]
                    )
                ),
                m('.w-container',
                    m('.footer-full-copyleft',
                        [
                            m('img.u-marginbottom-20[alt=\'Logo footer\'][src=\"/assets/catarse_bootstrap/logo_big.png\"]'),
                            m('.lineheight-loose',
                                m('a.link-footer-inline[href=\'http://github.com/citizensupported/citizensupported\']',
                                    'Made with love | 2016 | Open source'
                                )
                            )
                        ]
                    )
                )
            ]
        );
    }
};

export default footer;
<|endoftext|>


<commit_before>import Node from '../core/Node.js';
import Vector3Node from '../inputs/Vector3Node.js';
import Matrix4Node from '../inputs/Matrix4Node.js';
import { NodeUpdateType } from '../core/constants.js';

class ModelNode extends Node {

	static VIEW = 'view';

	constructor( scope = ModelNode.VIEW ) {

		super( 'mat4' );

		this.scope = scope;

		this.updateType = NodeUpdateType.Object;

		this._inputNode = null;

	}

	update( frame ) {

		const object = frame.object;
		const inputNode = this._inputNode;

		inputNode.value = object.modelViewMatrix;

	}

	generate( builder, output ) {

		const nodeData = builder.getDataFromNode( this );

		let inputNode = this._inputNode;

		if ( nodeData.inputNode === undefined ) {

			inputNode = new Matrix4Node( null );

			this._inputNode = inputNode;

			nodeData.inputNode = inputNode;

		}

		return inputNode.build( builder, output );

	}

}

export default ModelNode;
<commit_msg>not use getDataFromNode for now<commit_after>import Node from '../core/Node.js';
import Vector3Node from '../inputs/Vector3Node.js';
import Matrix4Node from '../inputs/Matrix4Node.js';
import { NodeUpdateType } from '../core/constants.js';

class ModelNode extends Node {

	static VIEW = 'view';

	constructor( scope = ModelNode.VIEW ) {

		super( 'mat4' );

		this.scope = scope;

		this.updateType = NodeUpdateType.Object;

		this._inputNode = new Matrix4Node( null );

	}

	update( frame ) {

		const object = frame.object;
		const inputNode = this._inputNode;

		inputNode.value = object.modelViewMatrix;

	}

	generate( builder, output ) {

		return this._inputNode.build( builder, output );

	}

}

export default ModelNode;
<|endoftext|>


<commit_before>import {Container} from 'aurelia-dependency-injection';
import {CustomElement, ViewSlot, ViewStrategy, UseView, NoView} from 'aurelia-templating';
import {Router} from 'aurelia-router';
import {Origin} from 'aurelia-metadata';

export class RouterView {
  static metadata(){
    return [
      new CustomElement('router-view'),
      new NoView()
    ];
  }

  static inject() { return [Element,Container,ViewSlot,Router]; }
  constructor(element, container, viewSlot, router) {
    this.element = element;
    this.container = container;
    this.viewSlot = viewSlot;
    this.router = router;
    router.registerViewPort(this, element.getAttribute('name'));
  }

  process(viewPortInstruction, waitToSwap) {
    var component = viewPortInstruction.component,
        viewStrategy = component.view,
        viewModelInfo = component.viewModelInfo,
        childContainer = component.childContainer,
        viewModel = component.executionContext;

    if(!viewStrategy && 'getViewStrategy' in viewModel){
      viewStrategy = viewModel.getViewStrategy();
    }

    if(viewStrategy){
      viewStrategy = ViewStrategy.normalize(viewStrategy);
      viewStrategy.makeRelativeTo(Origin.get(component.router.container.viewModel.constructor).moduleId);
    }

    return viewModelInfo.type.load(childContainer, viewModelInfo.value, viewStrategy).then(behaviorType => {
      viewPortInstruction.behavior = behaviorType.create(childContainer, {executionContext:viewModel});

      if(waitToSwap){
        return;
      }

      this.swap(viewPortInstruction);
    });
  }

  swap(viewPortInstruction){
    this.viewSlot.swap(viewPortInstruction.behavior.view);

    if(this.view){
      this.view.unbind();
    }

    this.view = viewPortInstruction.behavior.view;
  }
}<commit_msg>feat(router-view): update to new fluent metadata<commit_after>import {Container} from 'aurelia-dependency-injection';
import {ViewSlot, ViewStrategy} from 'aurelia-templating';
import {Router} from 'aurelia-router';
import {Metadata, Origin} from 'aurelia-metadata';

export class RouterView {
  static metadata(){ return Metadata.customElement('router-view').noView(); }
  static inject() { return [Element,Container,ViewSlot,Router]; }
  constructor(element, container, viewSlot, router) {
    this.element = element;
    this.container = container;
    this.viewSlot = viewSlot;
    this.router = router;
    router.registerViewPort(this, element.getAttribute('name'));
  }

  process(viewPortInstruction, waitToSwap) {
    var component = viewPortInstruction.component,
        viewStrategy = component.view,
        viewModelInfo = component.viewModelInfo,
        childContainer = component.childContainer,
        viewModel = component.executionContext;

    if(!viewStrategy && 'getViewStrategy' in viewModel){
      viewStrategy = viewModel.getViewStrategy();
    }

    if(viewStrategy){
      viewStrategy = ViewStrategy.normalize(viewStrategy);
      viewStrategy.makeRelativeTo(Origin.get(component.router.container.viewModel.constructor).moduleId);
    }

    return viewModelInfo.type.load(childContainer, viewModelInfo.value, viewStrategy).then(behaviorType => {
      viewPortInstruction.behavior = behaviorType.create(childContainer, {executionContext:viewModel});

      if(waitToSwap){
        return;
      }

      this.swap(viewPortInstruction);
    });
  }

  swap(viewPortInstruction){
    this.viewSlot.swap(viewPortInstruction.behavior.view);

    if(this.view){
      this.view.unbind();
    }

    this.view = viewPortInstruction.behavior.view;
  }
}<|endoftext|>


<commit_before>const GroupLayout = () => import('@/components/Layout/GroupLayout')
const GroupWall = () => import('@/pages/Group/Wall')
const GroupPickups = () => import('@/pages/Group/Pickups')
const GroupFeedback = () => import('@/pages/Group/Feedbacks')
const GroupMap = () => import('@/pages/Map')
const GroupSettings = () => import('@/pages/Group/Settings')
const GroupEdit = () => import('@/pages/Group/Edit')
const GroupManageAgreement = () => import('@/pages/Group/ManageAgreement')
const GroupCreate = () => import('@/pages/Group/Create')
const GroupPreview = () => import('@/pages/GroupPreview')
const GroupGallery = () => import('@/pages/GroupGallery')
const StoreLayout = () => import('@/pages/Store/Layout')
const StorePickups = () => import('@/pages/Store/Pickups')
const StoreFeedback = () => import('@/pages/Store/Feedbacks')
const StoreHistory = () => import('@/pages/Store/History')
const StorePickupsManage = () => import('@/pages/Store/PickupsManage')
const StoreEdit = () => import('@/pages/Store/Edit')
const StoreCreate = () => import('@/pages/Store/Create')
const StoreList = () => import('@/pages/Store/Stores')
const HistoryDetail = () => import('@/pages/HistoryDetail')
const GroupInvitations = () => import('@/pages/Group/Invitations')
const GroupDescription = () => import('@/pages/Group/Description')
const GroupMembers = () => import('@/pages/Group/Members')
const GroupHistory = () => import('@/pages/Group/History')
const GroupMapAndStoresSidenav = () => import('@/components/Sidenav/SidenavMapAndStores')
const GroupGroupSidenav = () => import('@/components/Sidenav/SidenavGroup')
const GroupStoreSidenav = () => import('@/components/Sidenav/SidenavStore')
const Settings = () => import('@/pages/Settings')
const User = () => import('@/pages/User/User')
const PickupFeedback = () => import('@/pages/Group/Feedback')
const MobileDetail = () => import('@/pages/MobileDetail')

export default [
  {
    name: 'groupsGallery',
    path: '/groupPreview',
    meta: {
      breadcrumbs: [
        { translation: 'JOINGROUP.ALL_GROUPS' },
      ],
    },
    components: {
      fullPage: GroupGallery,
    },
  },
  {
    name: 'groupPreview',
    path: '/groupPreview/:groupPreviewId',
    meta: {
      breadcrumbs: [
        { translation: 'JOINGROUP.ALL_GROUPS', route: { name: 'groupsGallery' } },
        { type: 'activeGroupPreview' },
      ],
      beforeEnter: 'groups/selectPreview',
      afterLeave: 'groups/clearGroupPreview',
    },
    components: {
      default: GroupPreview,
    },
  },
  {
    name: 'groupCreate',
    path: '/group/create',
    meta: {
      requireLoggedIn: true,
      breadcrumbs: [
        { translation: 'JOINGROUP.ALL_GROUPS', route: { name: 'groupsGallery' } },
        { translation: 'GROUP.CREATE_TITLE', route: { name: 'groupCreate' } },
      ],
      beforeEnter: 'timezones/fetch',
    },
    components: {
      default: GroupCreate,
    },
  },
  {
    name: 'historyDetail',
    path: '/history/:historyId',
    components: {
      default: HistoryDetail,
    },
    meta: {
      requireLoggedIn: true,
      breadcrumbs: [
        { translation: 'HISTORY.DETAILS', route: { name: 'historyDetail' } },
      ],
      beforeEnter: 'history/setActive',
      afterLeave: 'history/clearActive',
    },
  },
  {
    path: '/group/:groupId',
    redirect: '/group/:groupId/wall',
    meta: {
      requireLoggedIn: true,
      breadcrumbs: [
        { type: 'currentGroup' },
      ],
      beforeEnter: 'currentGroup/select',
    },
    components: {
      default: GroupLayout,
      sidenav: GroupMapAndStoresSidenav,
    },
    children: [
      {
        name: 'group',
        path: 'wall',
        components: {
          default: GroupWall,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupPickups',
        path: 'pickups',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.PICKUPS', route: { name: 'groupPickups' } },
          ],
        },
        components: {
          default: GroupPickups,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupFeedback',
        path: 'feedback',
        meta: {
          breadcrumbs: [
            { translation: 'PICKUP_FEEDBACK.TITLE', route: { name: 'groupFeedback' } },
          ],
        },
        components: {
          default: GroupFeedback,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupDescription',
        path: 'description',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.DESCRIPTION', route: { name: 'groupDescription' } },
          ],
        },
        components: {
          default: GroupDescription,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupMembers',
        path: 'members',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.MEMBERS', route: { name: 'groupMembers' } },
          ],
        },
        components: {
          default: GroupMembers,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupHistory',
        path: 'history',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.HISTORY', route: { name: 'groupHistory' } },
          ],
          beforeEnter: 'history/fetchForGroup',
        },
        components: {
          default: GroupHistory,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupInvitations',
        path: 'invites',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.INVITATIONS', route: { name: 'groupInvitations' } },
          ],
          beforeEnter: 'invitations/fetch',
        },
        components: {
          default: GroupInvitations,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupEdit',
        path: 'edit',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.EDIT', route: { name: 'groupEdit' } },
          ],
          beforeEnter: 'timezones/fetch',
        },
        components: {
          default: GroupEdit,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupSettings',
        path: 'settings',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.SETTINGS', route: { name: 'groupSettings' } },
          ],
        },
        components: {
          default: GroupSettings,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupManageAgreement',
        path: 'agreement',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.MANAGE_AGREEMENT', route: { name: 'groupManageAgreement' } },
          ],
        },
        components: {
          default: GroupManageAgreement,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'stores',
        path: 'store',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.STORES', route: { name: 'stores' } },
          ],
        },
        components: {
          default: StoreList,
          sidenav: GroupStoreSidenav,
        },
      },
      {
        name: 'storeCreate',
        path: 'store/create',
        meta: {
          breadcrumbs: [
            { translation: 'CREATESTORE.TITLE', route: { name: 'storeCreate' } },
          ],
        },
        components: {
          default: StoreCreate,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        redirect: '/group/:groupId/store/:storeId/wall',
        path: 'store/:storeId',
        meta: {
          breadcrumbs: [
            { type: 'activeStore' },
          ],
          beforeEnter: 'stores/selectStore',
          afterLeave: 'stores/clearSelectedStore',
        },
        props: {
          sidenav: true,
        },
        components: {
          default: StoreLayout,
          sidenav: GroupGroupSidenav,
          secondSidenav: GroupStoreSidenav,
        },
        children: [
          {
            name: 'store',
            path: '',
            redirect: 'pickups',
          },
          {
            name: 'storePickups',
            path: 'pickups',
            component: StorePickups,
          },
          {
            name: 'pickupDetail',
            path: 'pickups/:pickupId/detail',
            meta: {
              requiredLoggedIn: true,
              breadcrumbs: [
                { translation: 'GROUP.PICKUP' },
              ],
              beforeEnter: 'detail/routeEnter',
              afterLeave: 'detail/routeLeave',
            },
            components: {
              // On desktop will get redirected inside "detail/routeEnter" action
              default: MobileDetail,
            },
          },
          {
            name: 'storePickupsManage',
            path: 'pickups/manage',
            component: StorePickupsManage,
            meta: {
              breadcrumbs: [
                { translation: 'PICKUPMANAGE.TITLE', route: { name: 'storePickupsManage' } },
              ],
              beforeEnter: 'pickupSeries/fetchListForActiveStore',
              afterLeave: 'pickupSeries/clearList',
            },
          },
          {
            name: 'storeFeedback',
            path: 'feedback',
            meta: {
              breadcrumbs: [
                { translation: 'PICKUP_FEEDBACK.TITLE', route: { name: 'storeFeedback' } },
              ],
              beforeEnter: 'feedback/setStoreFilter',
              afterLeave: 'feedback/clearStoreFilter',
            },
            components: {
              default: StoreFeedback,
            },
          },
          {
            name: 'storeHistory',
            path: 'history',
            component: StoreHistory,
            meta: {
              breadcrumbs: [
                { translation: 'GROUP.HISTORY', route: { name: 'storeHistory' } },
              ],
              beforeEnter: 'history/fetchForStore',
            },
          },
          {
            name: 'storeEdit',
            path: 'edit',
            meta: {
              breadcrumbs: [
                { translation: 'STOREDETAIL.EDIT', route: { name: 'storeEdit' } },
              ],
            },
            component: StoreEdit,
          },
        ],
      },
      {
        name: 'pickupFeedback',
        path: 'give-feedback/:feedbackId?',
        meta: {
          breadcrumbs: [
            { translation: 'PICKUP_FEEDBACK.TITLE', route: { name: 'pickupFeedback' } },
          ],
          beforeEnter: 'feedback/select',
          afterLeave: 'feedback/clearForm',
        },
        components: {
          default: PickupFeedback,
          sidenav: GroupGroupSidenav,
        },
      },
    ],
  },
  {
    name: 'map',
    path: '/group/:groupId/map',
    meta: {
      requireLoggedIn: true,
      breadcrumbs: [
        { type: 'currentGroup' },
        { translation: 'GROUPMAP.TITLE', route: { name: 'map' } },
      ],
      beforeEnter: 'currentGroup/select',
    },
    components: {
      default: GroupMap,
    },
  },
  {
    name: 'settings',
    path: '/settings',
    meta: {
      requireLoggedIn: true,
      breadcrumbs: [
        { translation: 'SETTINGS.TITLE', route: { name: 'settings' } },
      ],
      afterLeave: 'auth/clearSettingsStatus',
    },
    components: {
      default: Settings,
    },
  },
  {
    name: 'user',
    path: '/user/:userId',
    meta: {
      requireLoggedIn: true,
      breadcrumbs: [
        { type: 'activeUser' },
      ],
      beforeEnter: 'users/selectUser',
      afterLeave: 'users/clearSelectedUser',
    },
    components: {
      default: User,
    },
  },
]
<commit_msg>slightly unify route property order<commit_after>const GroupLayout = () => import('@/components/Layout/GroupLayout')
const GroupWall = () => import('@/pages/Group/Wall')
const GroupPickups = () => import('@/pages/Group/Pickups')
const GroupFeedback = () => import('@/pages/Group/Feedbacks')
const GroupMap = () => import('@/pages/Map')
const GroupSettings = () => import('@/pages/Group/Settings')
const GroupEdit = () => import('@/pages/Group/Edit')
const GroupManageAgreement = () => import('@/pages/Group/ManageAgreement')
const GroupCreate = () => import('@/pages/Group/Create')
const GroupPreview = () => import('@/pages/GroupPreview')
const GroupGallery = () => import('@/pages/GroupGallery')
const StoreLayout = () => import('@/pages/Store/Layout')
const StorePickups = () => import('@/pages/Store/Pickups')
const StoreFeedback = () => import('@/pages/Store/Feedbacks')
const StoreHistory = () => import('@/pages/Store/History')
const StorePickupsManage = () => import('@/pages/Store/PickupsManage')
const StoreEdit = () => import('@/pages/Store/Edit')
const StoreCreate = () => import('@/pages/Store/Create')
const StoreList = () => import('@/pages/Store/Stores')
const HistoryDetail = () => import('@/pages/HistoryDetail')
const GroupInvitations = () => import('@/pages/Group/Invitations')
const GroupDescription = () => import('@/pages/Group/Description')
const GroupMembers = () => import('@/pages/Group/Members')
const GroupHistory = () => import('@/pages/Group/History')
const GroupMapAndStoresSidenav = () => import('@/components/Sidenav/SidenavMapAndStores')
const GroupGroupSidenav = () => import('@/components/Sidenav/SidenavGroup')
const GroupStoreSidenav = () => import('@/components/Sidenav/SidenavStore')
const Settings = () => import('@/pages/Settings')
const User = () => import('@/pages/User/User')
const PickupFeedback = () => import('@/pages/Group/Feedback')
const MobileDetail = () => import('@/pages/MobileDetail')

export default [
  {
    name: 'groupsGallery',
    path: '/groupPreview',
    meta: {
      breadcrumbs: [
        { translation: 'JOINGROUP.ALL_GROUPS' },
      ],
    },
    components: {
      fullPage: GroupGallery,
    },
  },
  {
    name: 'groupPreview',
    path: '/groupPreview/:groupPreviewId',
    meta: {
      breadcrumbs: [
        { translation: 'JOINGROUP.ALL_GROUPS', route: { name: 'groupsGallery' } },
        { type: 'activeGroupPreview' },
      ],
      beforeEnter: 'groups/selectPreview',
      afterLeave: 'groups/clearGroupPreview',
    },
    components: {
      default: GroupPreview,
    },
  },
  {
    name: 'groupCreate',
    path: '/group/create',
    meta: {
      requireLoggedIn: true,
      breadcrumbs: [
        { translation: 'JOINGROUP.ALL_GROUPS', route: { name: 'groupsGallery' } },
        { translation: 'GROUP.CREATE_TITLE', route: { name: 'groupCreate' } },
      ],
      beforeEnter: 'timezones/fetch',
    },
    components: {
      default: GroupCreate,
    },
  },
  {
    name: 'historyDetail',
    path: '/history/:historyId',
    meta: {
      requireLoggedIn: true,
      breadcrumbs: [
        { translation: 'HISTORY.DETAILS', route: { name: 'historyDetail' } },
      ],
      beforeEnter: 'history/setActive',
      afterLeave: 'history/clearActive',
    },
    components: {
      default: HistoryDetail,
    },
  },
  {
    path: '/group/:groupId',
    redirect: '/group/:groupId/wall',
    meta: {
      requireLoggedIn: true,
      breadcrumbs: [
        { type: 'currentGroup' },
      ],
      beforeEnter: 'currentGroup/select',
    },
    components: {
      default: GroupLayout,
      sidenav: GroupMapAndStoresSidenav,
    },
    children: [
      {
        name: 'group',
        path: 'wall',
        components: {
          default: GroupWall,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupPickups',
        path: 'pickups',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.PICKUPS', route: { name: 'groupPickups' } },
          ],
        },
        components: {
          default: GroupPickups,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupFeedback',
        path: 'feedback',
        meta: {
          breadcrumbs: [
            { translation: 'PICKUP_FEEDBACK.TITLE', route: { name: 'groupFeedback' } },
          ],
        },
        components: {
          default: GroupFeedback,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupDescription',
        path: 'description',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.DESCRIPTION', route: { name: 'groupDescription' } },
          ],
        },
        components: {
          default: GroupDescription,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupMembers',
        path: 'members',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.MEMBERS', route: { name: 'groupMembers' } },
          ],
        },
        components: {
          default: GroupMembers,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupHistory',
        path: 'history',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.HISTORY', route: { name: 'groupHistory' } },
          ],
          beforeEnter: 'history/fetchForGroup',
        },
        components: {
          default: GroupHistory,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupInvitations',
        path: 'invites',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.INVITATIONS', route: { name: 'groupInvitations' } },
          ],
          beforeEnter: 'invitations/fetch',
        },
        components: {
          default: GroupInvitations,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupEdit',
        path: 'edit',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.EDIT', route: { name: 'groupEdit' } },
          ],
          beforeEnter: 'timezones/fetch',
        },
        components: {
          default: GroupEdit,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupSettings',
        path: 'settings',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.SETTINGS', route: { name: 'groupSettings' } },
          ],
        },
        components: {
          default: GroupSettings,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'groupManageAgreement',
        path: 'agreement',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.MANAGE_AGREEMENT', route: { name: 'groupManageAgreement' } },
          ],
        },
        components: {
          default: GroupManageAgreement,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        name: 'stores',
        path: 'store',
        meta: {
          breadcrumbs: [
            { translation: 'GROUP.STORES', route: { name: 'stores' } },
          ],
        },
        components: {
          default: StoreList,
          sidenav: GroupStoreSidenav,
        },
      },
      {
        name: 'storeCreate',
        path: 'store/create',
        meta: {
          breadcrumbs: [
            { translation: 'CREATESTORE.TITLE', route: { name: 'storeCreate' } },
          ],
        },
        components: {
          default: StoreCreate,
          sidenav: GroupGroupSidenav,
        },
      },
      {
        redirect: '/group/:groupId/store/:storeId/wall',
        path: 'store/:storeId',
        meta: {
          breadcrumbs: [
            { type: 'activeStore' },
          ],
          beforeEnter: 'stores/selectStore',
          afterLeave: 'stores/clearSelectedStore',
        },
        components: {
          default: StoreLayout,
          sidenav: GroupGroupSidenav,
          secondSidenav: GroupStoreSidenav,
        },
        children: [
          {
            name: 'store',
            path: '',
            redirect: 'pickups',
          },
          {
            name: 'storePickups',
            path: 'pickups',
            component: StorePickups,
          },
          {
            name: 'pickupDetail',
            path: 'pickups/:pickupId/detail',
            meta: {
              requiredLoggedIn: true,
              breadcrumbs: [
                { translation: 'GROUP.PICKUP' },
              ],
              beforeEnter: 'detail/routeEnter',
              afterLeave: 'detail/routeLeave',
            },
            // On desktop will get redirected inside "detail/routeEnter" action
            component: MobileDetail,
          },
          {
            name: 'storePickupsManage',
            path: 'pickups/manage',
            meta: {
              breadcrumbs: [
                { translation: 'PICKUPMANAGE.TITLE', route: { name: 'storePickupsManage' } },
              ],
              beforeEnter: 'pickupSeries/fetchListForActiveStore',
              afterLeave: 'pickupSeries/clearList',
            },
            component: StorePickupsManage,
          },
          {
            name: 'storeFeedback',
            path: 'feedback',
            meta: {
              breadcrumbs: [
                { translation: 'PICKUP_FEEDBACK.TITLE', route: { name: 'storeFeedback' } },
              ],
              beforeEnter: 'feedback/setStoreFilter',
              afterLeave: 'feedback/clearStoreFilter',
            },
            component: StoreFeedback,
          },
          {
            name: 'storeHistory',
            path: 'history',
            meta: {
              breadcrumbs: [
                { translation: 'GROUP.HISTORY', route: { name: 'storeHistory' } },
              ],
              beforeEnter: 'history/fetchForStore',
            },
            component: StoreHistory,
          },
          {
            name: 'storeEdit',
            path: 'edit',
            meta: {
              breadcrumbs: [
                { translation: 'STOREDETAIL.EDIT', route: { name: 'storeEdit' } },
              ],
            },
            component: StoreEdit,
          },
        ],
      },
      {
        name: 'pickupFeedback',
        path: 'give-feedback/:feedbackId?',
        meta: {
          breadcrumbs: [
            { translation: 'PICKUP_FEEDBACK.TITLE', route: { name: 'pickupFeedback' } },
          ],
          beforeEnter: 'feedback/select',
          afterLeave: 'feedback/clearForm',
        },
        components: {
          default: PickupFeedback,
          sidenav: GroupGroupSidenav,
        },
      },
    ],
  },
  {
    name: 'map',
    path: '/group/:groupId/map',
    meta: {
      requireLoggedIn: true,
      breadcrumbs: [
        { type: 'currentGroup' },
        { translation: 'GROUPMAP.TITLE', route: { name: 'map' } },
      ],
      beforeEnter: 'currentGroup/select',
    },
    components: {
      default: GroupMap,
    },
  },
  {
    name: 'settings',
    path: '/settings',
    meta: {
      requireLoggedIn: true,
      breadcrumbs: [
        { translation: 'SETTINGS.TITLE', route: { name: 'settings' } },
      ],
      afterLeave: 'auth/clearSettingsStatus',
    },
    components: {
      default: Settings,
    },
  },
  {
    name: 'user',
    path: '/user/:userId',
    meta: {
      requireLoggedIn: true,
      breadcrumbs: [
        { type: 'activeUser' },
      ],
      beforeEnter: 'users/selectUser',
      afterLeave: 'users/clearSelectedUser',
    },
    components: {
      default: User,
    },
  },
]
<|endoftext|>


<commit_before>import React from 'react'

import Preview from './Preview'
import icon from './icon.png'

const id = 'search-web'
const order = 11

/**
 * Search term in google
 *
 * @param  {String} options.term
 * @param  {Object} options.actions
 * @param  {Function} options.display
 */
const googlePlugin = ({ term, actions, display }) => {
  /**
   * Open browser with google search of term
   * @param  {String} searchTerm
   */
  const search = (searchTerm) => {
    const q = encodeURIComponent(searchTerm)
    actions.open(`https://google.com/?q=${q}#newwindow=1&q=${q}`)
    actions.hideWindow()
  }

  display({
    id,
    icon,
    order,
    title: `Search web for ${term}`,
    onSelect: () => search(term),
    getPreview: () => <Preview query={term} key={term} search={search} />
  })
}

export default {
  fn: googlePlugin,
}
<commit_msg>hotfix: search is not defined in google plugin<commit_after>import React from 'react'

import Preview from './Preview'
import icon from './icon.png'

const id = 'search-web'
const order = 11

/**
 * Search term in google
 *
 * @param  {String} options.term
 * @param  {Object} options.actions
 * @param  {Function} options.display
 */
const googlePlugin = ({ term, actions, display }) => {
  /**
   * Open browser with google search of term
   * @param  {String} searchTerm
   */
  // eslint-disable-next-line no-var
  var search = (searchTerm) => {
    const q = encodeURIComponent(searchTerm)
    actions.open(`https://google.com/?q=${q}#newwindow=1&q=${q}`)
    actions.hideWindow()
  }

  display({
    id,
    icon,
    order,
    title: `Search web for ${term}`,
    onSelect: () => search(term),
    getPreview: () => <Preview query={term} key={term} search={search} />
  })
}

export default {
  fn: googlePlugin,
}
<|endoftext|>


<commit_before>const sinon = require('sinon');
const { expect } = require('chai');
const bootstrap = require('../test_helper');
const { decode, encode } = require('base64url');

describe('BaseToken', () => {
  before(bootstrap(__dirname)); // provider

  afterEach(function () {
    this.adapter.find.reset();
    this.adapter.upsert.reset();
  });

  before(function () {
    this.adapter = this.TestAdapter.for('AccessToken');
    sinon.spy(this.adapter, 'find');
    sinon.spy(this.adapter, 'upsert');
  });

  after(function () {
    this.adapter.find.restore();
    this.adapter.upsert.restore();
  });

  it('handles expired tokens', async function () {
    const token = await new this.provider.AccessToken({
      grantId: 'foo',
    }).save();
    const jti = token.substring(0, 48);
    const stored = this.adapter.syncFind(jti);
    const payload = JSON.parse(decode(stored.payload));
    payload.exp = 0;
    stored.payload = encode(JSON.stringify(payload));
    expect(await this.provider.AccessToken.find(token)).to.be.undefined;
  });

  it('returns undefined for not found tokens', async function () {
    expect(await this.provider.AccessToken.find('MDQ0OWNjM2YtMzgzYi00M2FmLWJiNWItYWRhZjBjY2Y1ODY10FJ-UgHXVVUXSS-G5c8rn-YsfV4OlH5e1f_MneAvRyqwV6rIvC2Uq0')).to.be.undefined;
    expect(this.adapter.find.calledOnce).to.be.true;
  });

  it('assigns returned consumed prop', async function () {
    const token = await new this.provider.AccessToken({
      grantId: 'foo',
    }).save();
    const jti = token.substring(0, 48);
    const stored = this.adapter.syncFind(jti);
    stored.consumed = true;
    expect(await this.provider.AccessToken.find(token)).to.have.property('consumed', true);
  });

  it('uses expiration for upsert from global settings if not specified in token values', async function () {
    const token = await new this.provider.AccessToken({
      grantId: 'foo',
    }).save();
    const jti = token.substring(0, 48);
    expect(this.adapter.upsert.calledWith(jti, sinon.match({}), 3600));
  });

  it('uses expiration for upsert from token values', async function () {
    const token = await new this.provider.AccessToken({
      grantId: 'foo',
      expiresIn: 60,
    }).save();
    const jti = token.substring(0, 48);
    expect(this.adapter.upsert.calledWith(jti, sinon.match({}), 60));
  });
});
<commit_msg>fix upsert basetoken expiration tests<commit_after>const sinon = require('sinon');
const { expect } = require('chai');
const bootstrap = require('../test_helper');
const { decode, encode } = require('base64url');

describe('BaseToken', () => {
  before(bootstrap(__dirname)); // provider

  afterEach(function () {
    this.adapter.find.reset();
    this.adapter.upsert.reset();
  });

  before(function () {
    this.adapter = this.TestAdapter.for('AccessToken');
    sinon.spy(this.adapter, 'find');
    sinon.spy(this.adapter, 'upsert');
  });

  after(function () {
    this.adapter.find.restore();
    this.adapter.upsert.restore();
  });

  it('handles expired tokens', async function () {
    const token = await new this.provider.AccessToken({
      grantId: 'foo',
    }).save();
    const jti = token.substring(0, 48);
    const stored = this.adapter.syncFind(jti);
    const payload = JSON.parse(decode(stored.payload));
    payload.exp = 0;
    stored.payload = encode(JSON.stringify(payload));
    expect(await this.provider.AccessToken.find(token)).to.be.undefined;
  });

  it('returns undefined for not found tokens', async function () {
    expect(await this.provider.AccessToken.find('MDQ0OWNjM2YtMzgzYi00M2FmLWJiNWItYWRhZjBjY2Y1ODY10FJ-UgHXVVUXSS-G5c8rn-YsfV4OlH5e1f_MneAvRyqwV6rIvC2Uq0')).to.be.undefined;
    expect(this.adapter.find.calledOnce).to.be.true;
  });

  it('assigns returned consumed prop', async function () {
    const token = await new this.provider.AccessToken({
      grantId: 'foo',
    }).save();
    const jti = token.substring(0, 48);
    const stored = this.adapter.syncFind(jti);
    stored.consumed = true;
    expect(await this.provider.AccessToken.find(token)).to.have.property('consumed', true);
  });

  it('uses expiration for upsert from global settings if not specified in token values', async function () {
    const token = await new this.provider.AccessToken({
      grantId: 'foo',
    }).save();
    const jti = token.substring(0, 48);
    expect(this.adapter.upsert.calledWith(jti, sinon.match({}), 3600)).to.be.true;
  });

  it('uses expiration for upsert from token values', async function () {
    const token = await new this.provider.AccessToken({
      grantId: 'foo',
      expiresIn: 60,
    }).save();
    const jti = token.substring(0, 48);
    expect(this.adapter.upsert.calledWith(jti, sinon.match({}), 60)).to.be.true;
  });
});
<|endoftext|>


<commit_before>const Module = require('module')
const path = require('path')
const resolveFrom = require('resolve-from')
const node_modules = path.resolve(__dirname, 'node_modules')
const originalRequire = Module.prototype.require

const nodeType = process.env.NODE_TYPE
const domainType = nodeType?.toLowerCase() === 'network' ? 'network' : 'domain'

Module.prototype.require = function (modulePath) {
  // Only redirect resolutions to non-relative and non-absolute modules
  if (
    ['/react/', '/react-dom/', '/react-query/'].some((d) => {
      try {
        return require.resolve(modulePath).includes(d)
      } catch (err) {
        return false
      }
    })
  ) {
    try {
      modulePath = resolveFrom(node_modules, modulePath)
    } catch (err) {
      //
    }
  }

  return originalRequire.call(this, modulePath)
}

module.exports = {
  typescript: {
    ignoreDevErrors: true,
    ignoreBuildErrors: true,
  },
  eslint: {
    // Warning: This allows production builds to successfully complete even if
    // your project has ESLint errors.
    ignoreDuringBuilds: true,
  },
  webpackDevMiddleware: (config) => {
    config.watchOptions = {
      poll: 1000,
      aggregateTimeout: 300,
    }
    return config
  },
  webpack: (config) => {
    config.resolve = {
      ...config.resolve,
      alias: {
        ...config.resolve.alias,
        react$: resolveFrom(path.resolve('node_modules'), 'react'),
        'react-query$': resolveFrom(
          path.resolve('node_modules'),
          'react-query'
        ),
        'react-dom$': resolveFrom(path.resolve('node_modules'), 'react-dom'),
      },
    }
    return config
  },
  env: {
    NEXT_PUBLIC_VERSION: process.env.VERSION,
    NEXT_PUBLIC_VERSION_HASH: process.env.VERSION_HASH,
    NEXT_PUBLIC_NODE_TYPE: process.env.NODE_TYPE,
  },
  async redirects() {
    return [
      {
        source: '/_network/:path*',
        destination: '/:path*',
        permanent: false,
      },
      {
        source: '/_domain/:path*',
        destination: '/:path*',
        permanent: false,
      },
    ]
  },
  async rewrites() {
    return [
      {
        source: '/:path*',
        destination: `/_${domainType}/:path*`,
      },
    ]
  },
}
<commit_msg>feat: wip: trim next.config.js<commit_after>const nodeType = process.env.NODE_TYPE
const domainType = nodeType?.toLowerCase() === 'network' ? 'network' : 'domain'

module.exports = {
  typescript: {
    ignoreDevErrors: true,
    ignoreBuildErrors: true,
  },
  eslint: {
    // Warning: This allows production builds to successfully complete even if
    // your project has ESLint errors.
    ignoreDuringBuilds: true,
  },
  env: {
    NEXT_PUBLIC_VERSION: process.env.VERSION,
    NEXT_PUBLIC_VERSION_HASH: process.env.VERSION_HASH,
    NEXT_PUBLIC_NODE_TYPE: process.env.NODE_TYPE,
  },
  async redirects() {
    return [
      {
        source: '/_network/:path*',
        destination: '/:path*',
        permanent: false,
      },
      {
        source: '/_domain/:path*',
        destination: '/:path*',
        permanent: false,
      },
    ]
  },
  async rewrites() {
    return [
      {
        source: '/:path*',
        destination: `/_${domainType}/:path*`,
      },
    ]
  },
}
<|endoftext|>


<commit_before><commit_msg>cleaned up comments and program flow<commit_after><|endoftext|>


<commit_before>const { OFF, ERROR } = require('../const')

module.exports = {
    rules: {
        'comma-dangle': [ ERROR, 'only-multiline'],
        'semi': [ ERROR, 'never'],
        'indent': [ ERROR, 4, {
            'SwitchCase': 1,
            'VariableDeclarator': 1
        }],
        'padded-blocks': [ ERROR, 'always'],
        'max-len': [ ERROR, 120, 4, {
            'ignoreUrls': true,
            'ignoreComments': false
        }],
        'no-underscore-dangle': [ OFF ],
        'array-bracket-spacing': [2, 'always'],
        'newline-before-return': [ ERROR ],
        'no-multiple-empty-lines': [ ERROR, { 'max': 1 }]
    }
}<commit_msg>Add 'quotes' rule<commit_after>const { OFF, ERROR } = require('../const')

module.exports = {
    rules: {
        'comma-dangle': [ ERROR, 'only-multiline'],
        'semi': [ ERROR, 'never'],
        'indent': [ ERROR, 4, {
            'SwitchCase': 1,
            'VariableDeclarator': 1
        }],
        'padded-blocks': [ ERROR, 'always'],
        'max-len': [ ERROR, 120, 4, {
            'ignoreUrls': true,
            'ignoreComments': false
        }],
        'quotes': [ ERROR, 'single' ],
        'no-underscore-dangle': [ OFF ],
        'array-bracket-spacing': [2, 'always'],
        'newline-before-return': [ ERROR ],
        'no-multiple-empty-lines': [ ERROR, { 'max': 1 }]
    }
}<|endoftext|>


<commit_before>var util = require('../util');
var u = require('azure-mobile-apps/src/auth/user');
var sql = require('mssql');

var api = {

    all: function (req, res, next) {
        console.log('In: api/tertulias');
        return next();
    },

    get: function (req, res, next) {

        var connection = new sql.Connection(util.sqlConfiguration);

        connection.connect(function(err) {

            if (err) {
                console.log('An error ocurred while connecting to the database. Aborting');
                console.log(isError);
                res.sendStatus(500);
                return;
            }

            var transaction = new sql.Transaction(connection);

            transaction.begin(function(err) {

                if (err) { transaction.rollback(); return; }

                var rolledback = false;
                transaction.on('rollback', function(aborted) { rolledback = true; });

                var sqlRequest = new sql.Request(transaction);

                var _userId = "";

                var queryString = 'SELECT id FROM Users WHERE sid=@sid;';

                var preparedStatement = new sql.PreparedStatement();

                preparedStatement.input('sid', sql.String);

                preparedStatement.prepare(queryString, funtion(err) {
                    preparedStatement.execute({ sid: req.azureMobile.user.id },
                        function(err, recordset, affected) {
                            console.log('preparedStatement result');
                            console.log(recordset);
                        });
                    preparedStatement.unprepare();
                });

            });

        });

    }
/*
    ,

    post: function (req, res, next) {
        console.log('In: post');
        console.log(req.azureMobile.user.id);
        console.log(req.body);
        var query = {
            sql: 'INSERT INTO Terulias(title, subject, schedule, privacy) VALUES (@title, @subject, @schedule, @privacy)',
            parameters: [
                {name: 'title', value: req.body.title || ""},
                {name: 'subject', value: req.body.subject || ""},
                {name: 'schedule', value: req.body.schedule || "0"},
                {name: 'privacy', value: req.body.privacy || "0"},
            ]
        };
        console.log(query);
        var query1 = {
            sql: 'SELECT id FROM Users WHERE sid=@userSid',
            parameters: [
                {name: 'userSid', value: req.azureMobile.user.id }
            ]
        };
        console.log(query1);
        var query2 = {
            sql: 'SELECT id FROM Roles WHERE roleName=@roleName',
            parameters: [
                {name: 'roleName', value: 'admin' }
            ]
        };
        console.log(query2);
        var query3 = {
            sql: 'INSERT INTO Members(tertulia, usr, role) VALUES (@tertuliaId, @usrId, @roleId)',
            parameters: [
                {name: 'tertuliaId', value: req.body.title || ""},
                {name: 'usrId', value: req.body.subject || ""},
                {name: 'roleId', value: req.body.schedule || "0"},
            ]
        };
        console.log(query3);
        res.sendStatus(200);
        return next();
    }
*/

};

api.access = 'authenticated';
module.exports = api;
<commit_msg>another<commit_after>var util = require('../util');
var u = require('azure-mobile-apps/src/auth/user');
var sql = require('mssql');

var api = {

    all: function (req, res, next) {
        console.log('In: api/tertulias');
        return next();
    },

    get: function (req, res, next) {

        var connection = new sql.Connection(util.sqlConfiguration);

        connection.connect(function(err) {

            if (err) {console.log(isError); res.sendStatus(500); return; }

            var transaction = new sql.Transaction(connection);

            transaction.begin(function(err) {

                if (err) { transaction.rollback(); return; }

                var rolledback = false;
                transaction.on('rollback', function(aborted) { rolledback = true; });

                var sqlRequest = new sql.Request(transaction);

                var _userId = '';

                var queryString = 'SELECT id FROM Users WHERE sid=@sid;';

                var preparedStatement = new sql.PreparedStatement();

                preparedStatement.input('sid', sql.String);

                preparedStatement.prepare(queryString, funtion(err) {
                    if (err) { transaction.rollback(); return; }
                    preparedStatement.execute({ sid: req.azureMobile.user.id },
                        function(err, recordset, affected) {
                            if (err) { transaction.rollback(); return; }
                            console.log('preparedStatement result');
                            console.log(recordset);
                            transaction.rollback();
                            preparedStatement.unprepare();
                        }
                    );
                });

            });

        });

    }
/*
    ,

    post: function (req, res, next) {
        console.log('In: post');
        console.log(req.azureMobile.user.id);
        console.log(req.body);
        var query = {
            sql: 'INSERT INTO Terulias(title, subject, schedule, privacy) VALUES (@title, @subject, @schedule, @privacy)',
            parameters: [
                {name: 'title', value: req.body.title || ""},
                {name: 'subject', value: req.body.subject || ""},
                {name: 'schedule', value: req.body.schedule || "0"},
                {name: 'privacy', value: req.body.privacy || "0"},
            ]
        };
        console.log(query);
        var query1 = {
            sql: 'SELECT id FROM Users WHERE sid=@userSid',
            parameters: [
                {name: 'userSid', value: req.azureMobile.user.id }
            ]
        };
        console.log(query1);
        var query2 = {
            sql: 'SELECT id FROM Roles WHERE roleName=@roleName',
            parameters: [
                {name: 'roleName', value: 'admin' }
            ]
        };
        console.log(query2);
        var query3 = {
            sql: 'INSERT INTO Members(tertulia, usr, role) VALUES (@tertuliaId, @usrId, @roleId)',
            parameters: [
                {name: 'tertuliaId', value: req.body.title || ""},
                {name: 'usrId', value: req.body.subject || ""},
                {name: 'roleId', value: req.body.schedule || "0"},
            ]
        };
        console.log(query3);
        res.sendStatus(200);
        return next();
    }
*/

};

api.access = 'authenticated';
module.exports = api;
<|endoftext|>


<commit_before>s4aTempDict = {

    /*
       Special characters: (see <http://0xcc.net/jsescape/>)

       Ä, ä   \u00c4, \u00e4
       Ö, ö   \u00d6, \u00f6
       Ü, ü   \u00dc, \u00fc
       ß      \u00df
       */
    // primitive blocks:

    /*
       Attention Translators:
       ----------------------
       At this time your translation of block specs will only work
       correctly, if the order of formal parameters and their types
       are unchanged. Placeholders for inputs (formal parameters) are
       indicated by a preceding % prefix and followed by a type
       abbreviation.

       For example:

       'say %s for %n secs'

       can currently not be changed into

       'say %n secs long %s'

       and still work as intended.

       Similarly

       'point towards %dst'

       cannot be changed into

       'point towards %cst'

       without breaking its functionality.
       */

    // arduino:

    'digital input':
        'entrada digital',

    'digital output':
        'sortida digital',

    'PWM':
        'PWM',

    'servo':
        'servo',

    'clockwise':
        'sentit horari',

    'clockwise (1500-1000)':
        'sentit horari (1500-1000)',

    'counter-clockwise':
        'sentit anti-horari',

    'counter-clockwise (1500-2000)':
        'sentit anti-horari (1500-2000)',

    'stopped':
        'aturat',

    'stopped (1500)':
        'aturat (1500)',

    'disconnected':
        'desconnectat',

    'angle (0-180)':
        'angle (0-180)',

    'connect to Arduino':
        'connecta a Arduino',

    'disconnect Arduino':
        'desconnecta Arduino',

    'Connect Arduino':
        'Connecta Arduino',

    'Disconnect Arduino':
        'Desconnecta Arduino',

    'analog reading %analogPin':
        'lectura analògica %analogPin',

    'digital reading %digitalPin':
        'lectura digital %digitalPin',

    'connect arduino at %s':
        'connecta l\'Arduino al port %s',

    'disconnect arduino':
        'desconnecta l\'Arduino',

    'setup digital pin %digitalPin as %pinMode':
        'configura pin %digitalPin com a %pinMode',

    'set digital pin %digitalPin to %b':
        'posa el pin digital %digitalPin a %b',

    'set servo %servoPin to %servoValue':
        'posa el servo %servoPin a %servoValue',

    'set pin %pwmPin to value %n':
        'posa el pin %pwmPin al valor %n',

    'Connecting board at port\n':
        'Connectant placa al port\n',

    'An Arduino board has been connected. Happy prototyping!':
        'S\'ha connectat correctament una placa Arduino.\nFeliç prototipatge!',

    'Board was disconnected from port\n':
        'S\'ha desconnectat la placa del port\n',

    'It seems that someone pulled the cable!':
        'Sembla que algú ha desconnectat el cable!',

    'Error connecting the board.':
        'Error en connectar a la placa',

    'There is already a board connected to this sprite':
        'Aquest objecte ja té una placa connectada',

    'Could not connect an Arduino\nNo boards found':
        'No s\'ha pogut connectar cap Arduino\nNo s\'ha trobat cap placa',

    'Could not talk to Arduino in port\n':
        'No s\'ha pogut establir comunicació amb Arduino al port\n',

    'Check if firmata is loaded.':
        'Reviseu que Firmata hi estigui carregat.',

    'An error was detected on the board\n\n':
        'S\'ha detectat un error a la placa\n\n',

    'Board is not connected':
        'La placa no està connectada',

    'New Arduino translatable project':
        'Nou projecte traduïble a Arduino',

    'select a port':
        'selecciona un port',

    'Network port':
        'Port de xarxa',

    'Enter hostname or ip address:':
        'Introdueix el nom de l\'host o adreça IP',

    'Connecting to network port:\n':
        'Connectant a port de xarxa:\n',

    'This may take a few seconds...':
        'Aquesta operació pot trigar uns segons...',

    'Network serial ports':
        'Ports sèrie sobre xarxa'
};

// Add attributes to original SnapTranslator.dict.ca
for (var attrname in s4aTempDict) { SnapTranslator.dict.ca[attrname] = s4aTempDict[attrname]; }
<commit_msg>Updating catalan translation<commit_after>s4aTempDict = {

    /*
       Special characters: (see <http://0xcc.net/jsescape/>)

       Ä, ä   \u00c4, \u00e4
       Ö, ö   \u00d6, \u00f6
       Ü, ü   \u00dc, \u00fc
       ß      \u00df
       */
    // primitive blocks:

    /*
       Attention Translators:
       ----------------------
       At this time your translation of block specs will only work
       correctly, if the order of formal parameters and their types
       are unchanged. Placeholders for inputs (formal parameters) are
       indicated by a preceding % prefix and followed by a type
       abbreviation.

       For example:

       'say %s for %n secs'

       can currently not be changed into

       'say %n secs long %s'

       and still work as intended.

       Similarly

       'point towards %dst'

       cannot be changed into

       'point towards %cst'

       without breaking its functionality.
       */

    // arduino:

    'digital input':
        'entrada digital',

    'digital output':
        'sortida digital',

    'PWM':
        'PWM',

    'servo':
        'servo',

    'clockwise':
        'sentit horari',

    'clockwise (1500-1000)':
        'sentit horari (1500-1000)',

    'counter-clockwise':
        'sentit anti-horari',

    'counter-clockwise (1500-2000)':
        'sentit anti-horari (1500-2000)',

    'stopped':
        'aturat',

    'stopped (1500)':
        'aturat (1500)',

    'disconnected':
        'desconnectat',

    'angle (0-180)':
        'angle (0-180)',

    'connect to Arduino':
        'connecta a Arduino',

    'disconnect Arduino':
        'desconnecta Arduino',

    'Connect Arduino':
        'Connecta Arduino',

    'Disconnect Arduino':
        'Desconnecta Arduino',

    'analog reading %analogPin':
        'lectura analògica %analogPin',

    'digital reading %digitalPin':
        'lectura digital %digitalPin',

    'connect arduino at %s':
        'connecta l\'Arduino al port %s',

    'disconnect arduino':
        'desconnecta l\'Arduino',

    'setup digital pin %digitalPin as %pinMode':
        'configura pin %digitalPin com a %pinMode',

    'set digital pin %digitalPin to %b':
        'posa el pin digital %digitalPin a %b',

    'set servo %servoPin to %servoValue':
        'posa el servo %servoPin a %servoValue',

    'set pin %pwmPin to value %n':
        'posa el pin %pwmPin al valor %n',

    'Connecting board at port\n':
        'Connectant placa al port\n',

    'An Arduino board has been connected. Happy prototyping!':
        'S\'ha connectat correctament una placa Arduino.\nFeliç prototipatge!',

    'Board was disconnected from port\n':
        'S\'ha desconnectat la placa del port\n',

    'It seems that someone pulled the cable!':
        'Sembla que algú ha desconnectat el cable!',

    'Error connecting the board.':
        'Error en connectar a la placa',

    'There is already a board connected to this sprite':
        'Aquest objecte ja té una placa connectada',

    'Could not connect an Arduino\nNo boards found':
        'No s\'ha pogut connectar cap Arduino\nNo s\'ha trobat cap placa',

    'Could not talk to Arduino in port\n':
        'No s\'ha pogut establir comunicació amb Arduino al port\n',

    'Check if firmata is loaded.':
        'Reviseu que Firmata hi estigui carregat.',

    'An error was detected on the board\n\n':
        'S\'ha detectat un error a la placa\n\n',

    'Board is not connected':
        'La placa no està connectada',

    'New Arduino translatable project':
        'Nou projecte traduïble a Arduino',

    'select a port':
        'selecciona un port',

    'Network port':
        'Port de xarxa',

    'Enter hostname or ip address:':
        'Introdueix el nom de l\'host o adreça IP',

    'Connecting to network port:\n':
        'Connectant a port de xarxa:\n',

    'This may take a few seconds...':
        'Aquesta operació pot trigar uns segons...',

    'Network serial ports':
        'Ports sèrie sobre xarxa',

    'Open from URL...':
        'Obre des d\'una URL...',

    'Save and share':
        'Desa i comparteix'
};

// Add attributes to original SnapTranslator.dict.ca
for (var attrname in s4aTempDict) { SnapTranslator.dict.ca[attrname] = s4aTempDict[attrname]; }
<|endoftext|>


<commit_before><commit_msg>markdown target='_blank'<commit_after><|endoftext|>


<commit_before>s4aTempDict = {

    /*
       Special characters: (see <http://0xcc.net/jsescape/>)

       Ä, ä   \u00c4, \u00e4
       Ö, ö   \u00d6, \u00f6
       Ü, ü   \u00dc, \u00fc
       ß      \u00df
       */
    // primitive blocks:

    /*
       Attention Translators:
       ----------------------
       At this time your translation of block specs will only work
       correctly, if the order of formal parameters and their types
       are unchanged. Placeholders for inputs (formal parameters) are
       indicated by a preceding % prefix and followed by a type
       abbreviation.

       For example:

       'say %s for %n secs'

       can currently not be changed into

       'say %n secs long %s'

       and still work as intended.

       Similarly

       'point towards %dst'

       cannot be changed into

       'point towards %cst'

       without breaking its functionality.
       */

    // arduino:

    'digital input':
        '디지털 입력',

    'digital output':
        '디지털 출력',

    'PWM':
        'PWM',

    'servo':
        '서보',

    'clockwise':
        '시계 방향',

    'clockwise (1500-1000)':
        '시계 방향 (1500-1000)',

    'counter-clockwise':
        '반시계 방향',

    'counter-clockwise (1500-2000)':
        '반시계 방향 (1500-2000)',

    'stopped':
        '정지',

    'stopped (1500)':
        '정지 (1500)',

    'disconnected':
        '연결 끊김',

    'angle (0-180)':
        '각도(0-180)',

    'connect to Arduino':
        '아두이노 연결',

    'disconnect Arduino':
        '아두이노 연결 끊기',

    'Connect Arduino':
        '아두이노 연결',

    'Disconnect Arduino':
        '아두이노 연결 끊기',

    'analog reading %analogPin':
        '아날로그 입력 %analogPin번 핀',

    'digital reading %digitalPin':
        '디지털 입력 %digitalPin번 핀',

    'connect arduino at %s':
        '%s번 포트의 아두이노 연결',

    'disconnect arduino':
        '아두이노 연결 끊기',

    'setup digital pin %digitalPin as %pinMode':
        '디지털 핀 %digitalPin을 %pinMode로 설정',

    'set digital pin %digitalPin to %b':
        '디지털 핀 %digitalPin을 %b로 설정',

    'set servo %servoPin to %servoValue':
        '서보 핀 %servoPin을 %servoValue로 설정',

    'set pin %pwmPin to value %n':
        'pwm 핀 %pwmPin을 %n으로 설정',

    'Connecting board at port\n':
        '다음 포트의 보드를 연결:\n',

    'An Arduino board has been connected. Happy prototyping!':
        '아두이노 보드가 연결되었습니다!',

    'Board was disconnected from port\n':
        '다음 포트에서 보드 연결이 끊겼습니다.:\n',

    'It seems that someone pulled the cable!':
        '케이블이 뽑힌 것 같습니다.',

    'Error connecting the board.':
        '보드 연결에 오류가 발생했습니다.',

    'There is already a board connected to this sprite':
        '이 스프라이트에 이미 연결된 보드가 있습니다.',

    'Could not connect an Arduino\nNo boards found':
        '아두이노에 연결할 수 없습니다.\n아무 보드도 발견되지 않았습니다.',

    'Could not talk to Arduino in port\n':
        '다음 포트의 아두이노와 통신할 수 없습니다:\n',

    'Check if firmata is loaded.':
        'firmata가 로딩되었는지 확인하십시오.',

    'An error was detected on the board\n\n':
        '보드 오류가 감지되었습니다.\n\n',

    'Board is not connected':
        '보드가 연결되지 않았습니다.',

    'New Arduino translatable project':
        '새로운 아두이노 변환 가능 프로젝트',

    'select a port':
        '포트를 선택하십시오.',

    'Network port':
        '네트워크 포트',

    'Enter hostname or ip address:':
        'hostname이나 ip 주소를 입력하십시오:',

    'Connecting to network port:\n':
        '다음 네트워크 포트에 연결 중입니다:\n',

    'This may take a few seconds...':
        '몇 초가 걸릴 수 있습니다...',

    'Network serial ports':
        '네트워크 시리얼 포트'

    'Open from URL...':
        'URL로부터 열기...',

    'Save, share and get URL...':
        '저장, 공유하고 URL 얻기...',

    'This project is now public at the following URL:':
        '이 프로젝트는 다음 URL로 접근할 수 있습니다:',

    'About Snap4Arduino...':
        'Snap4Arduino에 대해...',

    'Snap4Arduino website':
        'Snap4Arduino 웹사이트',

    'Snap4Arduino repository':
        'Snap4Arduino 레포지터리',

    'Start a Snap Jr. session':
        'Snap Jr. 세션 시작하기',

    'Start Snap4Arduino in an\nicon-based blocks mode\nfor the youngest programmers':
        '어린 프로그래머를 위해,\nSnap4Arduino를 아이콘 기반 블록 모드로 시작합니다.',

    'Loading Snap Jr.':
        'Snap Jr. 로드 중'
};

// Please change the LANG keyword in the lines below by your locale's two-digit code in lowercase,
// like en for English, ca for Catalan, zh for Mandarin or de for German.

// Add attributes to original SnapTranslator.dict.ko
for (var attrname in s4aTempDict) { SnapTranslator.dict.ko[attrname] = s4aTempDict[attrname]; }
<commit_msg>fix syntax error, add some translations<commit_after>s4aTempDict = {

    /*
       Special characters: (see <http://0xcc.net/jsescape/>)

       Ä, ä   \u00c4, \u00e4
       Ö, ö   \u00d6, \u00f6
       Ü, ü   \u00dc, \u00fc
       ß      \u00df
       */
    // primitive blocks:

    /*
       Attention Translators:
       ----------------------
       At this time your translation of block specs will only work
       correctly, if the order of formal parameters and their types
       are unchanged. Placeholders for inputs (formal parameters) are
       indicated by a preceding % prefix and followed by a type
       abbreviation.

       For example:

       'say %s for %n secs'

       can currently not be changed into

       'say %n secs long %s'

       and still work as intended.

       Similarly

       'point towards %dst'

       cannot be changed into

       'point towards %cst'

       without breaking its functionality.
       */

    // arduino:

    'digital input':
        '디지털 입력',

    'digital output':
        '디지털 출력',

    'PWM':
        'PWM',

    'servo':
        '서보',

    'clockwise':
        '시계 방향',

    'clockwise (1500-1000)':
        '시계 방향 (1500-1000)',

    'counter-clockwise':
        '반시계 방향',

    'counter-clockwise (1500-2000)':
        '반시계 방향 (1500-2000)',

    'stopped':
        '정지',

    'stopped (1500)':
        '정지 (1500)',

    'disconnected':
        '연결 끊김',

    'angle (0-180)':
        '각도(0-180)',

    'connect to Arduino':
        '아두이노 연결',

    'disconnect Arduino':
        '아두이노 연결 끊기',

    'Connect Arduino':
        '아두이노 연결',

    'Disconnect Arduino':
        '아두이노 연결 끊기',

    'analog reading %analogPin':
        '아날로그 입력 %analogPin 번 핀',

    'digital reading %digitalPin':
        '디지털 입력 %digitalPin 번 핀',

    'connect arduino at %s':
        '%s 번 포트의 아두이노 연결하기',

    'disconnect arduino':
        '아두이노 연결 끊기',

    'arduino connected?':
        '아두이노 연결됨?',

    'setup digital pin %digitalPin as %pinMode':
        '디지털 핀 %digitalPin 을 %pinMode 로 설정하기',

    'set digital pin %digitalPin to %b':
        '디지털 핀 %digitalPin 을 %b 로 설정하기',

    'set servo %servoPin to %servoValue':
        '서보 핀 %servoPin 을 %servoValue 로 설정하기',

    'set pin %pwmPin to value %n':
        'PWM 핀 %pwmPin 을 %n 으로 설정하기',

    'Connecting board at port\n':
        '다음 포트의 보드를 연결 중입니다:\n',

    'An Arduino board has been connected. Happy prototyping!':
        '아두이노 보드가 연결되었습니다!',

    'Board was disconnected from port\n':
        '다음 포트에서 보드 연결이 끊겼습니다.:\n',

    'It seems that someone pulled the cable!':
        '케이블이 뽑힌 것 같습니다.',

    'Error connecting the board.':
        '보드 연결에 오류가 발생했습니다.',

    'There is already a board connected to this sprite':
        '이 스프라이트에 이미 연결된 보드가 있습니다.',

    'Could not connect an Arduino\nNo boards found':
        '아두이노에 연결할 수 없습니다.\n아무 보드도 발견되지 않았습니다.',

    'Could not talk to Arduino in port\n':
        '다음 포트의 아두이노와 통신할 수 없습니다:\n',

    'Check if firmata is loaded.':
        'firmata가 로드되었는지 확인하십시오.',

    'An error was detected on the board\n\n':
        '보드에서 오류가 발견되었습니다.\n\n',

    'Board is not connected':
        '보드가 연결되지 않았습니다.',

    'New Arduino translatable project':
        '새로운 아두이노 변환 가능 프로젝트',

    'select a port':
        '포트를 선택하십시오.',

    'Network port':
        '네트워크 포트',

    'Enter hostname or ip address:':
        'hostname이나 ip 주소를 입력하십시오:',

    'Connecting to network port:\n':
        '다음 네트워크 포트에 연결 중입니다:\n',

    'This may take a few seconds...':
        '몇 초가 걸릴 수 있습니다...',

    'Network serial ports':
        '네트워크 시리얼 포트',

    'Open from URL...':
        'URL로부터 열기...',

    'Save, share and get URL...':
        '저장, 공유하고 URL 얻기...',

    'This project is now public at the following URL:':
        '이 프로젝트는 다음 URL로 접근할 수 있습니다:',

    'About Snap4Arduino...':
        'Snap4Arduino에 대해...',

    'Snap4Arduino website':
        'Snap4Arduino 웹사이트',

    'Snap4Arduino repository':
        'Snap4Arduino 레포지터리',

    'Start a Snap Jr. session':
        'Snap Jr. 세션 시작하기',

    'Start Snap4Arduino in an\nicon-based blocks mode\nfor the youngest programmers':
        '어린 프로그래머를 위해,\nSnap4Arduino를 아이콘 기반 블록 모드로 시작합니다.',

    'Loading Snap Jr.':
        'Snap Jr. 로드 중'
};

// Please change the LANG keyword in the lines below by your locale's two-digit code in lowercase,
// like en for English, ca for Catalan, zh for Mandarin or de for German.

// Add attributes to original SnapTranslator.dict.ko
for (var attrname in s4aTempDict) { SnapTranslator.dict.ko[attrname] = s4aTempDict[attrname]; }
<|endoftext|>


<commit_before><commit_msg>button disappears<commit_after><|endoftext|>


<commit_before>import React from 'react';
import { Field } from 'formik';
import { TextField } from 'formik-material-ui';
import { useHtmlInput } from '@wq/react';
import PropTypes from 'prop-types';

export default function Input({ hint, inputProps, ...rest }) {
    const { name, type, maxLength } = useHtmlInput(rest);
    return (
        <Field
            name={name}
            type={type}
            fullWidth
            margin="dense"
            component={TextField}
            helperText={hint}
            inputProps={{ maxLength, ...inputProps }}
            {...rest}
        />
    );
}

Input.propTypes = {
    name: PropTypes.string,
    hint: PropTypes.string,
    inputProps: PropTypes.object
};
<commit_msg>ensure useHtmlInput()'s type is preserved<commit_after>import React from 'react';
import { Field } from 'formik';
import { TextField } from 'formik-material-ui';
import { useHtmlInput } from '@wq/react';
import PropTypes from 'prop-types';

export default function Input({ hint, inputProps, ...rest }) {
    const { name, type, maxLength } = useHtmlInput(rest);
    return (
        <Field
            name={name}
            fullWidth
            margin="dense"
            component={TextField}
            helperText={hint}
            inputProps={{ maxLength, ...inputProps }}
            {...rest}
            type={type}
        />
    );
}

Input.propTypes = {
    name: PropTypes.string,
    hint: PropTypes.string,
    inputProps: PropTypes.object
};
<|endoftext|>


<commit_before><commit_msg>add function to request data from soda api<commit_after><|endoftext|>